{"version":3,"file":"CustomHeadersSettings.cjs","sources":["../../../../src/components/DataSourceSettings/CustomHeadersSettings.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport { memo, useState } from 'react';\n\nimport { DataSourceSettings } from '@grafana/data';\nimport { t, Trans } from '@grafana/i18n';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { Button } from '../Button/Button';\nimport { FormField } from '../FormField/FormField';\nimport { Icon } from '../Icon/Icon';\nimport { Box } from '../Layout/Box/Box';\nimport { Stack } from '../Layout/Stack/Stack';\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\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/i18n/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 const CustomHeadersSettings = memo<Props>(({ dataSourceConfig, onChange }) => {\n  const [headers, setHeaders] = useState<CustomHeaders>(() => {\n    const { jsonData, secureJsonData, secureJsonFields } = dataSourceConfig;\n    return 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  const updateSettings = (newHeaders: CustomHeaders) => {\n    // we remove every httpHeaderName* field\n    const newJsonData = Object.fromEntries(\n      Object.entries(dataSourceConfig.jsonData).filter(([key, val]) => !key.startsWith('httpHeaderName'))\n    );\n\n    // we remove every httpHeaderValue* field\n    const newSecureJsonData = Object.fromEntries(\n      Object.entries(dataSourceConfig.secureJsonData || {}).filter(([key, val]) => !key.startsWith('httpHeaderValue'))\n    );\n\n    // then we add the current httpHeader-fields\n    for (const [index, header] of newHeaders.entries()) {\n      newJsonData[`httpHeaderName${index + 1}`] = header.name;\n      if (!header.configured) {\n        newSecureJsonData[`httpHeaderValue${index + 1}`] = header.value;\n      }\n    }\n\n    onChange({\n      ...dataSourceConfig,\n      jsonData: newJsonData,\n      secureJsonData: newSecureJsonData,\n    });\n  };\n\n  const onHeaderAdd = () => {\n    setHeaders((prevHeaders) => [...prevHeaders, { id: uniqueId(), name: '', value: '', configured: false }]);\n  };\n\n  const onHeaderChange = (headerIndex: number, value: CustomHeader) => {\n    setHeaders((prevHeaders) =>\n      prevHeaders.map((item, index) => {\n        if (headerIndex !== index) {\n          return item;\n        }\n        return { ...value };\n      })\n    );\n  };\n\n  const onHeaderReset = (headerId: string) => {\n    setHeaders((prevHeaders) =>\n      prevHeaders.map((h) => {\n        if (h.id !== headerId) {\n          return h;\n        }\n        return {\n          ...h,\n          value: '',\n          configured: false,\n        };\n      })\n    );\n  };\n\n  const onHeaderRemove = (headerId: string) => {\n    setHeaders((prevHeaders) => {\n      const newHeaders = prevHeaders.filter((h) => h.id !== headerId);\n      updateSettings(newHeaders);\n      return newHeaders;\n    });\n  };\n\n  return (\n    <Box marginBottom={5}>\n      <Box marginBottom={0.5} position=\"relative\">\n        <Stack direction=\"row\" alignItems=\"baseline\">\n          <h6>\n            <Trans i18nKey=\"grafana-ui.data-source-settings.custom-headers-title\">Custom HTTP Headers</Trans>\n          </h6>\n        </Stack>\n      </Box>\n      <div>\n        {headers.map((header, i) => (\n          <CustomHeaderRow\n            key={header.id}\n            header={header}\n            onChange={(h) => {\n              onHeaderChange(i, h);\n            }}\n            onBlur={() => updateSettings(headers)}\n            onRemove={onHeaderRemove}\n            onReset={onHeaderReset}\n          />\n        ))}\n      </div>\n      {!dataSourceConfig.readOnly && (\n        <Box marginBottom={0.5} position=\"relative\">\n          <Stack direction=\"row\" alignItems=\"baseline\">\n            <Button\n              variant=\"secondary\"\n              icon=\"plus\"\n              type=\"button\"\n              onClick={(e) => {\n                onHeaderAdd();\n              }}\n            >\n              <Trans i18nKey=\"grafana-ui.data-source-settings.custom-headers-add\">Add header</Trans>\n            </Button>\n          </Stack>\n        </Box>\n      )}\n    </Box>\n  );\n});\n\nCustomHeadersSettings.displayName = 'CustomHeadersSettings';\n\nexport default CustomHeadersSettings;\n"],"names":["css","useStyles2","jsxs","jsx","FormField","t","SecretFormField","Button","Icon","memo","useState","uniqueId","Box","Stack","Trans"],"mappings":"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"}