{"version":3,"file":"1344.b3f7a66d84fa430cc2a2.js","mappings":"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","sources":["webpack://grafana/./public/app/angular/AngularLocationWrapper.ts","webpack://grafana/./public/app/angular/components/sql_part/sql_part.ts","webpack://grafana/./public/app/angular/panel/metrics_panel_ctrl.ts","webpack://grafana/./public/app/angular/panel/panel_ctrl.ts","webpack://grafana/./public/app/angular/panel/query_ctrl.ts","webpack://grafana/./public/app/features/datasources/utils/passwordHandlers.ts","webpack://grafana/./public/app/plugins/sdk.ts"],"sourcesContent":["import { deprecationWarning, urlUtil } from '@grafana/data';\nimport { locationSearchToObject, locationService, navigationLogger } from '@grafana/runtime';\n\n// Ref: https://github.com/angular/angular.js/blob/ae8e903edf88a83fedd116ae02c0628bf72b150c/src/ng/location.js#L5\nconst DEFAULT_PORTS: Record = { http: 80, https: 443, ftp: 21 };\n\nexport class AngularLocationWrapper {\n constructor() {\n this.absUrl = this.wrapInDeprecationWarning(this.absUrl);\n this.hash = this.wrapInDeprecationWarning(this.hash);\n this.host = this.wrapInDeprecationWarning(this.host);\n this.path = this.wrapInDeprecationWarning(this.path);\n this.port = this.wrapInDeprecationWarning(this.port, 'window.location');\n this.protocol = this.wrapInDeprecationWarning(this.protocol, 'window.location');\n this.replace = this.wrapInDeprecationWarning(this.replace);\n this.search = this.wrapInDeprecationWarning(this.search);\n this.state = this.wrapInDeprecationWarning(this.state);\n this.url = this.wrapInDeprecationWarning(this.url);\n }\n\n wrapInDeprecationWarning(fn: Function, replacement?: string) {\n let self = this;\n\n return function wrapper() {\n deprecationWarning('$location', fn.name, replacement || 'locationService');\n return fn.apply(self, arguments);\n };\n }\n\n absUrl(): string {\n return `${window.location.origin}${this.url()}`;\n }\n\n hash(newHash?: string | null) {\n navigationLogger('AngularLocationWrapper', false, 'Angular compat layer: hash');\n\n if (!newHash) {\n return locationService.getLocation().hash.slice(1);\n } else {\n throw new Error('AngularLocationWrapper method not implemented.');\n }\n }\n\n host(): string {\n return new URL(window.location.href).hostname;\n }\n\n path(pathname?: any) {\n navigationLogger('AngularLocationWrapper', false, 'Angular compat layer: path');\n\n const location = locationService.getLocation();\n\n if (pathname !== undefined && pathname !== null) {\n let parsedPath = String(pathname);\n parsedPath = parsedPath.startsWith('/') ? parsedPath : `/${parsedPath}`;\n const url = new URL(`${window.location.origin}${parsedPath}`);\n\n locationService.push({\n pathname: url.pathname,\n search: url.search.length > 0 ? url.search : location.search,\n hash: url.hash.length > 0 ? url.hash : location.hash,\n });\n return this;\n }\n\n if (pathname === null) {\n locationService.push('/');\n return this;\n }\n\n return location.pathname;\n }\n\n port(): number | null {\n const url = new URL(window.location.href);\n return parseInt(url.port, 10) || DEFAULT_PORTS[url.protocol] || null;\n }\n\n protocol(): string {\n return new URL(window.location.href).protocol.slice(0, -1);\n }\n\n replace() {\n throw new Error('AngularLocationWrapper method not implemented.');\n }\n\n search(search?: any, paramValue?: any) {\n navigationLogger('AngularLocationWrapper', false, 'Angular compat layer: search');\n if (!search) {\n return locationService.getSearchObject();\n }\n\n if (search && arguments.length > 1) {\n locationService.partial({\n [search]: paramValue,\n });\n\n return this;\n }\n\n if (search) {\n let newQuery;\n\n if (typeof search === 'object') {\n newQuery = { ...search };\n } else {\n newQuery = locationSearchToObject(search);\n }\n\n for (const key of Object.keys(newQuery)) {\n // removing params with null | undefined\n if (newQuery[key] === null || newQuery[key] === undefined) {\n delete newQuery[key];\n }\n }\n\n const updatedUrl = urlUtil.renderUrl(locationService.getLocation().pathname, newQuery);\n locationService.push(updatedUrl);\n }\n\n return this;\n }\n\n state(state?: any) {\n navigationLogger('AngularLocationWrapper', false, 'Angular compat layer: state');\n throw new Error('AngularLocationWrapper method not implemented.');\n }\n\n url(newUrl?: any) {\n navigationLogger('AngularLocationWrapper', false, 'Angular compat layer: url');\n\n if (newUrl !== undefined) {\n if (newUrl.startsWith('#')) {\n locationService.push({ ...locationService.getLocation(), hash: newUrl });\n } else if (newUrl.startsWith('?')) {\n locationService.push({ ...locationService.getLocation(), search: newUrl });\n } else if (newUrl.trim().length === 0) {\n locationService.push('/');\n } else {\n locationService.push(newUrl);\n }\n\n return locationService;\n }\n\n const location = locationService.getLocation();\n return `${location.pathname}${location.search}${location.hash}`;\n }\n}\n","import { clone } from 'lodash';\n\nexport class SqlPartDef {\n type: string;\n style: string;\n label: string;\n params: any[];\n defaultParams: any[];\n wrapOpen: string;\n wrapClose: string;\n separator: string;\n\n constructor(options: any) {\n this.type = options.type;\n if (options.label) {\n this.label = options.label;\n } else {\n this.label = this.type[0].toUpperCase() + this.type.substring(1) + ':';\n }\n this.style = options.style;\n if (this.style === 'function') {\n this.wrapOpen = '(';\n this.wrapClose = ')';\n this.separator = ', ';\n } else {\n this.wrapOpen = ' ';\n this.wrapClose = ' ';\n this.separator = ' ';\n }\n this.params = options.params;\n this.defaultParams = options.defaultParams;\n }\n}\n\nexport class SqlPart {\n part: any;\n def: SqlPartDef;\n params: any[];\n label: string;\n name: string;\n datatype: string;\n\n constructor(part: any, def: any) {\n this.part = part;\n this.def = def;\n if (!this.def) {\n throw { message: 'Could not find sql part ' + part.type };\n }\n\n this.datatype = part.datatype;\n\n if (part.name) {\n this.name = part.name;\n this.label = def.label + ' ' + part.name;\n } else {\n this.name = '';\n this.label = def.label;\n }\n\n part.params = part.params || clone(this.def.defaultParams);\n this.params = part.params;\n }\n\n updateParam(strValue: string, index: number) {\n // handle optional parameters\n if (strValue === '' && this.def.params[index].optional) {\n this.params.splice(index, 1);\n } else {\n this.params[index] = strValue;\n }\n\n this.part.params = this.params;\n }\n}\n","import { isArray } from 'lodash';\nimport { Unsubscribable } from 'rxjs';\n\nimport {\n DataFrame,\n DataQueryResponse,\n DataSourceApi,\n LegacyResponseData,\n LoadingState,\n PanelData,\n PanelEvents,\n TimeRange,\n toDataFrameDTO,\n toLegacyResponseData,\n} from '@grafana/data';\nimport { PanelCtrl } from 'app/angular/panel/panel_ctrl';\nimport { ContextSrv } from 'app/core/services/context_srv';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { applyPanelTimeOverrides } from 'app/features/dashboard/utils/panel';\n\nimport { PanelQueryRunner } from '../../features/query/state/PanelQueryRunner';\n\nclass MetricsPanelCtrl extends PanelCtrl {\n declare datasource: DataSourceApi;\n declare range: TimeRange;\n\n contextSrv: ContextSrv;\n datasourceSrv: any;\n timeSrv: any;\n templateSrv: any;\n interval: any;\n intervalMs: any;\n resolution: any;\n timeInfo?: string;\n skipDataOnInit = false;\n dataList: LegacyResponseData[] = [];\n querySubscription?: Unsubscribable | null;\n useDataFrames = false;\n panelData?: PanelData;\n\n constructor($scope: any, $injector: any) {\n super($scope, $injector);\n\n this.contextSrv = $injector.get('contextSrv');\n this.datasourceSrv = $injector.get('datasourceSrv');\n this.timeSrv = $injector.get('timeSrv');\n this.templateSrv = $injector.get('templateSrv');\n this.panel.datasource = this.panel.datasource || null;\n\n this.events.on(PanelEvents.refresh, this.onMetricsPanelRefresh.bind(this));\n this.events.on(PanelEvents.panelTeardown, this.onPanelTearDown.bind(this));\n this.events.on(PanelEvents.componentDidMount, this.onMetricsPanelMounted.bind(this));\n }\n\n private onMetricsPanelMounted() {\n const queryRunner = this.panel.getQueryRunner() as PanelQueryRunner;\n this.querySubscription = queryRunner\n .getData({ withTransforms: true, withFieldConfig: true })\n .subscribe(this.panelDataObserver);\n }\n\n private onPanelTearDown() {\n if (this.querySubscription) {\n this.querySubscription.unsubscribe();\n this.querySubscription = null;\n }\n }\n\n private onMetricsPanelRefresh() {\n // ignore fetching data if another panel is in fullscreen\n if (this.otherPanelInFullscreenMode()) {\n return;\n }\n\n // if we have snapshot data use that\n if (this.panel.snapshotData) {\n this.updateTimeRange();\n let data = this.panel.snapshotData;\n // backward compatibility\n if (!isArray(data)) {\n data = data.data;\n }\n\n this.panelData = {\n state: LoadingState.Done,\n series: data,\n timeRange: this.range,\n };\n\n // Defer panel rendering till the next digest cycle.\n // For some reason snapshot panels don't init at this time, so this helps to avoid rendering issues.\n return this.$timeout(() => {\n this.events.emit(PanelEvents.dataSnapshotLoad, data);\n });\n }\n\n // clear loading/error state\n delete this.error;\n this.loading = true;\n\n // load datasource service\n return this.datasourceSrv\n .get(this.panel.datasource, this.panel.scopedVars)\n .then(this.issueQueries.bind(this))\n .catch((err: any) => {\n this.processDataError(err);\n });\n }\n\n processDataError(err: any) {\n // if canceled keep loading set to true\n if (err.cancelled) {\n console.log('Panel request cancelled', err);\n return;\n }\n\n this.error = err.message || 'Request Error';\n\n if (err.data) {\n if (err.data.message) {\n this.error = err.data.message;\n } else if (err.data.error) {\n this.error = err.data.error;\n }\n }\n\n this.angularDirtyCheck();\n }\n\n angularDirtyCheck() {\n if (!this.$scope.$root.$$phase) {\n this.$scope.$digest();\n }\n }\n\n // Updates the response with information from the stream\n panelDataObserver = {\n next: (data: PanelData) => {\n this.panelData = data;\n\n if (data.state === LoadingState.Error) {\n this.loading = false;\n this.processDataError(data.error);\n }\n\n // Ignore data in loading state\n if (data.state === LoadingState.Loading) {\n this.loading = true;\n this.angularDirtyCheck();\n return;\n }\n\n if (data.request) {\n const { timeInfo } = data.request;\n if (timeInfo) {\n this.timeInfo = timeInfo;\n }\n }\n\n if (data.timeRange) {\n this.range = data.timeRange;\n }\n\n if (this.useDataFrames) {\n this.handleDataFrames(data.series);\n } else {\n // Make the results look as if they came directly from a <6.2 datasource request\n const legacy = data.series.map((v) => toLegacyResponseData(v));\n this.handleQueryResult({ data: legacy });\n }\n\n this.angularDirtyCheck();\n },\n };\n\n updateTimeRange(datasource?: DataSourceApi) {\n this.datasource = datasource || this.datasource;\n this.range = this.timeSrv.timeRange();\n\n const newTimeData = applyPanelTimeOverrides(this.panel, this.range);\n this.timeInfo = newTimeData.timeInfo;\n this.range = newTimeData.timeRange;\n }\n\n issueQueries(datasource: DataSourceApi) {\n this.updateTimeRange(datasource);\n\n this.datasource = datasource;\n\n const panel = this.panel as PanelModel;\n const queryRunner = panel.getQueryRunner();\n\n return queryRunner.run({\n datasource: panel.datasource,\n queries: panel.targets,\n panelId: panel.id,\n dashboardId: this.dashboard.id,\n timezone: this.dashboard.getTimezone(),\n timeInfo: this.timeInfo,\n timeRange: this.range,\n maxDataPoints: panel.maxDataPoints || this.width,\n minInterval: panel.interval,\n scopedVars: panel.scopedVars,\n cacheTimeout: panel.cacheTimeout,\n transformations: panel.transformations,\n });\n }\n\n handleDataFrames(data: DataFrame[]) {\n this.loading = false;\n\n if (this.dashboard && this.dashboard.snapshot) {\n this.panel.snapshotData = data.map((frame) => toDataFrameDTO(frame));\n }\n\n try {\n this.events.emit(PanelEvents.dataFramesReceived, data);\n } catch (err) {\n this.processDataError(err);\n }\n }\n\n handleQueryResult(result: DataQueryResponse) {\n this.loading = false;\n\n if (this.dashboard.snapshot) {\n this.panel.snapshotData = result.data;\n }\n\n if (!result || !result.data) {\n console.log('Data source query result invalid, missing data field:', result);\n result = { data: [] };\n }\n\n try {\n this.events.emit(PanelEvents.dataReceived, result.data);\n } catch (err) {\n this.processDataError(err);\n }\n }\n}\n\nexport { MetricsPanelCtrl };\n","import { auto } from 'angular';\nimport { isString } from 'lodash';\n\nimport {\n AppEvent,\n PanelEvents,\n PanelPluginMeta,\n AngularPanelMenuItem,\n EventBusExtended,\n EventBusSrv,\n} from '@grafana/data';\nimport { AngularLocationWrapper } from 'app/angular/AngularLocationWrapper';\nimport config from 'app/core/config';\nimport { profiler } from 'app/core/core';\n\nimport { DashboardModel } from '../../features/dashboard/state';\n\nexport class PanelCtrl {\n panel: any;\n error: any;\n declare dashboard: DashboardModel;\n pluginName = '';\n pluginId = '';\n editorTabs: any;\n $scope: any;\n $injector: auto.IInjectorService;\n $timeout: any;\n editModeInitiated = false;\n declare height: number;\n declare width: number;\n containerHeight: any;\n events: EventBusExtended;\n loading = false;\n timing: any;\n $location: AngularLocationWrapper;\n\n constructor($scope: any, $injector: auto.IInjectorService) {\n this.panel = this.panel ?? $scope.$parent.panel;\n this.dashboard = this.dashboard ?? $scope.$parent.dashboard;\n this.$injector = $injector;\n this.$scope = $scope;\n this.$timeout = $injector.get('$timeout');\n this.editorTabs = [];\n this.$location = new AngularLocationWrapper();\n this.events = new EventBusSrv();\n this.timing = {}; // not used but here to not break plugins\n\n const plugin = config.panels[this.panel.type];\n if (plugin) {\n this.pluginId = plugin.id;\n this.pluginName = plugin.name;\n }\n\n $scope.$on(PanelEvents.componentDidMount.name, () => this.panelDidMount());\n }\n\n panelDidMount() {\n this.events.emit(PanelEvents.componentDidMount);\n this.events.emit(PanelEvents.initialized);\n this.dashboard.panelInitialized(this.panel);\n }\n\n renderingCompleted() {\n profiler.renderingCompleted();\n }\n\n refresh() {\n this.panel.refresh();\n }\n\n publishAppEvent(event: AppEvent, payload?: T) {\n this.$scope.$root.appEvent(event, payload);\n }\n\n initEditMode() {\n if (!this.editModeInitiated) {\n this.editModeInitiated = true;\n this.events.emit(PanelEvents.editModeInitialized);\n }\n }\n\n addEditorTab(title: string, directiveFn: any, index?: number, icon?: any) {\n const editorTab = { title, directiveFn, icon };\n\n if (isString(directiveFn)) {\n editorTab.directiveFn = () => {\n return { templateUrl: directiveFn };\n };\n }\n\n if (index) {\n this.editorTabs.splice(index, 0, editorTab);\n } else {\n this.editorTabs.push(editorTab);\n }\n }\n\n getExtendedMenu() {\n const menu: AngularPanelMenuItem[] = [];\n this.events.emit(PanelEvents.initPanelActions, menu);\n return menu;\n }\n\n // Override in sub-class to add items before extended menu\n async getAdditionalMenuItems(): Promise {\n return [];\n }\n\n otherPanelInFullscreenMode() {\n return this.dashboard.otherPanelInFullscreen(this.panel);\n }\n\n render(payload?: any) {\n this.events.emit(PanelEvents.render, payload);\n }\n\n // overriden from react\n onPluginTypeChange = (plugin: PanelPluginMeta) => {};\n}\n","import { auto } from 'angular';\nimport { indexOf } from 'lodash';\n\nexport class QueryCtrl {\n target!: T;\n datasource!: any;\n panelCtrl!: any;\n panel: any;\n hasRawMode!: boolean;\n error?: string | null;\n isLastQuery: boolean;\n\n constructor(public $scope: any, public $injector: auto.IInjectorService) {\n this.panelCtrl = this.panelCtrl ?? $scope.ctrl.panelCtrl;\n this.target = this.target ?? $scope.ctrl.target;\n this.datasource = this.datasource ?? $scope.ctrl.datasource;\n this.panel = this.panelCtrl?.panel ?? $scope.ctrl.panelCtrl.panel;\n this.isLastQuery = indexOf(this.panel.targets, this.target) === this.panel.targets.length - 1;\n }\n\n refresh() {\n this.panelCtrl.refresh();\n }\n}\n","/**\n * Set of handlers for secure password field in Angular components. They handle backward compatibility with\n * passwords stored in plain text fields.\n */\n\nimport { SyntheticEvent } from 'react';\n\nexport enum PasswordFieldEnum {\n Password = 'password',\n BasicAuthPassword = 'basicAuthPassword',\n}\n\n/**\n * Basic shape for settings controllers in at the moment mostly angular data source plugins.\n */\nexport type Ctrl = {\n current: {\n secureJsonFields: {\n [key: string]: boolean;\n };\n secureJsonData?: {\n [key: string]: string;\n };\n password?: string;\n basicAuthPassword?: string;\n };\n};\n\nexport const createResetHandler =\n (ctrl: Ctrl, field: PasswordFieldEnum) => (event: SyntheticEvent) => {\n event.preventDefault();\n // Reset also normal plain text password to remove it and only save it in secureJsonData.\n ctrl.current[field] = undefined;\n ctrl.current.secureJsonFields[field] = false;\n ctrl.current.secureJsonData = ctrl.current.secureJsonData || {};\n ctrl.current.secureJsonData[field] = '';\n };\n\nexport const createChangeHandler =\n (ctrl: any, field: PasswordFieldEnum) => (event: SyntheticEvent) => {\n ctrl.current.secureJsonData = ctrl.current.secureJsonData || {};\n ctrl.current.secureJsonData[field] = event.currentTarget.value;\n };\n","import { makeClassES5Compatible } from '@grafana/data';\nimport { loadPluginCss } from '@grafana/runtime';\nimport { MetricsPanelCtrl as MetricsPanelCtrlES6 } from 'app/angular/panel/metrics_panel_ctrl';\nimport { PanelCtrl as PanelCtrlES6 } from 'app/angular/panel/panel_ctrl';\nimport { QueryCtrl as QueryCtrlES6 } from 'app/angular/panel/query_ctrl';\n\nconst PanelCtrl = makeClassES5Compatible(PanelCtrlES6);\nconst MetricsPanelCtrl = makeClassES5Compatible(MetricsPanelCtrlES6);\nconst QueryCtrl = makeClassES5Compatible(QueryCtrlES6);\n\nexport { PanelCtrl, MetricsPanelCtrl, QueryCtrl, loadPluginCss };\n"],"names":["DEFAULT_PORTS","http","https","ftp","AngularLocationWrapper","constructor","this","absUrl","wrapInDeprecationWarning","hash","host","path","port","protocol","replace","search","state","url","fn","replacement","self","deprecationWarning","name","apply","arguments","window","location","origin","newHash","navigationLogger","Error","locationService","slice","URL","href","hostname","pathname","parsedPath","String","startsWith","length","parseInt","paramValue","newQuery","locationSearchToObject","key","Object","keys","undefined","updatedUrl","urlUtil","newUrl","trim","SqlPartDef","options","type","label","toUpperCase","substring","style","wrapOpen","wrapClose","separator","params","defaultParams","SqlPart","part","def","message","datatype","clone","updateParam","strValue","index","optional","splice","MetricsPanelCtrl","PanelCtrl","$scope","$injector","super","next","data","panelData","LoadingState","loading","processDataError","error","angularDirtyCheck","request","timeInfo","timeRange","range","useDataFrames","handleDataFrames","series","legacy","map","v","toLegacyResponseData","handleQueryResult","contextSrv","get","datasourceSrv","timeSrv","templateSrv","panel","datasource","events","on","PanelEvents","onMetricsPanelRefresh","bind","onPanelTearDown","onMetricsPanelMounted","queryRunner","getQueryRunner","querySubscription","getData","withTransforms","withFieldConfig","subscribe","panelDataObserver","unsubscribe","otherPanelInFullscreenMode","snapshotData","updateTimeRange","isArray","$timeout","emit","scopedVars","then","issueQueries","catch","err","cancelled","console","log","$root","$$phase","$digest","newTimeData","applyPanelTimeOverrides","run","queries","targets","panelId","id","dashboardId","dashboard","timezone","getTimezone","maxDataPoints","width","minInterval","interval","cacheTimeout","transformations","snapshot","frame","toDataFrameDTO","result","plugin","$parent","editorTabs","$location","EventBusSrv","timing","config","pluginId","pluginName","$on","panelDidMount","panelInitialized","renderingCompleted","profiler","refresh","publishAppEvent","event","payload","appEvent","initEditMode","editModeInitiated","addEditorTab","title","directiveFn","icon","editorTab","isString","templateUrl","push","getExtendedMenu","menu","otherPanelInFullscreen","render","QueryCtrl","panelCtrl","ctrl","target","isLastQuery","indexOf","PasswordFieldEnum","createResetHandler","field","preventDefault","current","secureJsonFields","secureJsonData","createChangeHandler","currentTarget","value","makeClassES5Compatible","PanelCtrlES6","MetricsPanelCtrlES6","QueryCtrlES6"],"sourceRoot":""}