{"version":3,"file":"QueryEditor.mjs","sources":["../../../src/components/QueryEditor.tsx"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { type QueryEditorProps } from '@grafana/data';\nimport { EditorMode } from '@grafana/plugin-ui';\nimport { Space } from '@grafana/ui';\n\nimport { type SqlDatasource } from '../datasource/SqlDatasource';\nimport { applyQueryDefaults } from '../defaults';\nimport { type SQLQuery, type QueryRowFilter, type SQLOptions } from '../types';\nimport { haveColumns } from '../utils/sql.utils';\n\nimport { QueryHeader, type QueryHeaderProps } from './QueryHeader';\nimport { RawEditor } from './query-editor-raw/RawEditor';\nimport { VisualEditor } from './visual-query-builder/VisualEditor';\n\nexport interface SqlQueryEditorProps extends QueryEditorProps<SqlDatasource, SQLQuery, SQLOptions> {\n  queryHeaderProps?: Pick<QueryHeaderProps, 'dialect' | 'hideRunButton' | 'hideFormatSelector'>;\n}\n\nexport default function SqlQueryEditor({\n  datasource,\n  query,\n  onChange,\n  onRunQuery,\n  range,\n  app,\n  queryHeaderProps,\n}: SqlQueryEditorProps) {\n  const [isQueryRunnable, setIsQueryRunnable] = useState(true);\n  const db = datasource.getDB();\n\n  const { preconfiguredDatabase } = datasource;\n  const dialect = queryHeaderProps?.dialect ?? 'other';\n  const { loading, error } = useAsync(async () => {\n    return () => {\n      if (datasource.getDB().init !== undefined) {\n        datasource.getDB().init!();\n      }\n    };\n  }, [datasource]);\n\n  const queryWithDefaults = applyQueryDefaults(query);\n  const [queryRowFilter, setQueryRowFilter] = useState<QueryRowFilter>({\n    filter: !!queryWithDefaults.sql?.whereString,\n    group: !!queryWithDefaults.sql?.groupBy?.[0]?.property.name,\n    order: !!queryWithDefaults.sql?.orderBy?.property.name,\n    preview: true,\n  });\n  const [queryToValidate, setQueryToValidate] = useState(queryWithDefaults);\n\n  useEffect(() => {\n    return () => {\n      if (datasource.getDB().dispose !== undefined) {\n        datasource.getDB().dispose!();\n      }\n    };\n  }, [datasource]);\n\n  const processQuery = useCallback(\n    (q: SQLQuery) => {\n      if (isQueryValid(q) && onRunQuery) {\n        onRunQuery();\n      }\n    },\n    [onRunQuery]\n  );\n\n  const onQueryChange = (q: SQLQuery, process = true) => {\n    setQueryToValidate(q);\n    onChange(q);\n\n    if (haveColumns(q.sql?.columns) && q.sql?.columns.some((c) => c.name) && !queryRowFilter.group) {\n      setQueryRowFilter({ ...queryRowFilter, group: true });\n    }\n\n    if (process) {\n      processQuery(q);\n    }\n  };\n\n  const onQueryHeaderChange = (q: SQLQuery) => {\n    setQueryToValidate(q);\n    onChange(q);\n  };\n\n  if (loading || error) {\n    return null;\n  }\n\n  return (\n    <>\n      <QueryHeader\n        db={db}\n        preconfiguredDataset={preconfiguredDatabase}\n        onChange={onQueryHeaderChange}\n        onRunQuery={onRunQuery}\n        onQueryRowChange={setQueryRowFilter}\n        queryRowFilter={queryRowFilter}\n        query={queryWithDefaults}\n        isQueryRunnable={isQueryRunnable}\n        hideFormatSelector={queryHeaderProps?.hideFormatSelector}\n        hideRunButton={queryHeaderProps?.hideRunButton}\n        dialect={dialect}\n        dataSourceInstanceSettings={datasource.instanceSettings}\n        app={app}\n      />\n\n      <Space v={0.5} />\n\n      {queryWithDefaults.editorMode !== EditorMode.Code && (\n        <VisualEditor\n          db={db}\n          query={queryWithDefaults}\n          onChange={(q: SQLQuery) => onQueryChange(q, false)}\n          queryRowFilter={queryRowFilter}\n          onValidate={setIsQueryRunnable}\n          range={range}\n        />\n      )}\n\n      {queryWithDefaults.editorMode === EditorMode.Code && (\n        <RawEditor\n          db={db}\n          query={queryWithDefaults}\n          queryToValidate={queryToValidate}\n          onChange={onQueryChange}\n          onRunQuery={onRunQuery}\n          onValidate={setIsQueryRunnable}\n          range={range}\n        />\n      )}\n    </>\n  );\n}\n\nconst isQueryValid = (q: SQLQuery) => {\n  return Boolean(q.rawSql);\n};\n"],"names":["_a","_b"],"mappings":"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"}