{"version":3,"file":"ConnectionLimits.mjs","sources":["../../../../src/components/configuration/ConnectionLimits.tsx"],"sourcesContent":["import { type DataSourceSettings } from '@grafana/data';\nimport { t, Trans } from '@grafana/i18n';\nimport { ConfigSubSection } from '@grafana/plugin-ui';\nimport { config } from '@grafana/runtime';\nimport { Field, Icon, InlineLabel, Label, Stack, Switch, Tooltip } from '@grafana/ui';\n\nimport { type SQLConnectionLimits, type SQLOptions } from '../../types';\n\nimport { MaxLifetimeField } from './MaxLifetimeField';\nimport { MaxOpenConnectionsField } from './MaxOpenConnectionsField';\nimport { NumberInput } from './NumberInput';\n\ninterface Props<T> {\n  onOptionsChange: Function;\n  options: DataSourceSettings<SQLOptions>;\n}\n\nexport const ConnectionLimits = <T extends SQLConnectionLimits>(props: Props<T>) => {\n  const { onOptionsChange, options } = props;\n  const jsonData = options.jsonData;\n  const autoIdle = jsonData.maxIdleConnsAuto !== undefined ? jsonData.maxIdleConnsAuto : false;\n\n  // Update JSON data with new values\n  const updateJsonData = (values: {}) => {\n    const newOpts = {\n      ...options,\n      jsonData: {\n        ...jsonData,\n        ...values,\n      },\n    };\n\n    return onOptionsChange(newOpts);\n  };\n\n  // For the case of idle connections and connection lifetime\n  // use a shared function to update respective properties\n  const onJSONDataNumberChanged = (property: keyof SQLConnectionLimits) => {\n    return (number?: number) => {\n      updateJsonData({ [property]: number });\n    };\n  };\n\n  // When the maximum number of connections is changed\n  // see if we have the automatic idle option enabled\n  const onMaxConnectionsChanged = (number?: number) => {\n    if (autoIdle && number) {\n      updateJsonData({\n        maxOpenConns: number,\n        maxIdleConns: number,\n      });\n    } else {\n      updateJsonData({\n        maxOpenConns: number,\n      });\n    }\n  };\n\n  // Update auto idle setting when control is toggled\n  // and set minimum idle connections if automatic\n  // is selected\n  const onConnectionIdleAutoChanged = () => {\n    let idleConns = undefined;\n    let maxConns = undefined;\n\n    // If the maximum number of open connections is undefined\n    // and we're setting auto idle then set the default amount\n    // otherwise take the numeric amount and get the value from that\n    if (!autoIdle) {\n      if (jsonData.maxOpenConns !== undefined) {\n        maxConns = jsonData.maxOpenConns;\n        idleConns = jsonData.maxOpenConns;\n      }\n    } else {\n      maxConns = jsonData.maxOpenConns;\n      idleConns = jsonData.maxIdleConns;\n    }\n\n    updateJsonData({\n      maxIdleConnsAuto: !autoIdle,\n      maxIdleConns: idleConns,\n      maxOpenConns: maxConns,\n    });\n  };\n\n  const labelWidth = 40;\n\n  return (\n    <ConfigSubSection\n      title={t('grafana-sql.components.connection-limits.title-connection-limits', 'Connection limits')}\n    >\n      <Stack direction=\"column\" gap={2}>\n        <MaxOpenConnectionsField\n          labelWidth={labelWidth}\n          onMaxConnectionsChanged={onMaxConnectionsChanged}\n          jsonData={jsonData}\n        />\n\n        <Field\n          noMargin\n          label={\n            <Label>\n              <Stack gap={0.5}>\n                <span>\n                  <Trans i18nKey=\"grafana-sql.components.connection-limits.auto-max-idle\">Auto max idle</Trans>\n                </span>\n                <Tooltip\n                  content={\n                    <span>\n                      <Trans\n                        i18nKey=\"grafana-sql.components.connection-limits.content-auto-max-idle\"\n                        values={{ defaultMaxIdle: config.sqlConnectionLimits.maxIdleConns }}\n                      >\n                        If enabled, automatically set the number of <i>Maximum idle connections</i> to the same value as\n                        <i> Max open connections</i>. If the number of maximum open connections is not set it will be\n                        set to the default ({'{{defaultMaxIdle}}'}).\n                      </Trans>\n                    </span>\n                  }\n                >\n                  <Icon name=\"info-circle\" size=\"sm\" />\n                </Tooltip>\n              </Stack>\n            </Label>\n          }\n        >\n          <Switch value={autoIdle} onChange={onConnectionIdleAutoChanged} />\n        </Field>\n\n        <Field\n          noMargin\n          label={\n            <Label>\n              <Stack gap={0.5}>\n                <span>\n                  <Trans i18nKey=\"grafana-sql.components.connection-limits.max-idle\">Max idle</Trans>\n                </span>\n                <Tooltip\n                  content={\n                    <span>\n                      <Trans i18nKey=\"grafana-sql.components.connection-limits.content-max-idle\">\n                        The maximum number of connections in the idle connection pool.If <i>Max open connections</i> is\n                        greater than 0 but less than the <i>Max idle connections</i>, then the{' '}\n                        <i>Max idle connections</i> will be reduced to match the <i>Max open connections</i> limit. If\n                        set to 0, no idle connections are retained.\n                      </Trans>\n                    </span>\n                  }\n                >\n                  <Icon name=\"info-circle\" size=\"sm\" />\n                </Tooltip>\n              </Stack>\n            </Label>\n          }\n        >\n          {autoIdle ? (\n            <InlineLabel width={labelWidth}>{options.jsonData.maxIdleConns}</InlineLabel>\n          ) : (\n            <NumberInput\n              value={jsonData.maxIdleConns}\n              defaultValue={config.sqlConnectionLimits.maxIdleConns}\n              onChange={(value) => {\n                onJSONDataNumberChanged('maxIdleConns')(value);\n              }}\n              width={labelWidth}\n            />\n          )}\n        </Field>\n\n        <MaxLifetimeField\n          labelWidth={labelWidth}\n          onMaxLifetimeChanged={onJSONDataNumberChanged('connMaxLifetime')}\n          jsonData={jsonData}\n        />\n      </Stack>\n    </ConfigSubSection>\n  );\n};\n"],"names":[],"mappings":"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"}