{"version":3,"file":"CustomHeadersSettings.mjs","sources":["../../../../src/components/DataSourceSettings/CustomHeadersSettings.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport { PureComponent } from 'react';\n\nimport { DataSourceSettings } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\nimport { t, Trans } from '../../utils/i18n';\nimport { Button } from '../Button';\nimport { FormField } from '../FormField/FormField';\nimport { Icon } from '../Icon/Icon';\nimport { SecretFormField } from '../SecretFormField/SecretFormField';\n\nexport interface CustomHeader {\n  id: string;\n  name: string;\n  value: string;\n  configured: boolean;\n}\n\nexport type CustomHeaders = CustomHeader[];\n\nexport interface Props {\n  dataSourceConfig: DataSourceSettings<any, any>;\n  onChange: (config: DataSourceSettings) => void;\n}\n\nexport interface State {\n  headers: CustomHeaders;\n}\n\ninterface CustomHeaderRowProps {\n  header: CustomHeader;\n  onReset: (id: string) => void;\n  onRemove: (id: string) => void;\n  onChange: (value: CustomHeader) => void;\n  onBlur: () => void;\n}\n\nconst getCustomHeaderRowStyles = () => ({\n  layout: css({\n    display: 'flex',\n    alignItems: 'center',\n    marginBottom: '4px',\n    '> *': {\n      marginLeft: '4px',\n      marginBottom: 0,\n      height: '100%',\n      '&:first-child, &:last-child': {\n        marginLeft: 0,\n      },\n    },\n  }),\n});\n\nconst CustomHeaderRow = ({ header, onBlur, onChange, onRemove, onReset }: CustomHeaderRowProps) => {\n  const styles = useStyles2(getCustomHeaderRowStyles);\n\n  return (\n    <div className={styles.layout}>\n      <FormField\n        label={t('grafana-ui.data-source-settings.custom-headers-header', 'Header')}\n        name=\"name\"\n        // eslint-disable-next-line @grafana/no-untranslated-strings\n        placeholder=\"X-Custom-Header\"\n        labelWidth={5}\n        value={header.name || ''}\n        onChange={(e) => onChange({ ...header, name: e.target.value })}\n        onBlur={onBlur}\n      />\n      <SecretFormField\n        label={t('grafana-ui.data-source-settings.custom-headers-header-value', 'Value')}\n        aria-label={t('grafana-ui.data-source-settings.custom-headers-header-value', 'Value')}\n        name=\"value\"\n        isConfigured={header.configured}\n        value={header.value}\n        labelWidth={5}\n        inputWidth={header.configured ? 11 : 12}\n        placeholder={t('grafana-ui.data-source-settings.custom-headers-header-placeholder', 'Header Value')}\n        onReset={() => onReset(header.id)}\n        onChange={(e) => onChange({ ...header, value: e.target.value })}\n        onBlur={onBlur}\n      />\n      <Button\n        type=\"button\"\n        aria-label={t('grafana-ui.data-source-settings.custom-headers-header-remove', 'Remove header')}\n        variant=\"secondary\"\n        size=\"xs\"\n        onClick={(_e) => onRemove(header.id)}\n      >\n        <Icon name=\"trash-alt\" />\n      </Button>\n    </div>\n  );\n};\n\nCustomHeaderRow.displayName = 'CustomHeaderRow';\n\nexport class CustomHeadersSettings extends PureComponent<Props, State> {\n  state: State = {\n    headers: [],\n  };\n\n  constructor(props: Props) {\n    super(props);\n    const { jsonData, secureJsonData, secureJsonFields } = this.props.dataSourceConfig;\n    this.state = {\n      headers: Object.keys(jsonData)\n        .sort()\n        .filter((key) => key.startsWith('httpHeaderName'))\n        .map((key, index) => {\n          return {\n            id: uniqueId(),\n            name: jsonData[key],\n            value: secureJsonData !== undefined ? secureJsonData[key] : '',\n            configured: (secureJsonFields && secureJsonFields[`httpHeaderValue${index + 1}`]) || false,\n          };\n        }),\n    };\n  }\n\n  updateSettings = () => {\n    const { headers } = this.state;\n\n    // we remove every httpHeaderName* field\n    const newJsonData = Object.fromEntries(\n      Object.entries(this.props.dataSourceConfig.jsonData).filter(([key, val]) => !key.startsWith('httpHeaderName'))\n    );\n\n    // we remove every httpHeaderValue* field\n    const newSecureJsonData = Object.fromEntries(\n      Object.entries(this.props.dataSourceConfig.secureJsonData || {}).filter(\n        ([key, val]) => !key.startsWith('httpHeaderValue')\n      )\n    );\n\n    // then we add the current httpHeader-fields\n    for (const [index, header] of headers.entries()) {\n      newJsonData[`httpHeaderName${index + 1}`] = header.name;\n      if (!header.configured) {\n        newSecureJsonData[`httpHeaderValue${index + 1}`] = header.value;\n      }\n    }\n\n    this.props.onChange({\n      ...this.props.dataSourceConfig,\n      jsonData: newJsonData,\n      secureJsonData: newSecureJsonData,\n    });\n  };\n\n  onHeaderAdd = () => {\n    this.setState((prevState) => {\n      return { headers: [...prevState.headers, { id: uniqueId(), name: '', value: '', configured: false }] };\n    });\n  };\n\n  onHeaderChange = (headerIndex: number, value: CustomHeader) => {\n    this.setState(({ headers }) => {\n      return {\n        headers: headers.map((item, index) => {\n          if (headerIndex !== index) {\n            return item;\n          }\n          return { ...value };\n        }),\n      };\n    });\n  };\n\n  onHeaderReset = (headerId: string) => {\n    this.setState(({ headers }) => {\n      return {\n        headers: headers.map((h, i) => {\n          if (h.id !== headerId) {\n            return h;\n          }\n          return {\n            ...h,\n            value: '',\n            configured: false,\n          };\n        }),\n      };\n    });\n  };\n\n  onHeaderRemove = (headerId: string) => {\n    this.setState(\n      ({ headers }) => ({\n        headers: headers.filter((h) => h.id !== headerId),\n      }),\n      this.updateSettings\n    );\n  };\n\n  render() {\n    const { headers } = this.state;\n    const { dataSourceConfig } = this.props;\n\n    return (\n      <div className={'gf-form-group'}>\n        <div className=\"gf-form\">\n          <h6>\n            <Trans i18nKey=\"grafana-ui.data-source-settings.custom-headers-title\">Custom HTTP Headers</Trans>\n          </h6>\n        </div>\n        <div>\n          {headers.map((header, i) => (\n            <CustomHeaderRow\n              key={header.id}\n              header={header}\n              onChange={(h) => {\n                this.onHeaderChange(i, h);\n              }}\n              onBlur={this.updateSettings}\n              onRemove={this.onHeaderRemove}\n              onReset={this.onHeaderReset}\n            />\n          ))}\n        </div>\n        {!dataSourceConfig.readOnly && (\n          <div className=\"gf-form\">\n            <Button\n              variant=\"secondary\"\n              icon=\"plus\"\n              type=\"button\"\n              onClick={(e) => {\n                this.onHeaderAdd();\n              }}\n            >\n              <Trans i18nKey=\"grafana-ui.data-source-settings.custom-headers-add\">Add header</Trans>\n            </Button>\n          </div>\n        )}\n      </div>\n    );\n  }\n}\n\nexport default CustomHeadersSettings;\n"],"names":[],"mappings":"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"}