diff --git a/packages/grafana-data/src/types/datasource.ts b/packages/grafana-data/src/types/datasource.ts index e7d4c6a5e80..74a6d8cddc3 100644 --- a/packages/grafana-data/src/types/datasource.ts +++ b/packages/grafana-data/src/types/datasource.ts @@ -279,64 +279,6 @@ export abstract class DataSourceApi< interpolateVariablesInQueries?(queries: TQuery[]): TQuery[]; } -export function updateDatasourcePluginOption(props: DataSourcePluginOptionsEditorProps, key: string, val: any) { - let config = props.options; - - config = { - ...config, - [key]: val, - }; - - props.onOptionsChange(config); -} - -export function updateDatasourcePluginJsonDataOption( - props: DataSourcePluginOptionsEditorProps, - key: string, - val: any, - secure: boolean -) { - let config = props.options; - - if (secure) { - config = { - ...config, - secureJsonData: { - ...config.secureJsonData, - [key]: val, - }, - }; - } else { - config = { - ...config, - jsonData: { - ...config.jsonData, - [key]: val, - }, - }; - } - - props.onOptionsChange(config); -} - -export function updateDatasourcePluginResetKeyOption(props: DataSourcePluginOptionsEditorProps, key: string) { - let config = props.options; - - config = { - ...config, - secureJsonData: { - ...config.secureJsonData, - [key]: '', - }, - secureJsonFields: { - ...config.secureJsonFields, - [key]: false, - }, - }; - - props.onOptionsChange(config); -} - export interface MetadataInspectorProps< DSType extends DataSourceApi, TQuery extends DataQuery = DataQuery, diff --git a/packages/grafana-data/src/utils/datasource.ts b/packages/grafana-data/src/utils/datasource.ts new file mode 100644 index 00000000000..58c55410744 --- /dev/null +++ b/packages/grafana-data/src/utils/datasource.ts @@ -0,0 +1,102 @@ +import { DataSourcePluginOptionsEditorProps, SelectableValue, KeyValue, DataSourceSettings } from '../types'; + +export const onUpdateDatasourceOption = (props: DataSourcePluginOptionsEditorProps, key: keyof DataSourceSettings) => ( + event: React.SyntheticEvent +) => { + updateDatasourcePluginOption(props, key, event.currentTarget.value); +}; + +export const onUpdateDatasourceJsonDataOption = ( + props: DataSourcePluginOptionsEditorProps, + key: K +) => (event: React.SyntheticEvent) => { + updateDatasourcePluginJsonDataOption(props, key, event.currentTarget.value); +}; + +export const onUpdateDatasourceSecureJsonDataOption = ( + props: DataSourcePluginOptionsEditorProps, + key: string +) => (event: React.SyntheticEvent) => { + updateDatasourcePluginSecureJsonDataOption(props, key, event.currentTarget.value); +}; + +export const onUpdateDatasourceJsonDataOptionSelect = ( + props: DataSourcePluginOptionsEditorProps, + key: K +) => (selected: SelectableValue) => { + updateDatasourcePluginJsonDataOption(props, key, selected.value); +}; + +export const onUpdateDatasourceSecureJsonDataOptionSelect = ( + props: DataSourcePluginOptionsEditorProps, + key: string +) => (selected: SelectableValue) => { + updateDatasourcePluginSecureJsonDataOption(props, key, selected.value); +}; + +export const onUpdateDatasourceResetOption = (props: DataSourcePluginOptionsEditorProps, key: string) => ( + event: React.MouseEvent +) => { + updateDatasourcePluginResetOption(props, key); +}; + +export function updateDatasourcePluginOption( + props: DataSourcePluginOptionsEditorProps, + key: keyof DataSourceSettings, + val: any +) { + const config = props.options; + + props.onOptionsChange({ + ...config, + [key]: val, + }); +} + +export const updateDatasourcePluginJsonDataOption = ( + props: DataSourcePluginOptionsEditorProps, + key: K, + val: any +) => { + const config = props.options; + + props.onOptionsChange({ + ...config, + jsonData: { + ...config.jsonData, + [key]: val, + }, + }); +}; + +export const updateDatasourcePluginSecureJsonDataOption = ( + props: DataSourcePluginOptionsEditorProps, + key: string, + val: any +) => { + const config = props.options; + + props.onOptionsChange({ + ...config, + secureJsonData: { + ...config.secureJsonData!, + [key]: val, + }, + }); +}; + +export function updateDatasourcePluginResetOption(props: DataSourcePluginOptionsEditorProps, key: string) { + const config = props.options; + + props.onOptionsChange({ + ...config, + secureJsonData: { + ...config.secureJsonData, + [key]: '', + }, + secureJsonFields: { + ...config.secureJsonFields, + [key]: false, + }, + }); +} diff --git a/packages/grafana-data/src/utils/index.ts b/packages/grafana-data/src/utils/index.ts index e6214739dd4..038bf50635b 100644 --- a/packages/grafana-data/src/utils/index.ts +++ b/packages/grafana-data/src/utils/index.ts @@ -1,4 +1,5 @@ export * from './Registry'; +export * from './datasource'; export * from './deprecationWarning'; export * from './csv'; export * from './logs'; diff --git a/public/app/plugins/datasource/cloudwatch/components/ConfigEditor.tsx b/public/app/plugins/datasource/cloudwatch/components/ConfigEditor.tsx index c7f9d67b71c..748942fd2d4 100644 --- a/public/app/plugins/datasource/cloudwatch/components/ConfigEditor.tsx +++ b/public/app/plugins/datasource/cloudwatch/components/ConfigEditor.tsx @@ -1,10 +1,12 @@ -import React, { PureComponent, ChangeEvent } from 'react'; +import React, { PureComponent } from 'react'; import { FormLabel, Select, Input, Button } from '@grafana/ui'; import { DataSourcePluginOptionsEditorProps, - updateDatasourcePluginJsonDataOption, - updateDatasourcePluginResetKeyOption, - updateDatasourcePluginOption, + onUpdateDatasourceJsonDataOptionSelect, + onUpdateDatasourceOption, + onUpdateDatasourceResetOption, + onUpdateDatasourceJsonDataOption, + onUpdateDatasourceSecureJsonDataOption, } from '@grafana/data'; import { SelectableValue } from '@grafana/data'; import { getDatasourceSrv } from 'app/features/plugins/datasource_srv'; @@ -50,14 +52,6 @@ export class ConfigEditor extends PureComponent { } } - onUpdateOption = (key: string, val: any, secure: boolean) => { - updateDatasourcePluginJsonDataOption(this.props, key, val, secure); - }; - - onResetKey = (key: string) => { - updateDatasourcePluginResetKeyOption(this.props, key); - }; - async loadRegions() { await getDatasourceSrv() .loadDatasource(this.props.options.name) @@ -119,42 +113,6 @@ export class ConfigEditor extends PureComponent { ); } - onAuthProviderChange = (authType: SelectableValue) => { - this.onUpdateOption('authType', authType.value, false); - }; - - onRegionChange = (defaultRegion: SelectableValue) => { - this.onUpdateOption('defaultRegion', defaultRegion.value, false); - }; - - onResetAccessKey = () => { - this.onResetKey('accessKey'); - }; - - onAccessKeyChange = (event: ChangeEvent) => { - this.onUpdateOption('accessKey', event.target.value, true); - }; - - onResetSecretKey = () => { - this.onResetKey('secretKey'); - }; - - onSecretKeyChange = (event: ChangeEvent) => { - this.onUpdateOption('secretKey', event.target.value, true); - }; - - onCredentialProfileNameChange = (event: ChangeEvent) => { - updateDatasourcePluginOption(this.props, 'database', event.target.value); - }; - - onArnAssumeRoleChange = (event: ChangeEvent) => { - this.onUpdateOption('assumeRoleArn', event.target.value, false); - }; - - onCustomMetricsNamespacesChange = (event: ChangeEvent) => { - this.onUpdateOption('customMetricsNamespaces', event.target.value, false); - }; - render() { const { regions } = this.state; const { options } = this.props; @@ -172,7 +130,7 @@ export class ConfigEditor extends PureComponent { value={authProviderOptions.find(authProvider => authProvider.value === options.jsonData.authType)} options={authProviderOptions} defaultValue={options.jsonData.authType} - onChange={this.onAuthProviderChange} + onChange={onUpdateDatasourceJsonDataOptionSelect(this.props, 'authType')} /> @@ -190,7 +148,7 @@ export class ConfigEditor extends PureComponent { className="width-30" placeholder="default" value={options.jsonData.database} - onChange={this.onCredentialProfileNameChange} + onChange={onUpdateDatasourceOption(this.props, 'database')} /> @@ -206,7 +164,11 @@ export class ConfigEditor extends PureComponent {
-
@@ -220,7 +182,7 @@ export class ConfigEditor extends PureComponent {
@@ -234,7 +196,11 @@ export class ConfigEditor extends PureComponent {
-
@@ -248,7 +214,7 @@ export class ConfigEditor extends PureComponent {
@@ -267,7 +233,7 @@ export class ConfigEditor extends PureComponent { className="width-30" placeholder="arn:aws:iam:*" value={options.jsonData.assumeRoleArn || ''} - onChange={this.onArnAssumeRoleChange} + onChange={onUpdateDatasourceJsonDataOption(this.props, 'assumeRoleArn')} /> @@ -286,7 +252,7 @@ export class ConfigEditor extends PureComponent { value={regions.find(region => region.value === options.jsonData.defaultRegion)} options={regions} defaultValue={options.jsonData.defaultRegion} - onChange={this.onRegionChange} + onChange={onUpdateDatasourceJsonDataOptionSelect(this.props, 'defaultRegion')} /> @@ -299,7 +265,7 @@ export class ConfigEditor extends PureComponent { className="width-30" placeholder="Namespace1,Namespace2" value={options.jsonData.customMetricsNamespaces || ''} - onChange={this.onCustomMetricsNamespacesChange} + onChange={onUpdateDatasourceJsonDataOption(this.props, 'customMetricsNamespaces')} /> diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.test.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.test.tsx index f0959695914..f9649abe664 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.test.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.test.tsx @@ -41,6 +41,7 @@ const setup = (propOverrides?: object) => { makeSameAs: jest.fn(), onUpdateOptions: jest.fn(), onUpdateOption: jest.fn(), + onUpdateSecureOption: jest.fn(), onResetOptionKey: jest.fn(), onLoadSubscriptions: jest.fn(), onLoadWorkspaces: jest.fn(), diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.tsx index 05b257f81f1..3ef6188578a 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/AnalyticsConfig.tsx @@ -10,30 +10,31 @@ export interface Props { workspaces: SelectableValue[]; makeSameAs: () => void; onUpdateOptions: (options: AzureDataSourceSettings) => void; - onUpdateOption: (key: string, val: any, secure: boolean) => void; + onUpdateOption: (key: string, val: any) => void; + onUpdateSecureOption: (key: string, val: any) => void; onResetOptionKey: (key: string) => void; onLoadSubscriptions: (type?: string) => void; onLoadWorkspaces: (type?: string) => void; } export class AnalyticsConfig extends PureComponent { onLogAnalyticsTenantIdChange = (event: ChangeEvent) => { - this.props.onUpdateOption('logAnalyticsTenantId', event.target.value, false); + this.props.onUpdateOption('logAnalyticsTenantId', event.target.value); }; onLogAnalyticsClientIdChange = (event: ChangeEvent) => { - this.props.onUpdateOption('logAnalyticsClientId', event.target.value, false); + this.props.onUpdateOption('logAnalyticsClientId', event.target.value); }; onLogAnalyticsClientSecretChange = (event: ChangeEvent) => { - this.props.onUpdateOption('logAnalyticsClientSecret', event.target.value, true); + this.props.onUpdateSecureOption('logAnalyticsClientSecret', event.target.value); }; onLogAnalyticsSubscriptionSelect = (logAnalyticsSubscription: SelectableValue) => { - this.props.onUpdateOption('logAnalyticsSubscriptionId', logAnalyticsSubscription.value, false); + this.props.onUpdateOption('logAnalyticsSubscriptionId', logAnalyticsSubscription.value); }; onWorkspaceSelectChange = (logAnalyticsDefaultWorkspace: SelectableValue) => { - this.props.onUpdateOption('logAnalyticsDefaultWorkspace', logAnalyticsDefaultWorkspace.value, false); + this.props.onUpdateOption('logAnalyticsDefaultWorkspace', logAnalyticsDefaultWorkspace.value); }; onAzureLogAnalyticsSameAsChange = () => { @@ -58,7 +59,7 @@ export class AnalyticsConfig extends PureComponent { }, }); } else { - this.props.onUpdateOption('azureLogAnalyticsSameAs', !options.jsonData.azureLogAnalyticsSameAs, false); + this.props.onUpdateOption('azureLogAnalyticsSameAs', !options.jsonData.azureLogAnalyticsSameAs); } // init popover to warn secret needs to be re-entered diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ConfigEditor.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ConfigEditor.tsx index 66d3f0bcea4..7cb30b1145f 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ConfigEditor.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ConfigEditor.tsx @@ -3,8 +3,9 @@ import { SelectableValue, DataSourcePluginOptionsEditorProps, updateDatasourcePluginOption, - updateDatasourcePluginResetKeyOption, + updateDatasourcePluginResetOption, updateDatasourcePluginJsonDataOption, + updateDatasourcePluginSecureJsonDataOption, } from '@grafana/data'; import { MonitorConfig } from './MonitorConfig'; import { AnalyticsConfig } from './AnalyticsConfig'; @@ -69,12 +70,16 @@ export class ConfigEditor extends PureComponent { } }; - updateOption = (key: string, val: any, secure: boolean) => { - updateDatasourcePluginJsonDataOption(this.props, key, val, secure); + updateOption = (key: keyof AzureDataSourceJsonData, val: any) => { + updateDatasourcePluginJsonDataOption(this.props, key, val); + }; + + updateSecureOption = (key: keyof AzureDataSourceSecureJsonData, val: any) => { + updateDatasourcePluginSecureJsonDataOption(this.props, key, val); }; resetKey = (key: string) => { - updateDatasourcePluginResetKeyOption(this.props, key); + updateDatasourcePluginResetOption(this.props, key); }; makeSameAs = (updatedClientSecret?: string) => { @@ -211,7 +216,7 @@ export class ConfigEditor extends PureComponent { if (subscriptions && subscriptions.length > 0) { this.setState({ subscriptions }); - this.updateOption('subscriptionId', this.props.options.jsonData.subscriptionId || subscriptions[0].value, false); + this.updateOption('subscriptionId', this.props.options.jsonData.subscriptionId || subscriptions[0].value); } if (this.props.options.jsonData.subscriptionId && this.props.options.jsonData.azureLogAnalyticsSameAs) { @@ -232,8 +237,7 @@ export class ConfigEditor extends PureComponent { this.updateOption( 'logAnalyticsSubscriptionId', - this.props.options.jsonData.logAnalyticsSubscriptionId || logAnalyticsSubscriptions[0].value, - false + this.props.options.jsonData.logAnalyticsSubscriptionId || logAnalyticsSubscriptions[0].value ); } @@ -257,8 +261,7 @@ export class ConfigEditor extends PureComponent { this.updateOption( 'logAnalyticsDefaultWorkspace', - this.props.options.jsonData.logAnalyticsDefaultWorkspace || logAnalyticsWorkspaces[0].value, - false + this.props.options.jsonData.logAnalyticsDefaultWorkspace || logAnalyticsWorkspaces[0].value ); } }; @@ -278,6 +281,7 @@ export class ConfigEditor extends PureComponent { makeSameAs={this.makeSameAs} onLoadSubscriptions={this.onLoadSubscriptions} onUpdateOption={this.updateOption} + onUpdateSecureOption={this.updateSecureOption} onResetOptionKey={this.resetKey} /> @@ -288,6 +292,7 @@ export class ConfigEditor extends PureComponent { makeSameAs={this.makeSameAs} onUpdateOptions={this.updateOptions} onUpdateOption={this.updateOption} + onUpdateSecureOption={this.updateSecureOption} onResetOptionKey={this.resetKey} onLoadSubscriptions={this.onLoadSubscriptions} onLoadWorkspaces={this.getWorkspaces} diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MonitorConfig.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MonitorConfig.tsx index 49d6bf67af0..714bf5fddb2 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MonitorConfig.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MonitorConfig.tsx @@ -14,22 +14,23 @@ export interface Props { options: AzureDataSourceSettings; subscriptions: SelectableValue[]; makeSameAs: (updatedClientSecret?: string) => void; - onUpdateOption: (key: string, val: any, secure: boolean) => void; + onUpdateOption: (key: string, val: any) => void; + onUpdateSecureOption: (key: string, val: any) => void; onResetOptionKey: (key: string) => void; onLoadSubscriptions: () => void; } export class MonitorConfig extends PureComponent { onAzureCloudSelect = (cloudName: SelectableValue) => { - this.props.onUpdateOption('cloudName', cloudName.value, false); + this.props.onUpdateOption('cloudName', cloudName.value); }; onTenantIdChange = (event: ChangeEvent) => { - this.props.onUpdateOption('tenantId', event.target.value, false); + this.props.onUpdateOption('tenantId', event.target.value); }; onClientIdChange = (event: ChangeEvent) => { - this.props.onUpdateOption('clientId', event.target.value, false); + this.props.onUpdateOption('clientId', event.target.value); }; onClientSecretChange = (event: ChangeEvent) => { @@ -38,7 +39,7 @@ export class MonitorConfig extends PureComponent { if (options.jsonData.azureLogAnalyticsSameAs && event.target.value) { makeSameAs(event.target.value); } else { - this.props.onUpdateOption('clientSecret', event.target.value, true); + this.props.onUpdateSecureOption('clientSecret', event.target.value); } }; @@ -47,7 +48,7 @@ export class MonitorConfig extends PureComponent { }; onSubscriptionSelect = (subscription: SelectableValue) => { - this.props.onUpdateOption('subscriptionId', subscription.value, false); + this.props.onUpdateOption('subscriptionId', subscription.value); }; render() { diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/ConfigEditor.test.tsx.snap b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/ConfigEditor.test.tsx.snap index 85d51449286..d8072f5bea3 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/ConfigEditor.test.tsx.snap +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/__snapshots__/ConfigEditor.test.tsx.snap @@ -7,6 +7,7 @@ exports[`Render should render component 1`] = ` onLoadSubscriptions={[Function]} onResetOptionKey={[Function]} onUpdateOption={[Function]} + onUpdateSecureOption={[Function]} options={ Object { "access": "proxy", @@ -44,6 +45,7 @@ exports[`Render should render component 1`] = ` onResetOptionKey={[Function]} onUpdateOption={[Function]} onUpdateOptions={[Function]} + onUpdateSecureOption={[Function]} options={ Object { "access": "proxy", diff --git a/public/app/plugins/datasource/influxdb/components/ConfigEditor.tsx b/public/app/plugins/datasource/influxdb/components/ConfigEditor.tsx index a8292c494b7..6ed7510b49f 100644 --- a/public/app/plugins/datasource/influxdb/components/ConfigEditor.tsx +++ b/public/app/plugins/datasource/influxdb/components/ConfigEditor.tsx @@ -1,10 +1,12 @@ -import React, { PureComponent, ChangeEvent } from 'react'; +import React, { PureComponent } from 'react'; import { DataSourcePluginOptionsEditorProps, SelectableValue, - updateDatasourcePluginJsonDataOption, - updateDatasourcePluginResetKeyOption, - updateDatasourcePluginOption, + onUpdateDatasourceOption, + updateDatasourcePluginResetOption, + onUpdateDatasourceJsonDataOption, + onUpdateDatasourceJsonDataOptionSelect, + onUpdateDatasourceSecureJsonDataOption, } from '@grafana/data'; import { DataSourceHttpSettings, FormLabel, Input, SecretFormField, Select } from '@grafana/ui'; import { InfluxOptions, InfluxSecureJsonData } from '../types'; @@ -17,40 +19,8 @@ const httpModes = [ export type Props = DataSourcePluginOptionsEditorProps; export class ConfigEditor extends PureComponent { - onUpdateOption = (key: string, val: any) => { - updateDatasourcePluginOption(this.props, key, val); - }; - - onUpdateJsonDataOption = (key: string, val: any, secure: boolean) => { - updateDatasourcePluginJsonDataOption(this.props, key, val, secure); - }; - - onResetKey = (key: string) => { - updateDatasourcePluginResetKeyOption(this.props, key); - }; - - onDatabaseChange = (event: ChangeEvent) => { - this.onUpdateOption('database', event.target.value); - }; - - onUserChange = (event: ChangeEvent) => { - this.onUpdateOption('user', event.target.value); - }; - - onPasswordChange = (event: ChangeEvent) => { - this.onUpdateJsonDataOption('password', event.target.value, true); - }; - - onTimeIntervalChange = (event: ChangeEvent) => { - this.onUpdateJsonDataOption('timeInterval', event.target.value, false); - }; - onResetPassword = () => { - this.onResetKey('password'); - }; - - onHttpModeSelect = (httpMode: SelectableValue) => { - this.onUpdateJsonDataOption('httpMode', httpMode.value, false); + updateDatasourcePluginResetOption(this.props, 'password'); }; render() { @@ -72,7 +42,11 @@ export class ConfigEditor extends PureComponent {
Database
- +
@@ -80,7 +54,11 @@ export class ConfigEditor extends PureComponent {
User
- +
@@ -93,7 +71,7 @@ export class ConfigEditor extends PureComponent { labelWidth={10} inputWidth={20} onReset={this.onResetPassword} - onChange={this.onPasswordChange} + onChange={onUpdateDatasourceSecureJsonDataOption(this.props, 'password')} /> @@ -112,7 +90,7 @@ export class ConfigEditor extends PureComponent { value={httpModes.find(httpMode => httpMode.value === options.jsonData.httpMode)} options={httpModes} defaultValue={options.jsonData.httpMode} - onChange={this.onHttpModeSelect} + onChange={onUpdateDatasourceJsonDataOptionSelect(this.props, 'httpMode')} /> @@ -145,7 +123,7 @@ export class ConfigEditor extends PureComponent { className="width-10" placeholder="10s" value={options.jsonData.timeInterval || ''} - onChange={this.onTimeIntervalChange} + onChange={onUpdateDatasourceJsonDataOption(this.props, 'timeInterval')} />