{"version":3,"file":"8016.ddc7aed9391a988daaff.js","mappings":"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","sources":["webpack://grafana/./public/app/features/query-library/api/SavedQueriesApi.ts","webpack://grafana/./public/app/features/query-library/api/SavedQueriesSrv.ts","webpack://grafana/./public/app/core/components/PluginHelp/PluginHelp.tsx","webpack://grafana/./public/app/features/query/components/QueryGroupOptions.tsx","webpack://grafana/./public/app/features/query/components/SavedQueryPicker.tsx","webpack://grafana/./public/app/features/query/components/QueryGroup.tsx","webpack://grafana/./public/app/features/query/state/updateQueries.ts"],"sourcesContent":["import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';\n\nimport { DataQuery } from '@grafana/data/src';\n\nimport { SavedQueryUpdateOpts } from '../components/QueryEditorDrawer';\n\nimport { getSavedQuerySrv } from './SavedQueriesSrv';\n\nexport type SavedQueryRef = {\n uid?: string;\n};\n\nexport type Variable = {\n name: string;\n type?: string;\n current: {\n value: string | number;\n };\n};\n\ntype SavedQueryMeta = {\n title: string;\n description?: string;\n tags?: string[];\n schemaVersion?: number;\n variables: Variable[];\n};\n\ntype SavedQueryData = {\n queries: TQuery[];\n};\n\nexport type SavedQuery = SavedQueryMeta & SavedQueryData & SavedQueryRef;\n\nexport const isQueryWithMixedDatasource = (savedQuery: SavedQuery): boolean => {\n if (!savedQuery?.queries?.length) {\n return false;\n }\n\n const firstDs = savedQuery.queries[0].datasource;\n return savedQuery.queries.some((q) => q.datasource?.uid !== firstDs?.uid || q.datasource?.type !== firstDs?.type);\n};\n\nconst api = createApi({\n reducerPath: 'savedQueries',\n baseQuery: fetchBaseQuery({ baseUrl: '/' }),\n endpoints: (build) => ({\n getSavedQueryByUids: build.query({\n async queryFn(arg, queryApi, extraOptions, baseQuery) {\n return { data: await getSavedQuerySrv().getSavedQueries(arg) };\n },\n }),\n deleteSavedQuery: build.mutation({\n async queryFn(arg) {\n await getSavedQuerySrv().deleteSavedQuery(arg);\n return {\n data: null,\n };\n },\n }),\n updateSavedQuery: build.mutation({\n async queryFn(arg) {\n await getSavedQuerySrv().updateSavedQuery(arg.query, arg.opts);\n return {\n data: null,\n };\n },\n }),\n }),\n});\n\nexport const { useUpdateSavedQueryMutation } = api;\n","import { getBackendSrv } from 'app/core/services/backend_srv';\nimport { SavedQueryUpdateOpts } from 'app/features/query-library/components/QueryEditorDrawer';\n\nimport { SavedQuery, SavedQueryRef } from './SavedQueriesApi';\n\nexport class SavedQuerySrv {\n getSavedQueries = async (refs: SavedQueryRef[]): Promise => {\n if (!refs.length) {\n return [];\n }\n const uidParams = refs.map((r) => `uid=${r.uid}`).join('&');\n return getBackendSrv().get(`/api/query-library?${uidParams}`);\n };\n\n deleteSavedQuery = async (ref: SavedQueryRef): Promise => {\n return getBackendSrv().delete(`/api/query-library?uid=${ref.uid}`);\n };\n\n updateSavedQuery = async (query: SavedQuery, options: SavedQueryUpdateOpts): Promise => {\n return getBackendSrv().post(`/api/query-library`, query);\n };\n}\n\nconst savedQuerySrv = new SavedQuerySrv();\n\nexport const getSavedQuerySrv = () => savedQuerySrv;\n","import React from 'react';\nimport { useAsync } from 'react-use';\n\nimport { renderMarkdown } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { LoadingPlaceholder } from '@grafana/ui';\n\ninterface Props {\n pluginId: string;\n}\n\nexport function PluginHelp({ pluginId }: Props) {\n const { value, loading, error } = useAsync(async () => {\n return getBackendSrv().get(`/api/plugins/${pluginId}/markdown/query_help`);\n }, []);\n\n const renderedMarkdown = renderMarkdown(value);\n\n if (loading) {\n return ;\n }\n\n if (error) {\n return

An error occurred when loading help.

;\n }\n\n if (value === '') {\n return

No query help could be found.

;\n }\n\n return
;\n}\n","import { css } from '@emotion/css';\nimport React, { PureComponent, ChangeEvent, FocusEvent } from 'react';\n\nimport { rangeUtil, PanelData, DataSourceApi } from '@grafana/data';\nimport { Switch, Input, InlineField, InlineFormLabel, stylesFactory } from '@grafana/ui';\nimport { QueryOperationRow } from 'app/core/components/QueryOperationRow/QueryOperationRow';\nimport { config } from 'app/core/config';\nimport { QueryGroupOptions } from 'app/types';\n\ninterface Props {\n options: QueryGroupOptions;\n dataSource: DataSourceApi;\n data: PanelData;\n onChange: (options: QueryGroupOptions) => void;\n}\n\ninterface State {\n timeRangeFrom: string;\n timeRangeShift: string;\n timeRangeHide: boolean;\n isOpen: boolean;\n relativeTimeIsValid: boolean;\n timeShiftIsValid: boolean;\n}\n\nexport class QueryGroupOptionsEditor extends PureComponent {\n constructor(props: Props) {\n super(props);\n\n const { options } = props;\n\n this.state = {\n timeRangeFrom: options.timeRange?.from || '',\n timeRangeShift: options.timeRange?.shift || '',\n timeRangeHide: options.timeRange?.hide ?? false,\n isOpen: false,\n relativeTimeIsValid: true,\n timeShiftIsValid: true,\n };\n }\n\n onRelativeTimeChange = (event: ChangeEvent) => {\n this.setState({\n timeRangeFrom: event.target.value,\n });\n };\n\n onTimeShiftChange = (event: ChangeEvent) => {\n this.setState({\n timeRangeShift: event.target.value,\n });\n };\n\n onOverrideTime = (event: FocusEvent) => {\n const { options, onChange } = this.props;\n\n const newValue = emptyToNull(event.target.value);\n const isValid = timeRangeValidation(newValue);\n\n if (isValid && options.timeRange?.from !== newValue) {\n onChange({\n ...options,\n timeRange: {\n ...(options.timeRange ?? {}),\n from: newValue,\n },\n });\n }\n\n this.setState({ relativeTimeIsValid: isValid });\n };\n\n onTimeShift = (event: FocusEvent) => {\n const { options, onChange } = this.props;\n\n const newValue = emptyToNull(event.target.value);\n const isValid = timeRangeValidation(newValue);\n\n if (isValid && options.timeRange?.shift !== newValue) {\n onChange({\n ...options,\n timeRange: {\n ...(options.timeRange ?? {}),\n shift: newValue,\n },\n });\n }\n\n this.setState({ timeShiftIsValid: isValid });\n };\n\n onToggleTimeOverride = () => {\n const { onChange, options } = this.props;\n\n this.setState({ timeRangeHide: !this.state.timeRangeHide }, () => {\n onChange({\n ...options,\n timeRange: {\n ...(options.timeRange ?? {}),\n hide: this.state.timeRangeHide,\n },\n });\n });\n };\n\n onCacheTimeoutBlur = (event: ChangeEvent) => {\n const { options, onChange } = this.props;\n onChange({\n ...options,\n cacheTimeout: emptyToNull(event.target.value),\n });\n };\n\n onMaxDataPointsBlur = (event: ChangeEvent) => {\n const { options, onChange } = this.props;\n\n let maxDataPoints: number | null = parseInt(event.target.value as string, 10);\n\n if (isNaN(maxDataPoints) || maxDataPoints === 0) {\n maxDataPoints = null;\n }\n\n if (maxDataPoints !== options.maxDataPoints) {\n onChange({\n ...options,\n maxDataPoints,\n });\n }\n };\n\n onMinIntervalBlur = (event: ChangeEvent) => {\n const { options, onChange } = this.props;\n const minInterval = emptyToNull(event.target.value);\n if (minInterval !== options.minInterval) {\n onChange({\n ...options,\n minInterval,\n });\n }\n };\n\n renderCacheTimeoutOption() {\n const { dataSource, options } = this.props;\n\n const tooltip = `If your time series store has a query cache this option can override the default cache timeout. Specify a\n numeric value in seconds.`;\n\n if (!dataSource.meta.queryOptions?.cacheTimeout) {\n return null;\n }\n\n return (\n
\n
\n \n Cache timeout\n \n \n
\n
\n );\n }\n\n renderMaxDataPointsOption() {\n const { data, options } = this.props;\n const realMd = data.request?.maxDataPoints;\n const value = options.maxDataPoints ?? '';\n const isAuto = value === '';\n\n return (\n
\n
\n \n The maximum data points per series. Used directly by some data sources and used in calculation of auto\n interval. With streaming data this value is used for the rolling buffer.\n \n }\n >\n Max data points\n \n \n {isAuto && (\n <>\n
=
\n
Width of panel
\n \n )}\n
\n
\n );\n }\n\n renderIntervalOption() {\n const { data, dataSource, options } = this.props;\n const realInterval = data.request?.interval;\n const minIntervalOnDs = dataSource.interval ?? 'No limit';\n\n return (\n <>\n
\n
\n \n A lower limit for the interval. Recommended to be set to write frequency, for example 1m{' '}\n if your data is written every minute. Default value can be set in data source settings for most data\n sources.\n \n }\n >\n Min interval\n \n \n
\n
\n
\n
\n \n The evaluated interval that is sent to data source and is used in $__interval and{' '}\n $__interval_ms\n \n }\n >\n Interval\n \n {realInterval}\n
=
\n
Time range / max data points
\n
\n
\n \n );\n }\n\n onOpenOptions = () => {\n this.setState({ isOpen: true });\n };\n\n onCloseOptions = () => {\n this.setState({ isOpen: false });\n };\n\n renderCollapsedText(styles: StylesType): React.ReactNode | undefined {\n const { data, options } = this.props;\n const { isOpen } = this.state;\n\n if (isOpen) {\n return undefined;\n }\n\n let mdDesc = options.maxDataPoints ?? '';\n if (mdDesc === '' && data.request) {\n mdDesc = `auto = ${data.request.maxDataPoints}`;\n }\n\n let intervalDesc = options.minInterval;\n if (data.request) {\n intervalDesc = `${data.request.interval}`;\n }\n\n return (\n <>\n {
MD = {mdDesc}
}\n {
Interval = {intervalDesc}
}\n \n );\n }\n\n render() {\n const { timeRangeHide: hideTimeOverride, relativeTimeIsValid, timeShiftIsValid } = this.state;\n const { timeRangeFrom: relativeTime, timeRangeShift: timeShift, isOpen } = this.state;\n const styles = getStyles();\n\n return (\n \n {this.renderMaxDataPointsOption()}\n {this.renderIntervalOption()}\n {this.renderCacheTimeoutOption()}\n\n
\n Relative time\n \n
\n\n
\n Time shift\n \n
\n {(timeShift || relativeTime) && (\n
\n \n \n \n
\n )}\n \n );\n }\n}\n\nconst timeRangeValidation = (value: string | null) => {\n if (!value) {\n return true;\n }\n\n return rangeUtil.isValidTimeSpan(value);\n};\n\nconst emptyToNull = (value: string) => {\n return value === '' ? null : value;\n};\n\nconst getStyles = stylesFactory(() => {\n const { theme } = config;\n\n return {\n collapsedText: css`\n margin-left: ${theme.spacing.md};\n font-size: ${theme.typography.size.sm};\n color: ${theme.colors.textWeak};\n `,\n };\n});\n\ntype StylesType = ReturnType;\n","// Libraries\nimport React, { useMemo } from 'react';\n// Components\nimport { useAsync } from 'react-use';\nimport { AsyncState } from 'react-use/lib/useAsyncFn';\n\nimport { DataSourceInstanceSettings, isUnsignedPluginSignature, SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { getDataSourceSrv } from '@grafana/runtime/src';\nimport { HorizontalGroup, PluginSignatureBadge, Select } from '@grafana/ui';\n\nimport { getGrafanaSearcher, QueryResponse, SearchQuery } from '../../search/service';\n\nexport type SavedQueryPickerProps = {\n onChange: (savedQueryUid: string | null) => void;\n current?: string | null; // type\n hideTextValue?: boolean;\n onBlur?: () => void;\n autoFocus?: boolean;\n openMenuOnFocus?: boolean;\n placeholder?: string;\n tracing?: boolean;\n mixed?: boolean;\n dashboard?: boolean;\n metrics?: boolean;\n type?: string | string[];\n annotations?: boolean;\n variables?: boolean;\n alerting?: boolean;\n pluginId?: string;\n /** If true,we show only DSs with logs; and if true, pluginId shouldnt be passed in */\n logs?: boolean;\n width?: number;\n inputId?: string;\n filter?: (dataSource: DataSourceInstanceSettings) => boolean;\n onClear?: () => void;\n};\n\nfunction getSavedQueryPickerOptions(results: AsyncState): Array> {\n if (results?.loading) {\n return [];\n }\n\n if (!results?.value?.totalRows) {\n return [];\n }\n\n const hits = results.value.view.toArray();\n\n return hits.map((h) => {\n const dsSettings = h.ds_uid?.length ? getDataSourceSrv().getInstanceSettings(h.ds_uid[0]) : undefined;\n\n return {\n value: h.uid,\n label: h.name,\n imgUrl: dsSettings?.meta.info.logos.small,\n meta: dsSettings?.meta,\n };\n });\n}\n\nexport const SavedQueryPicker = (props: SavedQueryPickerProps) => {\n const { autoFocus, onBlur, onChange, current, openMenuOnFocus, placeholder, width, inputId } = props;\n\n const searchQuery = useMemo(() => {\n // TODO: ensure we fetch all saved queries?\n const query: SearchQuery = {\n query: '*',\n explain: true,\n kind: ['query'],\n };\n\n return query;\n }, []);\n\n const results = useAsync(async () => {\n return getGrafanaSearcher().search(searchQuery);\n }, [searchQuery]);\n\n const options = getSavedQueryPickerOptions(results);\n\n return (\n
\n {\n onChange(newValue?.value ?? null);\n }}\n openMenuOnFocus={openMenuOnFocus}\n maxMenuHeight={500}\n placeholder={placeholder ?? 'Select query from the library'}\n noOptionsMessage=\"No queries found\"\n getOptionLabel={(o) => {\n if (o.meta && isUnsignedPluginSignature(o.meta.signature)) {\n return (\n \n {o.label} \n \n );\n }\n return o.label || '';\n }}\n />\n
\n );\n};\n","import { css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\nimport { Unsubscribable } from 'rxjs';\n\nimport {\n CoreApp,\n DataQuery,\n DataSourceApi,\n DataSourceInstanceSettings,\n getDefaultTimeRange,\n LoadingState,\n PanelData,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { DataSourcePicker, getDataSourceSrv } from '@grafana/runtime';\nimport { Button, CustomScrollbar, HorizontalGroup, InlineFormLabel, Modal, stylesFactory } from '@grafana/ui';\nimport { PluginHelp } from 'app/core/components/PluginHelp/PluginHelp';\nimport config from 'app/core/config';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { addQuery, queryIsEmpty } from 'app/core/utils/query';\nimport { dataSource as expressionDatasource } from 'app/features/expressions/ExpressionDatasource';\nimport { DashboardQueryEditor, isSharedDashboardQuery } from 'app/plugins/datasource/dashboard';\nimport { QueryGroupDataSource, QueryGroupOptions } from 'app/types';\n\nimport { isQueryWithMixedDatasource } from '../../query-library/api/SavedQueriesApi';\nimport { getSavedQuerySrv } from '../../query-library/api/SavedQueriesSrv';\nimport { PanelQueryRunner } from '../state/PanelQueryRunner';\nimport { updateQueries } from '../state/updateQueries';\n\nimport { GroupActionComponents } from './QueryActionComponent';\nimport { QueryEditorRows } from './QueryEditorRows';\nimport { QueryGroupOptionsEditor } from './QueryGroupOptions';\nimport { SavedQueryPicker } from './SavedQueryPicker';\n\ninterface Props {\n queryRunner: PanelQueryRunner;\n options: QueryGroupOptions;\n onOpenQueryInspector?: () => void;\n onRunQueries: () => void;\n onOptionsChange: (options: QueryGroupOptions) => void;\n}\n\ninterface State {\n dataSource?: DataSourceApi;\n dsSettings?: DataSourceInstanceSettings;\n queries: DataQuery[];\n helpContent: React.ReactNode;\n isLoadingHelp: boolean;\n isPickerOpen: boolean;\n isAddingMixed: boolean;\n data: PanelData;\n isHelpOpen: boolean;\n defaultDataSource?: DataSourceApi;\n scrollElement?: HTMLDivElement;\n savedQueryUid?: string | null;\n initialState: {\n queries: DataQuery[];\n dataSource?: QueryGroupDataSource;\n savedQueryUid?: string | null;\n };\n}\n\nexport class QueryGroup extends PureComponent {\n backendSrv = backendSrv;\n dataSourceSrv = getDataSourceSrv();\n querySubscription: Unsubscribable | null = null;\n\n state: State = {\n isLoadingHelp: false,\n helpContent: null,\n isPickerOpen: false,\n isAddingMixed: false,\n isHelpOpen: false,\n queries: [],\n savedQueryUid: null,\n initialState: {\n queries: [],\n savedQueryUid: null,\n },\n data: {\n state: LoadingState.NotStarted,\n series: [],\n timeRange: getDefaultTimeRange(),\n },\n };\n\n async componentDidMount() {\n const { options, queryRunner } = this.props;\n\n this.querySubscription = queryRunner.getData({ withTransforms: false, withFieldConfig: false }).subscribe({\n next: (data: PanelData) => this.onPanelDataUpdate(data),\n });\n\n try {\n const ds = await this.dataSourceSrv.get(options.dataSource);\n const dsSettings = this.dataSourceSrv.getInstanceSettings(options.dataSource);\n const defaultDataSource = await this.dataSourceSrv.get();\n const datasource = ds.getRef();\n const queries = options.queries.map((q) => ({\n ...(queryIsEmpty(q) && ds?.getDefaultQuery?.(CoreApp.PanelEditor)),\n datasource,\n ...q,\n }));\n this.setState({\n queries,\n dataSource: ds,\n dsSettings,\n defaultDataSource,\n savedQueryUid: options.savedQueryUid,\n initialState: {\n queries: options.queries.map((q) => ({ ...q })),\n dataSource: { ...options.dataSource },\n savedQueryUid: options.savedQueryUid,\n },\n });\n } catch (error) {\n console.log('failed to load data source', error);\n }\n }\n\n componentWillUnmount() {\n if (this.querySubscription) {\n this.querySubscription.unsubscribe();\n this.querySubscription = null;\n }\n }\n\n onPanelDataUpdate(data: PanelData) {\n this.setState({ data });\n }\n\n onChangeDataSource = async (newSettings: DataSourceInstanceSettings) => {\n const { dsSettings } = this.state;\n const currentDS = dsSettings ? await getDataSourceSrv().get(dsSettings.uid) : undefined;\n const nextDS = await getDataSourceSrv().get(newSettings.uid);\n\n // We need to pass in newSettings.uid as well here as that can be a variable expression and we want to store that in the query model not the current ds variable value\n const queries = await updateQueries(nextDS, newSettings.uid, this.state.queries, currentDS);\n\n const dataSource = await this.dataSourceSrv.get(newSettings.name);\n this.onChange({\n queries,\n savedQueryUid: null,\n dataSource: {\n name: newSettings.name,\n uid: newSettings.uid,\n type: newSettings.meta.id,\n default: newSettings.isDefault,\n },\n });\n\n this.setState({\n queries,\n savedQueryUid: null,\n dataSource: dataSource,\n dsSettings: newSettings,\n });\n };\n\n onChangeSavedQuery = async (savedQueryUid: string | null) => {\n if (!savedQueryUid?.length) {\n // leave the queries, remove the link\n this.onChange({\n queries: this.state.queries,\n savedQueryUid: null,\n dataSource: {\n name: this.state.dsSettings?.name,\n uid: this.state.dsSettings?.uid,\n type: this.state.dsSettings?.meta.id,\n default: this.state.dsSettings?.isDefault,\n },\n });\n\n this.setState({\n queries: this.state.queries,\n savedQueryUid: null,\n dataSource: this.state.dataSource,\n dsSettings: this.state.dsSettings,\n });\n return;\n }\n\n const { dsSettings } = this.state;\n const currentDS = dsSettings ? await getDataSourceSrv().get(dsSettings.uid) : undefined;\n\n const resp = await getSavedQuerySrv().getSavedQueries([{ uid: savedQueryUid }]);\n if (!resp?.length) {\n throw new Error('TODO error handling');\n }\n const savedQuery = resp[0];\n const isMixedDatasource = isQueryWithMixedDatasource(savedQuery);\n\n const nextDS = isMixedDatasource\n ? await getDataSourceSrv().get('-- Mixed --')\n : await getDataSourceSrv().get(savedQuery.queries[0].datasource?.uid);\n\n // We need to pass in newSettings.uid as well here as that can be a variable expression and we want to store that in the query model not the current ds variable value\n const queries = await updateQueries(nextDS, nextDS.uid, savedQuery.queries, currentDS);\n\n const newDsSettings = await getDataSourceSrv().getInstanceSettings(nextDS.uid);\n if (!newDsSettings) {\n throw new Error('TODO error handling');\n }\n this.onChange({\n queries,\n savedQueryUid: savedQueryUid,\n dataSource: {\n name: newDsSettings.name,\n uid: newDsSettings.uid,\n type: newDsSettings.meta.id,\n default: newDsSettings.isDefault,\n },\n });\n\n this.setState({\n queries,\n savedQueryUid,\n dataSource: nextDS,\n dsSettings: newDsSettings,\n });\n };\n\n onAddQueryClick = () => {\n const { queries } = this.state;\n this.onQueriesChange(addQuery(queries, this.newQuery()));\n this.onScrollBottom();\n };\n\n newQuery(): Partial {\n const { dsSettings, defaultDataSource } = this.state;\n\n const ds = !dsSettings?.meta.mixed ? dsSettings : defaultDataSource;\n\n return {\n ...this.state.dataSource?.getDefaultQuery?.(CoreApp.PanelEditor),\n datasource: { uid: ds?.uid, type: ds?.type },\n };\n }\n\n onChange(changedProps: Partial) {\n this.props.onOptionsChange({\n ...this.props.options,\n ...changedProps,\n });\n }\n\n onAddExpressionClick = () => {\n this.onQueriesChange(addQuery(this.state.queries, expressionDatasource.newQuery()));\n this.onScrollBottom();\n };\n\n onScrollBottom = () => {\n setTimeout(() => {\n if (this.state.scrollElement) {\n this.state.scrollElement.scrollTo({ top: 10000 });\n }\n }, 20);\n };\n\n onUpdateAndRun = (options: QueryGroupOptions) => {\n this.props.onOptionsChange(options);\n this.props.onRunQueries();\n };\n\n renderTopSection(styles: QueriesTabStyles) {\n const { onOpenQueryInspector, options } = this.props;\n const { dataSource, data } = this.state;\n\n return (\n
\n
\n \n Data source\n \n
\n \n
\n {dataSource && (\n <>\n
\n \n
\n
\n \n
\n {onOpenQueryInspector && (\n
\n \n Query inspector\n \n
\n )}\n \n )}\n
\n {config.featureToggles.queryLibrary && (\n <>\n
\n \n Saved query\n \n
\n \n
\n
\n \n )}\n
\n );\n }\n\n onOpenHelp = () => {\n this.setState({ isHelpOpen: true });\n };\n\n onCloseHelp = () => {\n this.setState({ isHelpOpen: false });\n };\n\n renderMixedPicker = () => {\n return (\n \n );\n };\n\n onAddMixedQuery = (datasource: any) => {\n this.onAddQuery({ datasource: datasource.name });\n this.setState({ isAddingMixed: false });\n };\n\n onMixedPickerBlur = () => {\n this.setState({ isAddingMixed: false });\n };\n\n onAddQuery = (query: Partial) => {\n const { dsSettings, queries } = this.state;\n this.onQueriesChange(addQuery(queries, query, { type: dsSettings?.type, uid: dsSettings?.uid }));\n this.onScrollBottom();\n };\n\n onQueriesChange = (queries: DataQuery[]) => {\n this.onChange({ queries });\n this.setState({ queries });\n };\n\n renderQueries(dsSettings: DataSourceInstanceSettings) {\n const { onRunQueries } = this.props;\n const { data, queries } = this.state;\n\n if (isSharedDashboardQuery(dsSettings.name)) {\n return (\n \n );\n }\n\n return (\n
\n \n
\n );\n }\n\n isExpressionsSupported(dsSettings: DataSourceInstanceSettings): boolean {\n return (dsSettings.meta.alerting || dsSettings.meta.mixed) === true;\n }\n\n renderExtraActions() {\n return GroupActionComponents.getAllExtraRenderAction()\n .map((action, index) =>\n action({\n onAddQuery: this.onAddQuery,\n onChangeDataSource: this.onChangeDataSource,\n key: index,\n })\n )\n .filter(Boolean);\n }\n\n renderAddQueryRow(dsSettings: DataSourceInstanceSettings, styles: QueriesTabStyles) {\n const { isAddingMixed } = this.state;\n const showAddButton = !(isAddingMixed || isSharedDashboardQuery(dsSettings.name));\n\n return (\n \n {showAddButton && (\n \n Query\n \n )}\n {config.expressionsEnabled && this.isExpressionsSupported(dsSettings) && (\n \n Expression \n \n )}\n {this.renderExtraActions()}\n \n );\n }\n\n setScrollRef = (scrollElement: HTMLDivElement): void => {\n this.setState({ scrollElement });\n };\n\n render() {\n const { isHelpOpen, dsSettings } = this.state;\n const styles = getStyles();\n\n return (\n \n
\n {this.renderTopSection(styles)}\n {dsSettings && (\n <>\n
{this.renderQueries(dsSettings)}
\n {this.renderAddQueryRow(dsSettings, styles)}\n {isHelpOpen && (\n \n \n \n )}\n \n )}\n
\n
\n );\n }\n}\n\nconst getStyles = stylesFactory(() => {\n const { theme } = config;\n\n return {\n innerWrapper: css`\n display: flex;\n flex-direction: column;\n padding: ${theme.spacing.md};\n `,\n dataSourceRow: css`\n display: flex;\n margin-bottom: ${theme.spacing.md};\n `,\n dataSourceRowItem: css`\n margin-right: ${theme.spacing.inlineFormMargin};\n `,\n dataSourceRowItemOptions: css`\n flex-grow: 1;\n margin-right: ${theme.spacing.inlineFormMargin};\n `,\n queriesWrapper: css`\n padding-bottom: 16px;\n `,\n expressionWrapper: css``,\n expressionButton: css`\n margin-right: ${theme.spacing.sm};\n `,\n };\n});\n\ntype QueriesTabStyles = ReturnType;\n","import { CoreApp, DataQuery, DataSourceApi, hasQueryExportSupport, hasQueryImportSupport } from '@grafana/data';\nimport { isExpressionReference } from '@grafana/runtime/src/utils/DataSourceWithBackend';\n\nexport async function updateQueries(\n nextDS: DataSourceApi,\n nextDSUidOrVariableExpression: string,\n queries: DataQuery[],\n currentDS?: DataSourceApi\n): Promise {\n let nextQueries = queries;\n const datasource = { type: nextDS.type, uid: nextDSUidOrVariableExpression };\n const DEFAULT_QUERY = { ...nextDS?.getDefaultQuery?.(CoreApp.PanelEditor), datasource, refId: 'A' };\n\n // we are changing data source type\n if (currentDS?.meta.id !== nextDS.meta.id) {\n // If changing to mixed do nothing\n if (nextDS.meta.mixed) {\n return queries;\n }\n // when both data sources support abstract queries\n else if (hasQueryExportSupport(currentDS) && hasQueryImportSupport(nextDS)) {\n const abstractQueries = await currentDS.exportToAbstractQueries(queries);\n nextQueries = await nextDS.importFromAbstractQueries(abstractQueries);\n }\n // when datasource supports query import\n else if (currentDS && nextDS.importQueries) {\n nextQueries = await nextDS.importQueries(queries, currentDS);\n }\n // Otherwise clear queries\n else {\n return [DEFAULT_QUERY];\n }\n }\n\n if (nextQueries.length === 0) {\n return [DEFAULT_QUERY];\n }\n\n // Set data source on all queries except expression queries\n return nextQueries.map((query) => {\n if (!isExpressionReference(query.datasource) && !nextDS.meta.mixed) {\n query.datasource = datasource;\n }\n return query;\n });\n}\n"],"names":["isQueryWithMixedDatasource","savedQuery","firstDs","q","api","build","arg","queryApi","extraOptions","baseQuery","useUpdateSavedQueryMutation","SavedQuerySrv","refs","uidParams","r","ref","query","options","savedQuerySrv","getSavedQuerySrv","PluginHelp","pluginId","value","loading","error","useAsync","renderedMarkdown","LoadingPlaceholder","QueryGroupOptionsEditor","props","event","onChange","newValue","emptyToNull","isValid","timeRangeValidation","maxDataPoints","minInterval","dataSource","tooltip","Input","data","realMd","isAuto","realInterval","minIntervalOnDs","styles","isOpen","mdDesc","intervalDesc","hideTimeOverride","relativeTimeIsValid","timeShiftIsValid","relativeTime","timeShift","getStyles","QueryOperationRow","InlineField","Switch","stylesFactory","theme","config","getSavedQueryPickerOptions","results","h","dsSettings","SavedQueryPicker","autoFocus","onBlur","current","openMenuOnFocus","placeholder","width","inputId","searchQuery","selectors","Select","o","PluginSignatureBadge","QueryGroup","newSettings","currentDS","nextDS","queries","updateQueries","savedQueryUid","resp","newDsSettings","DataSourcePicker","datasource","scrollElement","queryRunner","ds","defaultDataSource","changedProps","onOpenQueryInspector","Button","onRunQueries","QueryEditorRows","action","index","isAddingMixed","showAddButton","isHelpOpen","CustomScrollbar","Modal","nextDSUidOrVariableExpression","nextQueries","DEFAULT_QUERY","abstractQueries"],"sourceRoot":""}