{"version":3,"file":"SelectCustomFunctionParameters.mjs","sources":["../../../../src/components/visual-query-builder/SelectCustomFunctionParameters.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { useCallback } from 'react';\n\nimport { type SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t } from '@grafana/i18n';\nimport { Button, InlineLabel, Input, Stack, useStyles2 } from '@grafana/ui';\n\nimport { QueryEditorExpressionType } from '../../expressions';\nimport { type SQLExpression, type SQLQuery } from '../../types';\nimport { getColumnValue } from '../../utils/sql.utils';\n\nimport { SelectColumn } from './SelectColumn';\n\ninterface Props {\n  columns: Array<SelectableValue<string>>;\n  query: SQLQuery;\n  onSqlChange: (sql: SQLExpression) => void;\n  onParameterChange: (index: number) => (value?: string) => void;\n  currentColumnIndex: number;\n}\n\nexport function SelectCustomFunctionParameters({\n  columns,\n  query,\n  onSqlChange,\n  onParameterChange,\n  currentColumnIndex,\n}: Props) {\n  const styles = useStyles2(getStyles);\n  const macroOrFunction = query.sql?.columns?.[currentColumnIndex];\n\n  const addParameter = useCallback(\n    (index: number) => {\n      const item = query.sql?.columns?.[index];\n      if (!item) {\n        return;\n      }\n\n      item.parameters = item.parameters\n        ? [...item.parameters, { type: QueryEditorExpressionType.FunctionParameter, name: '' }]\n        : [];\n\n      const newSql: SQLExpression = {\n        ...query.sql,\n        columns: query.sql?.columns?.map((c, i) => (i === index ? item : c)),\n      };\n\n      onSqlChange(newSql);\n    },\n    [onSqlChange, query.sql]\n  );\n\n  const removeParameter = useCallback(\n    (columnIndex: number, index: number) => {\n      const item = query.sql?.columns?.[columnIndex];\n      if (!item?.parameters) {\n        return;\n      }\n      item.parameters = item.parameters?.filter((_, i) => i !== index);\n\n      const newSql: SQLExpression = {\n        ...query.sql,\n        columns: query.sql?.columns?.map((c, i) => (i === columnIndex ? item : c)),\n      };\n\n      onSqlChange(newSql);\n    },\n    [onSqlChange, query.sql]\n  );\n\n  function renderParameters(columnIndex: number) {\n    if (!macroOrFunction?.parameters || macroOrFunction.parameters.length <= 1) {\n      return null;\n    }\n\n    const paramComponents = macroOrFunction.parameters.map((param, index) => {\n      // Skip the first parameter as it is the column name\n      if (index === 0) {\n        return null;\n      }\n\n      return (\n        <Stack key={index} gap={2}>\n          <InlineLabel className={styles.label}>,</InlineLabel>\n          <Input\n            onChange={(e) => onParameterChange(index)(e.currentTarget.value)}\n            value={param.name}\n            aria-label={t(\n              'grafana-sql.components.select-custom-function-parameters.aria-label-parameter',\n              'Parameter {{index}} for column {{columnIndex}}',\n              { index, columnIndex }\n            )}\n            data-testid={selectors.components.SQLQueryEditor.selectInputParameter}\n            addonAfter={\n              <Button\n                aria-label={t(\n                  'grafana-sql.components.select-custom-function-parameters.render-parameters.params.title-remove-parameter',\n                  'Remove parameter'\n                )}\n                type=\"button\"\n                icon=\"times\"\n                variant=\"secondary\"\n                size=\"md\"\n                onClick={() => removeParameter(columnIndex, index)}\n              />\n            }\n          />\n        </Stack>\n      );\n    });\n    return paramComponents;\n  }\n\n  return (\n    <>\n      <InlineLabel className={styles.label}>(</InlineLabel>\n      <SelectColumn\n        columns={columns}\n        onParameterChange={(s) => onParameterChange(0)(s)}\n        value={getColumnValue(macroOrFunction?.parameters?.[0])}\n      />\n      {renderParameters(currentColumnIndex)}\n      <Button\n        type=\"button\"\n        onClick={() => addParameter(currentColumnIndex)}\n        variant=\"secondary\"\n        size=\"md\"\n        icon=\"plus\"\n        aria-label={t('grafana-sql.components.select-custom-function-parameters.title-add-parameter', 'Add parameter')}\n      />\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":";;;;;;;;;;;AAsBO,SAAS,8BAAA,CAA+B;AAAA,EAC7C,OAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAAU;AA5BV,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA6BE,EAAA,MAAM,MAAA,GAAS,WAAW,SAAS,CAAA;AACnC,EAAA,MAAM,eAAA,GAAA,CAAkB,EAAA,GAAA,CAAA,EAAA,GAAA,KAAA,CAAM,GAAA,KAAN,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAW,YAAX,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAqB,kBAAA,CAAA;AAE7C,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,KAAA,KAAkB;AAjCvB,MAAA,IAAAA,GAAAA,EAAAC,KAAAC,GAAAA,EAAA,EAAA;AAkCM,MAAA,MAAM,IAAA,GAAA,CAAOD,OAAAD,GAAAA,GAAA,KAAA,CAAM,QAAN,IAAA,GAAA,KAAA,CAAA,GAAAA,GAAAA,CAAW,OAAA,KAAX,IAAA,GAAA,KAAA,CAAA,GAAAC,GAAAA,CAAqB,KAAA,CAAA;AAClC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,UAAA,GACnB,CAAC,GAAG,IAAA,CAAK,UAAA,EAAY,EAAE,IAAA,EAAM,0BAA0B,iBAAA,EAAmB,IAAA,EAAM,EAAA,EAAI,IACpF,EAAC;AAEL,MAAA,MAAM,MAAA,GAAwB;AAAA,QAC5B,GAAG,KAAA,CAAM,GAAA;AAAA,QACT,OAAA,EAAA,CAAS,EAAA,GAAA,CAAAC,GAAAA,GAAA,KAAA,CAAM,QAAN,IAAA,GAAA,KAAA,CAAA,GAAAA,GAAAA,CAAW,OAAA,KAAX,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAoB,IAAI,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,KAAM,QAAQ,IAAA,GAAO,CAAA;AAAA,OACnE;AAEA,MAAA,WAAA,CAAY,MAAM,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,KAAA,CAAM,GAAG;AAAA,GACzB;AAEA,EAAA,MAAM,eAAA,GAAkB,WAAA;AAAA,IACtB,CAAC,aAAqB,KAAA,KAAkB;AAtD5C,MAAA,IAAAF,GAAAA,EAAAC,KAAAC,GAAAA,EAAA,EAAA,EAAA,EAAA;AAuDM,MAAA,MAAM,IAAA,GAAA,CAAOD,OAAAD,GAAAA,GAAA,KAAA,CAAM,QAAN,IAAA,GAAA,KAAA,CAAA,GAAAA,GAAAA,CAAW,OAAA,KAAX,IAAA,GAAA,KAAA,CAAA,GAAAC,GAAAA,CAAqB,WAAA,CAAA;AAClC,MAAA,IAAI,EAAC,6BAAM,UAAA,CAAA,EAAY;AACrB,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,UAAA,GAAA,CAAaC,GAAAA,GAAA,IAAA,CAAK,UAAA,KAAL,IAAA,GAAA,KAAA,CAAA,GAAAA,IAAiB,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,KAAA,CAAA;AAE1D,MAAA,MAAM,MAAA,GAAwB;AAAA,QAC5B,GAAG,KAAA,CAAM,GAAA;AAAA,QACT,OAAA,EAAA,CAAS,EAAA,GAAA,CAAA,EAAA,GAAA,KAAA,CAAM,GAAA,KAAN,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAW,OAAA,KAAX,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAoB,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,KAAM,WAAA,GAAc,IAAA,GAAO,CAAA;AAAA,OACzE;AAEA,MAAA,WAAA,CAAY,MAAM,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,KAAA,CAAM,GAAG;AAAA,GACzB;AAEA,EAAA,SAAS,iBAAiB,WAAA,EAAqB;AAC7C,IAAA,IAAI,EAAC,eAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,eAAA,CAAiB,UAAA,CAAA,IAAc,eAAA,CAAgB,UAAA,CAAW,UAAU,CAAA,EAAG;AAC1E,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,kBAAkB,eAAA,CAAgB,UAAA,CAAW,GAAA,CAAI,CAAC,OAAO,KAAA,KAAU;AAEvE,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAkB,GAAA,EAAK,CAAA,EACtB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAW,MAAA,CAAO,KAAA,EAAO,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,wBACvC,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,CAAC,CAAA,KAAM,iBAAA,CAAkB,KAAK,CAAA,CAAE,CAAA,CAAE,cAAc,KAAK,CAAA;AAAA,YAC/D,OAAO,KAAA,CAAM,IAAA;AAAA,YACb,YAAA,EAAY,CAAA;AAAA,cACV,+EAAA;AAAA,cACA,gDAAA;AAAA,cACA,EAAE,OAAO,WAAA;AAAY,aACvB;AAAA,YACA,aAAA,EAAa,SAAA,CAAU,UAAA,CAAW,cAAA,CAAe,oBAAA;AAAA,YACjD,UAAA,kBACE,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,YAAA,EAAY,CAAA;AAAA,kBACV,0GAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBACA,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,OAAA;AAAA,gBACL,OAAA,EAAQ,WAAA;AAAA,gBACR,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAS,MAAM,eAAA,CAAgB,WAAA,EAAa,KAAK;AAAA;AAAA;AACnD;AAAA;AAEJ,OAAA,EAAA,EAxBU,KAyBZ,CAAA;AAAA,IAEJ,CAAC,CAAA;AACD,IAAA,OAAO,eAAA;AAAA,EACT;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAW,MAAA,CAAO,KAAA,EAAO,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,oBACvC,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,mBAAmB,CAAC,CAAA,KAAM,iBAAA,CAAkB,CAAC,EAAE,CAAC,CAAA;AAAA,QAChD,KAAA,EAAO,cAAA,CAAA,CAAe,EAAA,GAAA,eAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,eAAA,CAAiB,UAAA,KAAjB,mBAA8B,CAAA,CAAE;AAAA;AAAA,KACxD;AAAA,IACC,iBAAiB,kBAAkB,CAAA;AAAA,oBACpC,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,YAAA,CAAa,kBAAkB,CAAA;AAAA,QAC9C,OAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,IAAA,EAAK,MAAA;AAAA,QACL,YAAA,EAAY,CAAA,CAAE,8EAAA,EAAgF,eAAe;AAAA;AAAA,KAC/G;AAAA,oBACA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAW,MAAA,CAAO,OAAO,QAAA,EAAA,GAAA,EAAC;AAAA,GAAA,EACzC,CAAA;AAEJ;AAEA,MAAM,YAAY,MAAM;AACtB,EAAA,OAAO;AAAA,IACL,OAAO,GAAA,CAAI;AAAA,MACT,OAAA,EAAS,CAAA;AAAA,MACT,MAAA,EAAQ,CAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACR;AAAA,GACH;AACF,CAAA;;;;"}