{"version":3,"file":"SelectFunctionParameters.mjs","sources":["../../../../src/components/visual-query-builder/SelectFunctionParameters.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { useCallback, useEffect, useId, useState } from 'react';\n\nimport { type SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { EditorField } from '@grafana/plugin-ui';\nimport { InlineLabel, Input, Select, Stack, useStyles2 } from '@grafana/ui';\n\nimport { QueryEditorExpressionType } from '../../expressions';\nimport { type DB, type SQLExpression, type SQLQuery } from '../../types';\nimport { getColumnValue } from '../../utils/sql.utils';\n\nimport { SelectColumn } from './SelectColumn';\nimport { SelectCustomFunctionParameters } from './SelectCustomFunctionParameters';\n\ninterface Props {\n  query: SQLQuery;\n  onSqlChange: (sql: SQLExpression) => void;\n  currentColumnIndex: number;\n  db: DB;\n  columns: Array<SelectableValue<string>>;\n}\n\nexport function SelectFunctionParameters({ query, onSqlChange, currentColumnIndex, db, columns }: Props) {\n  const selectInputId = useId();\n  const macroOrFunction = query.sql?.columns?.[currentColumnIndex];\n  const styles = useStyles2(getStyles);\n  const func = db.functions().find((f) => f.name === macroOrFunction?.name);\n\n  const [fieldsFromFunction, setFieldsFromFunction] = useState<Array<Array<SelectableValue<string>>>>([]);\n\n  useEffect(() => {\n    const getFieldsFromFunction = async () => {\n      if (!func) {\n        return;\n      }\n      const options: Array<Array<SelectableValue<string>>> = [];\n      for (const param of func.parameters ?? []) {\n        if (param.options) {\n          options.push(await param.options(query));\n        } else {\n          options.push([]);\n        }\n      }\n      setFieldsFromFunction(options);\n    };\n    getFieldsFromFunction();\n\n    // It is fine to ignore the warning here and omit the query object\n    // only table property is used in the query object and whenever table changes the component is re-rendered\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [macroOrFunction?.name]);\n\n  const onParameterChange = useCallback(\n    (index: number, keepIndex?: boolean) => (s: string | undefined) => {\n      const item = query.sql?.columns?.[currentColumnIndex];\n      if (!item) {\n        return;\n      }\n      if (!item.parameters) {\n        item.parameters = [];\n      }\n      if (item.parameters[index] === undefined) {\n        item.parameters[index] = { type: QueryEditorExpressionType.FunctionParameter, name: s };\n      } else if (s == null && keepIndex) {\n        // Remove value from index\n        item.parameters = item.parameters.map((p, i) => (i === index ? { ...p, name: '' } : p));\n        // Remove the last empty parameter\n        if (item.parameters[item.parameters.length - 1]?.name === '') {\n          item.parameters = item.parameters.filter((p) => p.name !== '');\n        }\n      } else if (s == null) {\n        item.parameters = item.parameters.filter((_, i) => i !== index);\n      } else {\n        item.parameters = item.parameters.map((p, i) => (i === index ? { ...p, name: s } : p));\n      }\n\n      const newSql: SQLExpression = {\n        ...query.sql,\n        columns: query.sql?.columns?.map((c, i) => (i === currentColumnIndex ? item : c)),\n      };\n\n      onSqlChange(newSql);\n    },\n    [currentColumnIndex, onSqlChange, query.sql]\n  );\n\n  function renderParametersWithFunctions() {\n    if (!func?.parameters) {\n      return null;\n    }\n\n    return func?.parameters.map((funcParam, index) => {\n      return (\n        <Stack key={index} alignItems=\"flex-end\" gap={2}>\n          <EditorField label={funcParam.name} width={25} optional={!funcParam.required}>\n            <>\n              {funcParam.options ? (\n                <Select\n                  value={getColumnValue(macroOrFunction?.parameters![index])}\n                  options={fieldsFromFunction?.[index]}\n                  data-testid={selectors.components.SQLQueryEditor.selectFunctionParameter(funcParam.name)}\n                  inputId={selectInputId}\n                  menuShouldPortal\n                  allowCustomValue\n                  isClearable\n                  onChange={(s) => onParameterChange(index, true)(s?.value)}\n                />\n              ) : (\n                <Input\n                  onChange={(e) => onParameterChange(index, true)(e.currentTarget.value)}\n                  value={macroOrFunction?.parameters![index]?.name}\n                  data-testid={selectors.components.SQLQueryEditor.selectInputParameter}\n                />\n              )}\n            </>\n          </EditorField>\n          {func.parameters!.length !== index + 1 && <InlineLabel className={styles.label}>,</InlineLabel>}\n        </Stack>\n      );\n    });\n  }\n\n  // This means that no function is selected, we render a column selector\n  if (macroOrFunction?.name === undefined) {\n    return (\n      <SelectColumn\n        columns={columns}\n        onParameterChange={(s) => onParameterChange(0)(s)}\n        value={getColumnValue(macroOrFunction?.parameters?.[0])}\n      />\n    );\n  }\n\n  // If the function is not found, that means that it might be a custom value\n  // we let the user add any number of parameters\n  if (!func) {\n    return (\n      <SelectCustomFunctionParameters\n        query={query}\n        onSqlChange={onSqlChange}\n        currentColumnIndex={currentColumnIndex}\n        columns={columns}\n        onParameterChange={onParameterChange}\n      />\n    );\n  }\n\n  // Else we render the function parameters based on the provided settings\n  return (\n    <>\n      <InlineLabel className={styles.label}>(</InlineLabel>\n      {renderParametersWithFunctions()}\n      <InlineLabel className={styles.label}>)</InlineLabel>\n    </>\n  );\n}\n\nconst getStyles = () => {\n  return {\n    label: css({\n      padding: 0,\n      margin: 0,\n      width: 'unset',\n    }),\n  };\n};\n"],"names":["_a","_b","_c"],"mappings":"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"}