@grafana/ui
Version:
Grafana Components Library
1 lines • 12.6 kB
Source Map (JSON)
{"version":3,"file":"CustomHeadersSettings.mjs","sources":["../../../../src/components/DataSourceSettings/CustomHeadersSettings.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { memo, useState } from 'react';\n\nimport { type DataSourceSettings } from '@grafana/data';\nimport { t, Trans } from '@grafana/i18n';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { uniqueId } from '../../utils/uniqueId';\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"],"names":[],"mappings":"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"}