{"version":3,"file":"tableOldPlugin.b434b338e1e0c56c30c8.js","mappings":"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","sources":["webpack://grafana/./public/app/angular/AngularLocationWrapper.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/plugins/panel/table-old/column_options.ts","webpack://grafana/./public/app/plugins/panel/table-old/transformers.ts","webpack://grafana/./public/app/plugins/panel/table-old/editor.ts","webpack://grafana/./public/app/plugins/panel/table-old/renderer.ts","webpack://grafana/./public/app/plugins/panel/table-old/module.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 { 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 dashboardUID: this.dashboard.uid,\n timezone: this.dashboard.getTimezone(),\n timeInfo: this.timeInfo,\n timeRange: this.range,\n maxDataPoints: panel.maxDataPoints || this.width,\n minInterval: panel.interval,\n publicDashboardAccessToken: this.dashboard.meta.publicDashboardAccessToken,\n scopedVars: panel.scopedVars,\n cacheTimeout: panel.cacheTimeout,\n queryCachingTTL: panel.queryCachingTTL,\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","import { map, without } from 'lodash';\n\nimport { getValueFormats } from '@grafana/data';\n\nexport class ColumnOptionsCtrl {\n panel: any;\n panelCtrl: any;\n colorModes: any;\n columnStyles: any;\n columnTypes: any;\n fontSizes: any;\n dateFormats: any;\n addColumnSegment: any;\n unitFormats: any;\n getColumnNames: any;\n activeStyleIndex: number;\n mappingTypes: any;\n\n alignTypes: any;\n static readonly alignTypesEnum = [\n { text: 'auto', value: '' },\n { text: 'left', value: 'left' },\n { text: 'center', value: 'center' },\n { text: 'right', value: 'right' },\n ];\n\n static $inject = ['$scope'];\n\n constructor($scope: any) {\n $scope.editor = this;\n\n this.activeStyleIndex = 0;\n this.panelCtrl = $scope.ctrl;\n this.panel = this.panelCtrl.panel;\n this.unitFormats = getValueFormats();\n this.colorModes = [\n { text: 'Disabled', value: null },\n { text: 'Cell', value: 'cell' },\n { text: 'Value', value: 'value' },\n { text: 'Row', value: 'row' },\n ];\n this.columnTypes = [\n { text: 'Number', value: 'number' },\n { text: 'String', value: 'string' },\n { text: 'Date', value: 'date' },\n { text: 'Hidden', value: 'hidden' },\n ];\n this.fontSizes = ['80%', '90%', '100%', '110%', '120%', '130%', '150%', '160%', '180%', '200%', '220%', '250%'];\n this.dateFormats = [\n { text: 'YYYY-MM-DD HH:mm:ss', value: 'YYYY-MM-DD HH:mm:ss' },\n { text: 'YYYY-MM-DD HH:mm:ss.SSS', value: 'YYYY-MM-DD HH:mm:ss.SSS' },\n { text: 'MM/DD/YY h:mm:ss a', value: 'MM/DD/YY h:mm:ss a' },\n { text: 'MMMM D, YYYY LT', value: 'MMMM D, YYYY LT' },\n { text: 'YYYY-MM-DD', value: 'YYYY-MM-DD' },\n ];\n this.mappingTypes = [\n { text: 'Value to text', value: 1 },\n { text: 'Range to text', value: 2 },\n ];\n this.alignTypes = ColumnOptionsCtrl.alignTypesEnum;\n\n this.getColumnNames = () => {\n if (!this.panelCtrl.table) {\n return [];\n }\n return map(this.panelCtrl.table.columns, (col: any) => {\n return col.text;\n });\n };\n\n this.onColorChange = this.onColorChange.bind(this);\n }\n\n render() {\n this.panelCtrl.render();\n }\n\n setUnitFormat(column: any) {\n return (value: any) => {\n column.unit = value;\n this.panelCtrl.render();\n };\n }\n\n addColumnStyle() {\n const newStyleRule: object = {\n unit: 'short',\n type: 'number',\n alias: '',\n decimals: 2,\n colors: ['rgba(245, 54, 54, 0.9)', 'rgba(237, 129, 40, 0.89)', 'rgba(50, 172, 45, 0.97)'],\n colorMode: null,\n pattern: '',\n dateFormat: 'YYYY-MM-DD HH:mm:ss',\n thresholds: [],\n mappingType: 1,\n align: 'auto',\n };\n\n const styles = this.panel.styles;\n const stylesCount = styles.length;\n let indexToInsert = stylesCount;\n\n // check if last is a catch all rule, then add it before that one\n if (stylesCount > 0) {\n const last = styles[stylesCount - 1];\n if (last.pattern === '/.*/') {\n indexToInsert = stylesCount - 1;\n }\n }\n\n styles.splice(indexToInsert, 0, newStyleRule);\n this.activeStyleIndex = indexToInsert;\n }\n\n removeColumnStyle(style: any) {\n this.panel.styles = without(this.panel.styles, style);\n }\n\n invertColorOrder(index: number) {\n const ref = this.panel.styles[index].colors;\n const copy = ref[0];\n ref[0] = ref[2];\n ref[2] = copy;\n this.panelCtrl.render();\n }\n\n onColorChange(style: any, colorIndex: number) {\n return (newColor: string) => {\n style.colors[colorIndex] = newColor;\n this.render();\n };\n }\n\n addValueMap(style: any) {\n if (!style.valueMaps) {\n style.valueMaps = [];\n }\n style.valueMaps.push({ value: '', text: '' });\n this.panelCtrl.render();\n }\n\n removeValueMap(style: any, index: number) {\n style.valueMaps.splice(index, 1);\n this.panelCtrl.render();\n }\n\n addRangeMap(style: any) {\n if (!style.rangeMaps) {\n style.rangeMaps = [];\n }\n style.rangeMaps.push({ from: '', to: '', text: '' });\n this.panelCtrl.render();\n }\n\n removeRangeMap(style: any, index: number) {\n style.rangeMaps.splice(index, 1);\n this.panelCtrl.render();\n }\n}\n\nexport function columnOptionsTab() {\n 'use strict';\n return {\n restrict: 'E',\n scope: true,\n templateUrl: 'public/app/plugins/panel/table-old/column_options.html',\n controller: ColumnOptionsCtrl,\n };\n}\n","import { findIndex, isObject, map } from 'lodash';\n\nimport { Column, TableData } from '@grafana/data';\nimport TableModel, { mergeTablesIntoModel } from 'app/core/TableModel';\nimport TimeSeries from 'app/core/time_series2';\nimport flatten from 'app/core/utils/flatten';\n\nimport { TableTransform } from './types';\n\nconst transformers: { [key: string]: TableTransform } = {};\nexport const timeSeriesFormatFilterer = (data: any): any[] => {\n if (!Array.isArray(data)) {\n return data.datapoints ? [data] : [];\n }\n\n return data.reduce((acc, series) => {\n if (!series.datapoints) {\n return acc;\n }\n\n return acc.concat(series);\n }, []);\n};\n\nexport const tableDataFormatFilterer = (data: any): any[] => {\n if (!Array.isArray(data)) {\n return data.columns ? [data] : [];\n }\n\n return data.reduce((acc, series) => {\n if (!series.columns) {\n return acc;\n }\n\n return acc.concat(series);\n }, []);\n};\n\ntransformers['timeseries_to_rows'] = {\n description: 'Time series to rows',\n getColumns: () => {\n return [];\n },\n transform: (data, panel, model) => {\n model.columns = [{ text: 'Time', type: 'date' }, { text: 'Metric' }, { text: 'Value' }];\n const filteredData = timeSeriesFormatFilterer(data);\n\n for (let i = 0; i < filteredData.length; i++) {\n const series = filteredData[i];\n for (let y = 0; y < series.datapoints.length; y++) {\n const dp = series.datapoints[y];\n model.rows.push([dp[1], series.target, dp[0]]);\n }\n }\n },\n};\n\ntransformers['timeseries_to_columns'] = {\n description: 'Time series to columns',\n getColumns: () => {\n return [];\n },\n transform: (data, panel, model) => {\n model.columns.push({ text: 'Time', type: 'date' });\n\n // group by time\n const points: any = {};\n const filteredData = timeSeriesFormatFilterer(data);\n\n for (let i = 0; i < filteredData.length; i++) {\n const series = filteredData[i];\n model.columns.push({ text: series.target });\n\n for (let y = 0; y < series.datapoints.length; y++) {\n const dp = series.datapoints[y];\n const timeKey = dp[1].toString();\n\n if (!points[timeKey]) {\n points[timeKey] = { time: dp[1] };\n points[timeKey][i] = dp[0];\n } else {\n points[timeKey][i] = dp[0];\n }\n }\n }\n\n for (const time in points) {\n const point = points[time];\n const values = [point.time];\n\n for (let i = 0; i < filteredData.length; i++) {\n const value = point[i];\n values.push(value);\n }\n\n model.rows.push(values);\n }\n },\n};\n\ntransformers['timeseries_aggregations'] = {\n description: 'Time series aggregations',\n getColumns: () => {\n return [\n { text: 'Avg', value: 'avg' },\n { text: 'Min', value: 'min' },\n { text: 'Max', value: 'max' },\n { text: 'Total', value: 'total' },\n { text: 'Current', value: 'current' },\n { text: 'Count', value: 'count' },\n ];\n },\n transform: (data, panel, model) => {\n let i, y;\n model.columns.push({ text: 'Metric' });\n\n for (i = 0; i < panel.columns.length; i++) {\n model.columns.push({ text: panel.columns[i].text });\n }\n\n const filteredData = timeSeriesFormatFilterer(data);\n\n for (i = 0; i < filteredData.length; i++) {\n const series = new TimeSeries({\n datapoints: filteredData[i].datapoints,\n alias: filteredData[i].target,\n });\n\n series.getFlotPairs('connected');\n const cells = [series.alias];\n\n for (y = 0; y < panel.columns.length; y++) {\n cells.push(series.stats[panel.columns[y].value]);\n }\n\n model.rows.push(cells);\n }\n },\n};\n\ntransformers['annotations'] = {\n description: 'Annotations',\n getColumns: () => {\n return [];\n },\n transform: (data, panel, model) => {\n model.columns.push({ text: 'Time', type: 'date' });\n model.columns.push({ text: 'Title' });\n model.columns.push({ text: 'Text' });\n model.columns.push({ text: 'Tags' });\n\n if (!data || !data.annotations || data.annotations.length === 0) {\n return;\n }\n\n for (let i = 0; i < data.annotations.length; i++) {\n const evt = data.annotations[i];\n model.rows.push([evt.time, evt.title, evt.text, evt.tags]);\n }\n },\n};\n\ntransformers['table'] = {\n description: 'Table',\n getColumns: (data) => {\n if (!data || data.length === 0) {\n return [];\n }\n\n // Single query returns data columns as is\n if (data.length === 1) {\n return [...data[0].columns];\n }\n\n const filteredData = tableDataFormatFilterer(data);\n\n // Track column indexes: name -> index\n const columnNames: any = {};\n\n // Union of all columns\n const columns = filteredData.reduce((acc: Column[], series: TableData) => {\n series.columns.forEach((col) => {\n const { text } = col;\n if (columnNames[text] === undefined) {\n columnNames[text] = acc.length;\n acc.push(col);\n }\n });\n return acc;\n }, []);\n\n return columns;\n },\n transform: (data: any[], panel, model) => {\n if (!data || data.length === 0) {\n return;\n }\n const filteredData = tableDataFormatFilterer(data);\n const noTableIndex = findIndex(filteredData, (d) => 'columns' in d && 'rows' in d);\n if (noTableIndex < 0) {\n throw {\n message: `Result of query #${String.fromCharCode(\n 65 + noTableIndex\n )} is not in table format, try using another transform.`,\n };\n }\n\n mergeTablesIntoModel(model, ...filteredData);\n },\n};\n\ntransformers['json'] = {\n description: 'JSON Data',\n getColumns: (data) => {\n if (!data || data.length === 0) {\n return [];\n }\n\n const names: any = {};\n for (let i = 0; i < data.length; i++) {\n const series = data[i];\n if (series.type !== 'docs') {\n continue;\n }\n\n // only look at 100 docs\n const maxDocs = Math.min(series.datapoints.length, 100);\n for (let y = 0; y < maxDocs; y++) {\n const doc = series.datapoints[y];\n const flattened = flatten(doc, {});\n for (const propName in flattened) {\n names[propName] = true;\n }\n }\n }\n\n return map(names, (value, key) => {\n return { text: key, value: key };\n });\n },\n transform: (data, panel, model) => {\n let i, y, z;\n\n for (const column of panel.columns) {\n const tableCol: any = { text: column.text };\n\n // if filterable data then set columns to filterable\n if (data.length > 0 && data[0].filterable) {\n tableCol.filterable = true;\n }\n\n model.columns.push(tableCol);\n }\n\n if (model.columns.length === 0) {\n model.columns.push({ text: 'JSON' });\n }\n\n for (i = 0; i < data.length; i++) {\n const series = data[i];\n\n for (y = 0; y < series.datapoints.length; y++) {\n const dp = series.datapoints[y];\n const values = [];\n\n if (isObject(dp) && panel.columns.length > 0) {\n const flattened = flatten(dp);\n for (z = 0; z < panel.columns.length; z++) {\n values.push(flattened[panel.columns[z].value]);\n }\n } else {\n values.push(JSON.stringify(dp));\n }\n\n model.rows.push(values);\n }\n }\n },\n};\n\nfunction transformDataToTable(data: any, panel: any) {\n const model = new TableModel();\n\n if (!data || data.length === 0) {\n return model;\n }\n\n const transformer = transformers[panel.transform];\n if (!transformer) {\n throw { message: 'Transformer ' + panel.transform + ' not found' };\n }\n\n transformer.transform(data, panel, model);\n return model;\n}\n\nexport { transformers, transformDataToTable };\n","import { find, map, without } from 'lodash';\n\nimport { transformers } from './transformers';\nimport { ColumnStyle } from './types';\n\nexport class TablePanelEditorCtrl {\n panel: any;\n panelCtrl: any;\n transformers: any;\n fontSizes: any;\n addColumnSegment: any;\n getColumnNames: any;\n canSetColumns = false;\n columnsHelpMessage = '';\n\n static $inject = ['$scope', 'uiSegmentSrv'];\n\n constructor($scope: any, private uiSegmentSrv: any) {\n $scope.editor = this;\n this.panelCtrl = $scope.ctrl;\n this.panel = this.panelCtrl.panel;\n this.transformers = transformers;\n this.fontSizes = ['80%', '90%', '100%', '110%', '120%', '130%', '150%', '160%', '180%', '200%', '220%', '250%'];\n this.addColumnSegment = uiSegmentSrv.newPlusButton();\n this.updateTransformHints();\n }\n\n updateTransformHints() {\n this.canSetColumns = false;\n this.columnsHelpMessage = '';\n\n switch (this.panel.transform) {\n case 'timeseries_aggregations': {\n this.canSetColumns = true;\n break;\n }\n case 'json': {\n this.canSetColumns = true;\n break;\n }\n case 'table': {\n this.columnsHelpMessage = 'Columns and their order are determined by the data query';\n }\n }\n }\n\n getColumnOptions() {\n if (!this.panelCtrl.dataRaw) {\n return Promise.resolve([]);\n }\n const columns = this.transformers[this.panel.transform].getColumns(this.panelCtrl.dataRaw);\n const segments = map(columns, (c: any) => this.uiSegmentSrv.newSegment({ value: c.text }));\n return Promise.resolve(segments);\n }\n\n addColumn() {\n const columns = transformers[this.panel.transform].getColumns(this.panelCtrl.dataRaw);\n const column: any = find(columns, { text: this.addColumnSegment.value });\n\n if (column) {\n this.panel.columns.push(column);\n this.render();\n }\n\n const plusButton = this.uiSegmentSrv.newPlusButton();\n this.addColumnSegment.html = plusButton.html;\n this.addColumnSegment.value = plusButton.value;\n }\n\n transformChanged() {\n this.panel.columns = [];\n if (this.panel.transform === 'annotations') {\n this.panelCtrl.refresh();\n } else {\n if (this.panel.transform === 'timeseries_aggregations') {\n this.panel.columns.push({ text: 'Avg', value: 'avg' });\n }\n\n this.updateTransformHints();\n this.render();\n }\n }\n\n render() {\n this.panelCtrl.render();\n }\n\n removeColumn(column: ColumnStyle) {\n this.panel.columns = without(this.panel.columns, column);\n this.panelCtrl.render();\n }\n}\n\nexport function tablePanelEditor(uiSegmentSrv: any) {\n 'use strict';\n return {\n restrict: 'E',\n scope: true,\n templateUrl: 'public/app/plugins/panel/table-old/editor.html',\n controller: TablePanelEditorCtrl,\n };\n}\n","import { find, first, isArray, isString, escape } from 'lodash';\n\nimport {\n escapeStringForRegex,\n formattedValueToString,\n getValueFormat,\n ScopedVars,\n stringStartsAsRegEx,\n stringToJsRegex,\n textUtil,\n unEscapeStringFromRegex,\n TimeZone,\n dateTimeFormatISO,\n dateTimeFormat,\n GrafanaTheme2,\n} from '@grafana/data';\nimport { getTemplateSrv, TemplateSrv } from '@grafana/runtime';\n\nimport { ColumnOptionsCtrl } from './column_options';\nimport { ColumnRender, TableRenderModel, ColumnStyle } from './types';\n\nexport class TableRenderer {\n formatters: any[] = [];\n colorState: any;\n\n constructor(\n private panel: { styles: ColumnStyle[]; pageSize: number },\n private table: TableRenderModel,\n private timeZone: TimeZone,\n private sanitize: (v: any) => any,\n private templateSrv: TemplateSrv = getTemplateSrv(),\n private theme: GrafanaTheme2\n ) {\n this.initColumns();\n }\n\n setTable(table: TableRenderModel) {\n this.table = table;\n\n this.initColumns();\n }\n\n initColumns() {\n this.formatters = [];\n this.colorState = {};\n\n for (let colIndex = 0; colIndex < this.table.columns.length; colIndex++) {\n const column = this.table.columns[colIndex];\n column.title = column.text;\n\n for (let i = 0; i < this.panel.styles.length; i++) {\n const style = this.panel.styles[i];\n\n const escapedPattern = stringStartsAsRegEx(style.pattern)\n ? style.pattern\n : escapeStringForRegex(unEscapeStringFromRegex(style.pattern));\n const regex = stringToJsRegex(escapedPattern);\n if (column.text.match(regex)) {\n column.style = style;\n\n if (style.alias) {\n column.title = textUtil.escapeHtml(column.text.replace(regex, style.alias));\n }\n\n break;\n }\n }\n\n this.formatters[colIndex] = this.createColumnFormatter(column);\n }\n }\n\n getColorForValue(value: number, style: ColumnStyle) {\n if (!style.thresholds || !style.colors) {\n return null;\n }\n for (let i = style.thresholds.length; i > 0; i--) {\n if (value >= style.thresholds[i - 1]) {\n return this.theme.visualization.getColorByName(style.colors[i]);\n }\n }\n return this.theme.visualization.getColorByName(first(style.colors));\n }\n\n defaultCellFormatter(v: any, style: ColumnStyle) {\n if (v === null || v === void 0 || v === undefined) {\n return '';\n }\n\n if (isArray(v)) {\n v = v.join(', ');\n }\n\n if (style && style.sanitize) {\n return this.sanitize(v);\n } else {\n return escape(v);\n }\n }\n\n createColumnFormatter(column: ColumnRender) {\n if (!column.style) {\n return this.defaultCellFormatter;\n }\n\n if (column.style.type === 'hidden') {\n return (v: any): undefined => undefined;\n }\n\n if (column.style.type === 'date') {\n return (v: any) => {\n if (v === undefined || v === null) {\n return '-';\n }\n\n if (isArray(v)) {\n v = v[0];\n }\n\n // if is an epoch (numeric string and len > 12)\n if (isString(v) && !isNaN(v as any) && v.length > 12) {\n v = parseInt(v, 10);\n }\n\n if (!column.style.dateFormat) {\n return dateTimeFormatISO(v, {\n timeZone: this.timeZone,\n });\n }\n\n return dateTimeFormat(v, {\n format: column.style.dateFormat,\n timeZone: this.timeZone,\n });\n };\n }\n\n if (column.style.type === 'string') {\n return (v: any): any => {\n if (isArray(v)) {\n v = v.join(', ');\n }\n\n const mappingType = column.style.mappingType || 0;\n\n if (mappingType === 1 && column.style.valueMaps) {\n for (let i = 0; i < column.style.valueMaps.length; i++) {\n const map = column.style.valueMaps[i];\n\n if (v === null) {\n if (map.value === 'null') {\n return map.text;\n }\n continue;\n }\n\n // Allow both numeric and string values to be mapped\n if ((!isString(v) && Number(map.value) === Number(v)) || map.value === v) {\n this.setColorState(v, column.style);\n return this.defaultCellFormatter(map.text, column.style);\n }\n }\n }\n\n if (mappingType === 2 && column.style.rangeMaps) {\n for (let i = 0; i < column.style.rangeMaps.length; i++) {\n const map = column.style.rangeMaps[i];\n\n if (v === null) {\n if (map.from === 'null' && map.to === 'null') {\n return map.text;\n }\n continue;\n }\n\n if (Number(map.from) <= Number(v) && Number(map.to) >= Number(v)) {\n this.setColorState(v, column.style);\n return this.defaultCellFormatter(map.text, column.style);\n }\n }\n }\n\n if (v === null || v === void 0) {\n return '-';\n }\n\n this.setColorState(v, column.style);\n return this.defaultCellFormatter(v, column.style);\n };\n }\n\n if (column.style.type === 'number') {\n const valueFormatter = getValueFormat(column.unit || column.style.unit);\n\n return (v: any): any => {\n if (v === null || v === void 0) {\n return '-';\n }\n\n if (isNaN(v) || isArray(v)) {\n return this.defaultCellFormatter(v, column.style);\n }\n\n this.setColorState(v, column.style);\n return formattedValueToString(valueFormatter(v, column.style.decimals, null));\n };\n }\n\n return (value: any) => {\n return this.defaultCellFormatter(value, column.style);\n };\n }\n\n setColorState(value: any, style: ColumnStyle) {\n if (!style.colorMode) {\n return;\n }\n\n if (value === null || value === void 0 || isArray(value)) {\n return;\n }\n\n const numericValue = Number(value);\n if (isNaN(numericValue)) {\n return;\n }\n\n this.colorState[style.colorMode] = this.getColorForValue(numericValue, style);\n }\n\n renderRowVariables(rowIndex: number) {\n const scopedVars: ScopedVars = {};\n let cellVariable;\n const row = this.table.rows[rowIndex];\n for (let i = 0; i < row.length; i++) {\n cellVariable = `__cell_${i}`;\n scopedVars[cellVariable] = { value: row[i], text: row[i] ? row[i].toString() : '' };\n }\n return scopedVars;\n }\n\n formatColumnValue(colIndex: number, value: any) {\n const fmt = this.formatters[colIndex];\n if (fmt) {\n return fmt(value);\n }\n return value;\n }\n\n renderCell(columnIndex: number, rowIndex: number, value: any, addWidthHack = false) {\n value = this.formatColumnValue(columnIndex, value);\n\n const column = this.table.columns[columnIndex];\n const cellStyles = [];\n let cellStyle = '';\n const cellClasses = [];\n let cellClass = '';\n\n if (this.colorState.cell) {\n cellStyles.push('background-color:' + this.colorState.cell);\n cellClasses.push('table-panel-color-cell');\n this.colorState.cell = null;\n } else if (this.colorState.value) {\n cellStyles.push('color:' + this.colorState.value);\n this.colorState.value = null;\n }\n // because of the fixed table headers css only solution\n // there is an issue if header cell is wider the cell\n // this hack adds header content to cell (not visible)\n let columnHtml = '';\n if (addWidthHack) {\n columnHtml = '
' + this.table.columns[columnIndex].title + '
';\n }\n\n if (value === undefined) {\n cellStyles.push('display:none');\n column.hidden = true;\n } else {\n column.hidden = false;\n }\n\n if (column.hidden === true) {\n return '';\n }\n\n if (column.style && column.style.preserveFormat) {\n cellClasses.push('table-panel-cell-pre');\n }\n\n if (column.style && column.style.align) {\n const textAlign = find(ColumnOptionsCtrl.alignTypesEnum, ['text', column.style.align]);\n if (textAlign && textAlign['value']) {\n cellStyles.push(`text-align:${textAlign['value']}`);\n }\n }\n\n if (cellStyles.length) {\n cellStyle = ' style=\"' + cellStyles.join(';') + '\"';\n }\n\n if (column.style && column.style.link) {\n // Render cell as link\n const scopedVars = this.renderRowVariables(rowIndex);\n scopedVars['__cell'] = { value: value, text: value ? value.toString() : '' };\n\n const cellLink = this.templateSrv.replace(column.style.linkUrl, scopedVars, encodeURIComponent);\n const sanitizedCellLink = textUtil.sanitizeUrl(cellLink);\n\n const cellLinkTooltip = textUtil.escapeHtml(this.templateSrv.replace(column.style.linkTooltip, scopedVars));\n const cellTarget = column.style.linkTargetBlank ? '_blank' : '';\n\n cellClasses.push('table-panel-cell-link');\n\n columnHtml += ``;\n columnHtml += `${value}`;\n columnHtml += ``;\n } else {\n columnHtml += value;\n }\n\n if (column.filterable) {\n cellClasses.push('table-panel-cell-filterable');\n columnHtml += ``;\n columnHtml += ``;\n columnHtml += ``;\n columnHtml += ``;\n columnHtml += ``;\n columnHtml += ``;\n }\n\n if (cellClasses.length) {\n cellClass = ' class=\"' + cellClasses.join(' ') + '\"';\n }\n\n columnHtml = '' + columnHtml + '';\n return columnHtml;\n }\n\n render(page: number) {\n const pageSize = this.panel.pageSize || 100;\n const startPos = page * pageSize;\n const endPos = Math.min(startPos + pageSize, this.table.rows.length);\n let html = '';\n\n for (let y = startPos; y < endPos; y++) {\n const row = this.table.rows[y];\n let cellHtml = '';\n let rowStyle = '';\n const rowClasses = [];\n let rowClass = '';\n for (let i = 0; i < this.table.columns.length; i++) {\n cellHtml += this.renderCell(i, y, row[i], y === startPos);\n }\n\n if (this.colorState.row) {\n rowStyle = ' style=\"background-color:' + this.colorState.row + '\"';\n rowClasses.push('table-panel-color-row');\n this.colorState.row = null;\n }\n\n if (rowClasses.length) {\n rowClass = ' class=\"' + rowClasses.join(' ') + '\"';\n }\n\n html += '' + cellHtml + '';\n }\n\n return html;\n }\n\n render_values() {\n const rows = [];\n const visibleColumns = this.table.columns.filter((column) => !column.hidden);\n\n for (let y = 0; y < this.table.rows.length; y++) {\n const row = this.table.rows[y];\n const newRow = [];\n for (let i = 0; i < this.table.columns.length; i++) {\n if (!this.table.columns[i].hidden) {\n newRow.push(this.formatColumnValue(i, row[i]));\n }\n }\n rows.push(newRow);\n }\n return {\n columns: visibleColumns,\n rows: rows,\n };\n }\n}\n","import $ from 'jquery';\nimport { defaults } from 'lodash';\nimport { ComponentType } from 'react';\n\nimport { isTableData, PanelEvents, PanelPlugin, PanelProps } from '@grafana/data';\nimport config from 'app/core/config';\nimport { applyFilterFromTable } from 'app/features/variables/adhoc/actions';\nimport { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport { dispatch } from 'app/store/store';\n\nimport { columnOptionsTab } from './column_options';\nimport { tablePanelEditor } from './editor';\nimport { TableRenderer } from './renderer';\nimport { transformDataToTable } from './transformers';\n\nexport class TablePanelCtrl extends MetricsPanelCtrl {\n static templateUrl = 'module.html';\n\n pageIndex: number;\n dataRaw: any;\n table: any;\n renderer: any;\n panelHasRowColorMode: boolean;\n panelHasLinks: boolean;\n\n panelDefaults: any = {\n targets: [{}],\n transform: 'timeseries_to_columns',\n pageSize: null,\n showHeader: true,\n styles: [\n {\n type: 'date',\n pattern: 'Time',\n alias: 'Time',\n dateFormat: 'YYYY-MM-DD HH:mm:ss',\n align: 'auto',\n },\n {\n unit: 'short',\n type: 'number',\n alias: '',\n decimals: 2,\n colors: ['rgba(245, 54, 54, 0.9)', 'rgba(237, 129, 40, 0.89)', 'rgba(50, 172, 45, 0.97)'],\n colorMode: null,\n pattern: '/.*/',\n thresholds: [],\n align: 'right',\n },\n ],\n columns: [],\n\n fontSize: '100%',\n sort: { col: 0, desc: true },\n };\n\n static $inject = ['$scope', '$injector', 'annotationsSrv', '$sanitize'];\n\n constructor($scope: any, $injector: any, private annotationsSrv: any, private $sanitize: any) {\n super($scope, $injector);\n\n this.pageIndex = 0;\n\n if (this.panel.styles === void 0) {\n this.panel.styles = this.panel.columns;\n this.panel.columns = this.panel.fields;\n delete this.panel.columns;\n delete this.panel.fields;\n }\n\n defaults(this.panel, this.panelDefaults);\n\n this.panelHasRowColorMode = Boolean(this.panel.styles.find((style: any) => style.colorMode === 'row'));\n this.panelHasLinks = Boolean(this.panel.styles.find((style: any) => style.link));\n\n this.events.on(PanelEvents.dataReceived, this.onDataReceived.bind(this));\n this.events.on(PanelEvents.dataSnapshotLoad, this.onDataReceived.bind(this));\n this.events.on(PanelEvents.editModeInitialized, this.onInitEditMode.bind(this));\n }\n\n onInitEditMode() {\n this.addEditorTab('Options', tablePanelEditor, 2);\n this.addEditorTab('Column Styles', columnOptionsTab, 3);\n }\n\n migrateToPanel(type: string) {\n this.onPluginTypeChange(config.panels[type]);\n }\n\n issueQueries(datasource: any) {\n this.pageIndex = 0;\n\n if (this.panel.transform === 'annotations') {\n return this.annotationsSrv\n .getAnnotations({\n dashboard: this.dashboard,\n panel: this.panel,\n range: this.range,\n })\n .then((anno: any) => {\n this.loading = false;\n this.dataRaw = anno;\n this.pageIndex = 0;\n this.render();\n return { data: this.dataRaw }; // Not used\n });\n }\n\n return super.issueQueries(datasource);\n }\n\n onDataReceived(dataList: any) {\n this.dataRaw = dataList;\n this.pageIndex = 0;\n\n // automatically correct transform mode based on data\n if (this.dataRaw && this.dataRaw.length) {\n if (isTableData(this.dataRaw[0])) {\n this.panel.transform = 'table';\n } else {\n if (this.dataRaw[0].type === 'docs') {\n this.panel.transform = 'json';\n } else {\n if (this.panel.transform === 'table' || this.panel.transform === 'json') {\n this.panel.transform = 'timeseries_to_rows';\n }\n }\n }\n }\n\n this.render();\n }\n\n render() {\n this.table = transformDataToTable(this.dataRaw, this.panel);\n this.table.sort(this.panel.sort);\n\n this.renderer = new TableRenderer(\n this.panel,\n this.table,\n this.dashboard.getTimezone(),\n this.$sanitize,\n this.templateSrv,\n config.theme2\n );\n\n return super.render(this.table);\n }\n\n toggleColumnSort(col: any, colIndex: any) {\n // remove sort flag from current column\n if (this.table.columns[this.panel.sort.col]) {\n this.table.columns[this.panel.sort.col].sort = false;\n }\n\n if (this.panel.sort.col === colIndex) {\n if (this.panel.sort.desc) {\n this.panel.sort.desc = false;\n } else {\n this.panel.sort.col = null;\n }\n } else {\n this.panel.sort.col = colIndex;\n this.panel.sort.desc = true;\n }\n this.render();\n }\n\n link(scope: any, elem: JQuery, attrs: any, ctrl: TablePanelCtrl) {\n let data: any;\n const panel = ctrl.panel;\n let pageCount = 0;\n\n function getTableHeight() {\n let panelHeight = ctrl.height;\n\n if (pageCount > 1) {\n panelHeight -= 26;\n }\n\n return panelHeight - 31 + 'px';\n }\n\n function appendTableRows(tbodyElem: JQuery) {\n ctrl.renderer.setTable(data);\n tbodyElem.empty();\n tbodyElem.html(ctrl.renderer.render(ctrl.pageIndex));\n }\n\n function switchPage(e: any) {\n const el = $(e.currentTarget);\n ctrl.pageIndex = parseInt(el.text(), 10) - 1;\n renderPanel();\n }\n\n function appendPaginationControls(footerElem: JQuery) {\n footerElem.empty();\n\n const pageSize = panel.pageSize || 100;\n pageCount = Math.ceil(data.rows.length / pageSize);\n if (pageCount === 1) {\n return;\n }\n\n const startPage = Math.max(ctrl.pageIndex - 3, 0);\n const endPage = Math.min(pageCount, startPage + 9);\n\n const paginationList = $('
    ');\n\n for (let i = startPage; i < endPage; i++) {\n const activeClass = i === ctrl.pageIndex ? 'active' : '';\n const pageLinkElem = $(\n '
  • ' + (i + 1) + '
  • '\n );\n paginationList.append(pageLinkElem);\n }\n\n footerElem.append(paginationList);\n }\n\n function renderPanel() {\n const panelElem = elem.parents('.panel-content');\n const rootElem = elem.find('.table-panel-scroll');\n const tbodyElem = elem.find('tbody');\n const footerElem = elem.find('.table-panel-footer');\n\n elem.css({ 'font-size': panel.fontSize });\n panelElem.addClass('table-panel-content');\n\n appendTableRows(tbodyElem);\n appendPaginationControls(footerElem);\n\n rootElem.css({ 'max-height': getTableHeight() });\n }\n\n // hook up link tooltips\n elem.tooltip({\n selector: '[data-link-tooltip]',\n });\n\n function addFilterClicked(e: any) {\n const filterData = $(e.currentTarget).data();\n const options = {\n datasource: panel.datasource,\n key: data.columns[filterData.column].text,\n value: data.rows[filterData.row][filterData.column],\n operator: filterData.operator,\n };\n\n dispatch(applyFilterFromTable(options));\n }\n\n elem.on('click', '.table-panel-page-link', switchPage);\n elem.on('click', '.table-panel-filter-link', addFilterClicked);\n\n const unbindDestroy = scope.$on('$destroy', () => {\n elem.off('click', '.table-panel-page-link');\n elem.off('click', '.table-panel-filter-link');\n unbindDestroy();\n });\n\n ctrl.events.on(PanelEvents.render, (renderData: any) => {\n data = renderData || data;\n if (data) {\n renderPanel();\n }\n ctrl.renderingCompleted();\n });\n }\n}\n\nexport const plugin = new PanelPlugin(null as unknown as ComponentType>);\nplugin.angularPanelCtrl = TablePanelCtrl;\nplugin.setNoPadding();\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","AngularLocationWrapper","fn","replacement","self","newHash","pathname","location","parsedPath","url","search","paramValue","newQuery","key","updatedUrl","state","newUrl","MetricsPanelCtrl","$scope","$injector","data","timeInfo","legacy","v","queryRunner","err","datasource","newTimeData","panel","frame","result","PanelCtrl","plugin","event","payload","title","directiveFn","index","icon","editorTab","menu","QueryCtrl","col","column","value","newStyleRule","styles","stylesCount","indexToInsert","style","ref","copy","colorIndex","newColor","ColumnOptionsCtrl","columnOptionsTab","transformers","timeSeriesFormatFilterer","acc","series","tableDataFormatFilterer","model","filteredData","i","y","dp","points","timeKey","time","point","values","cells","evt","columnNames","text","noTableIndex","d","names","maxDocs","doc","flattened","flatten","propName","z","tableCol","transformDataToTable","TableModel","transformer","TablePanelEditorCtrl","uiSegmentSrv","columns","segments","c","plusButton","tablePanelEditor","TableRenderer","table","timeZone","sanitize","templateSrv","theme","colIndex","escapedPattern","string","regex","mappingType","map","valueFormatter","numericValue","rowIndex","scopedVars","cellVariable","row","fmt","columnIndex","addWidthHack","cellStyles","cellStyle","cellClasses","cellClass","columnHtml","textAlign","cellLink","sanitizedCellLink","cellLinkTooltip","cellTarget","page","pageSize","startPos","endPos","html","cellHtml","rowStyle","rowClasses","rowClass","rows","visibleColumns","newRow","TablePanelCtrl","annotationsSrv","$sanitize","type","config","anno","dataList","scope","elem","attrs","ctrl","pageCount","getTableHeight","panelHeight","appendTableRows","tbodyElem","switchPage","e","el","renderPanel","appendPaginationControls","footerElem","startPage","endPage","paginationList","activeClass","pageLinkElem","panelElem","rootElem","addFilterClicked","filterData","options","unbindDestroy","renderData","PanelPlugin"],"sourceRoot":""}