import React, { PureComponent } from 'react'; import { DataSourcePluginOptionsEditorProps, SelectableValue, updateDatasourcePluginOption } from '@grafana/data'; import { getBackendSrv, getTemplateSrv, isFetchError, TemplateSrv } from '@grafana/runtime'; import { Alert } from '@grafana/ui'; import ResponseParser from '../azure_monitor/response_parser'; import { AzureDataSourceJsonData, AzureDataSourceSecureJsonData, AzureDataSourceSettings } from '../types'; import { routeNames } from '../utils/common'; import { MonitorConfig } from './MonitorConfig'; export type Props = DataSourcePluginOptionsEditorProps; interface ErrorMessage { title: string; description: string; details?: string; } export interface State { unsaved: boolean; error?: ErrorMessage; } export class ConfigEditor extends PureComponent { templateSrv: TemplateSrv = getTemplateSrv(); baseURL: string; constructor(props: Props) { super(props); this.state = { unsaved: false, }; this.baseURL = `/api/datasources/${this.props.options.id}/resources/${routeNames.azureMonitor}/subscriptions`; } private updateOptions = (optionsFunc: (options: AzureDataSourceSettings) => AzureDataSourceSettings): void => { const updated = optionsFunc(this.props.options); this.props.onOptionsChange(updated); this.setState({ unsaved: true }); }; private saveOptions = async (): Promise => { if (this.state.unsaved) { await getBackendSrv() .put(`/api/datasources/${this.props.options.id}`, this.props.options) .then((result: { datasource: AzureDataSourceSettings }) => { updateDatasourcePluginOption(this.props, 'version', result.datasource.version); }); this.setState({ unsaved: false }); } }; private getSubscriptions = async (): Promise>> => { await this.saveOptions(); const query = `?api-version=2019-03-01`; try { const result = await getBackendSrv() .fetch({ url: this.baseURL + query, method: 'GET', }) .toPromise(); this.setState({ error: undefined }); return ResponseParser.parseSubscriptionsForSelect(result); } catch (err) { if (isFetchError(err)) { this.setState({ error: { title: 'Error requesting subscriptions', description: 'Could not request subscriptions from Azure. Check your credentials and try again.', details: err?.data?.message, }, }); } return Promise.resolve([]); } }; render() { const { options } = this.props; const { error } = this.state; return ( <> {error && (

{error.description}

{error.details &&
{error.details}
}
)} ); } } export default ConfigEditor;