diff --git a/src/ui/ConfigEditor.tsx b/src/ui/ConfigEditor.tsx index 71687257..89fad84d 100644 --- a/src/ui/ConfigEditor.tsx +++ b/src/ui/ConfigEditor.tsx @@ -1,6 +1,6 @@ import { DataSourcePluginOptionsEditorProps, SelectableValue } from '@grafana/data'; import { Alert, FieldSet, InlineField, LegacyForms, Select } from '@grafana/ui'; -import React, { ChangeEvent, PureComponent } from 'react'; +import React, { ChangeEvent, useCallback } from 'react'; import { Backend, DataSourceOptions, Edition, SecureJsonData } from '../types'; @@ -9,61 +9,88 @@ const { SecretFormField, FormField } = LegacyForms; // eslint-disable-next-line @typescript-eslint/no-empty-interface interface Props extends DataSourcePluginOptionsEditorProps {} -// eslint-disable-next-line @typescript-eslint/no-empty-interface -interface State {} - -export class ConfigEditor extends PureComponent { - onUrlChange = (event: ChangeEvent): void => { - const { onOptionsChange, options } = this.props; - const jsonData = { - ...options.jsonData, - url: event.target.value, - }; - onOptionsChange({ ...options, jsonData }); - }; - - onEditionChange = ({ value }: SelectableValue): void => { - const { onOptionsChange, options } = this.props; - const jsonData = { - ...options.jsonData, - edition: value, - }; - onOptionsChange({ ...options, jsonData }); - }; - - onBackendChange = ({ value }: SelectableValue): void => { - const { onOptionsChange, options } = this.props; - onOptionsChange({ - ...options, - jsonData: { +interface EditionOption { + value: Edition; + label: string; +} + +const cmkEditions: EditionOption[] = [ + { value: 'CEE', label: 'Commercial editions' }, + { value: 'RAW', label: 'Raw Edition' }, +]; + +const cmkBackends: Array> = [ + { value: 'rest', label: '>= 2.2' }, + { value: 'web', label: '< 2.2' }, +]; + +export const ConfigEditor = (props: Props) => { + const onUrlChange = useCallback( + (event: ChangeEvent): void => { + const { onOptionsChange, options } = props; + const jsonData = { ...options.jsonData, - backend: value, - }, - }); - }; + url: event.target.value, + }; + onOptionsChange({ ...options, jsonData }); + }, + [props] + ); + + const onEditionChange = useCallback( + ({ value }: SelectableValue): void => { + const { onOptionsChange, options } = props; + const jsonData = { + ...options.jsonData, + edition: value, + }; + onOptionsChange({ ...options, jsonData }); + }, + [props] + ); + + const onBackendChange = useCallback( + ({ value }: SelectableValue): void => { + const { onOptionsChange, options } = props; + onOptionsChange({ + ...options, + jsonData: { + ...options.jsonData, + backend: value, + }, + }); + }, + [props] + ); - onUsernameChange = (event: ChangeEvent): void => { - const { onOptionsChange, options } = this.props; - const jsonData = { - ...options.jsonData, - username: event.target.value, - }; - onOptionsChange({ ...options, jsonData }); - }; + const onUsernameChange = useCallback( + (event: ChangeEvent): void => { + const { onOptionsChange, options } = props; + const jsonData = { + ...options.jsonData, + username: event.target.value, + }; + onOptionsChange({ ...options, jsonData }); + }, + [props] + ); // Secure field (only sent to the backend) - onSecretChange = (event: ChangeEvent): void => { - const { onOptionsChange, options } = this.props; - onOptionsChange({ - ...options, - secureJsonData: { - secret: event.target.value, - }, - }); - }; + const onSecretChange = useCallback( + (event: ChangeEvent): void => { + const { onOptionsChange, options } = props; + onOptionsChange({ + ...options, + secureJsonData: { + secret: event.target.value, + }, + }); + }, + [props] + ); - onResetSecret = (): void => { - const { onOptionsChange, options } = this.props; + const onResetSecret = useCallback((): void => { + const { onOptionsChange, options } = props; onOptionsChange({ ...options, secureJsonFields: { @@ -75,114 +102,101 @@ export class ConfigEditor extends PureComponent { secret: '', }, }); - }; - - render(): JSX.Element { - const { options } = this.props; - const { jsonData, secureJsonFields } = options; - const secureJsonData = options.secureJsonData || {}; - interface EditionOption { - value: Edition; - label: string; - } - - const cmkEditions: EditionOption[] = [ - { value: 'CEE', label: 'Commercial editions' }, - { value: 'RAW', label: 'Raw Edition' }, - ]; - if (!jsonData.edition) { - this.onEditionChange(cmkEditions[0]); - } - const cmkBackends: Array> = [ - { value: 'rest', label: '>= 2.2' }, - { value: 'web', label: '< 2.2' }, - ]; - if (!jsonData.backend) { - this.onBackendChange(cmkBackends[0]); - } - - return ( - <> -
-
- -
- {process.env.BUILD_EDITION !== 'CLOUD' ? ( - <> - - - - {jsonData.backend === 'web' && ( - - Note that versions older than 2.1.0 are not officially supported: -
    -
  • - Version 2.0.0 may work, but not all features are available.
  • -
  • - Version 1.6.0 and earlier will not work at all.
  • -
-
- )} - - ) : ( - <> - )} -
-
-
- -
-
- -
-
- - ); + }, [props]); + + const { options } = props; + const { jsonData, secureJsonFields } = options; + const secureJsonData = options.secureJsonData || {}; + + if (!jsonData.edition) { + onEditionChange(cmkEditions[0]); } -} + + if (!jsonData.backend) { + onBackendChange(cmkBackends[0]); + } + + return ( + <> +
+
+ +
+ {process.env.BUILD_EDITION !== 'CLOUD' ? ( + <> + + + + {jsonData.backend === 'web' && ( + + Note that versions older than 2.1.0 are not officially supported: +
    +
  • - Version 2.0.0 may work, but not all features are available.
  • +
  • - Version 1.6.0 and earlier will not work at all.
  • +
+
+ )} + + ) : ( + <> + )} +
+
+
+ +
+
+ +
+
+ + ); +};