{"version":3,"sources":["webpack:///./public/app/features/profile/state/selectors.ts","webpack:///./public/app/features/explore/state/selectors.ts","webpack:///./public/app/core/components/Animations/FadeIn.tsx","webpack:///./public/app/features/explore/state/actions.ts","webpack:///./public/app/core/components/Select/DataSourcePicker.tsx","webpack:///./node_modules/react-virtualized-auto-sizer/dist/index.esm.js","webpack:///./public/app/core/utils/richHistory.ts"],"names":["getTimeZone","state","timeZone","deduplicatedRowsSelector","createSelector","logsResult","rows","hiddenLogLevels","dedupStrategy","length","filteredRows","filterLogLevels","Set","dedupLogRows","getExploreDatasources","getDatasourceSrv","getExternal","map","ds","value","name","meta","FadeIn","props","defaultStyle","transition","duration","opacity","transitionStyles","exited","display","entering","entered","exiting","in","timeout","unmountOnExit","onExited","style","children","updateExploreUIState","exploreId","uiStateFragment","dispatch","updateUIStateAction","stateSave","addQueryRow","index","getState","queries","explore","query","generateEmptyQuery","addQueryRowAction","changeDatasource","datasource","newDataSourceInstance","get","currentDataSourceInstance","datasourceInstance","orgId","user","getVersion","datasourceVersion","prometheusToLoki","updateDatasourceInstanceAction","version","mode","ExploreMode","Logs","undefined","importQueries","isLive","changeRefreshInterval","RefreshPicker","offOption","loadDatasource","runQueries","changeMode","changeModeAction","changeQuery","override","refId","key","generateNewKeyAndAddRefIdIfMissing","changeQueryAction","changeSize","height","width","changeSizeAction","updateTimeRange","options","syncedTimes","updateTime","ExploreId","left","right","refreshInterval","changeRefreshIntervalAction","clearQueries","scanStopAction","clearQueriesAction","loadExploreDatasourcesAndSetDatasource","datasourceName","loadDatasourceMissingAction","initializeExplore","range","containerWidth","eventBridge","ui","originPanelId","initializeExploreAction","richHistory","getRichHistory","richHistoryUpdatedAction","loadDatasourceReady","instance","historyKey","id","history","store","getObject","set","lastUsedDatasourceKeyForOrgId","loadDatasourceReadyAction","sourceDataSource","targetDataSource","queriesImportedAction","importedQueries","ensureQueries","nextQueries","loadDatasourcePendingAction","requestedDatasourceName","init","err","console","log","modifyQueries","modification","modifier","modifyQueriesAction","preventSubmit","exploreItemState","live","scanning","queryResponse","querySubscription","showingGraph","showingTable","hasNonEmptyQuery","minInterval","interval","stopQueryState","datasourceId","queryOptions","maxDataPoints","liveStreaming","transaction","buildQueryTransaction","firstResponse","newQuerySub","runRequest","request","pipe","throttleTime","identity","data","preProcessPanelData","subscribe","error","nextHistory","updateHistory","arrayOfStringifiedQueries","getQueryDisplayText","nextRichHistory","addToRichHistory","historyUpdatedAction","queryStreamUpdatedAction","response","LoadingState","Done","series","getShiftedTimeRange","absoluteRange","queryStoreSubscriptionAction","updateRichHistory","ts","property","updatedProperty","updateStarredInRichHistory","updateCommentInRichHistory","deleteQueryInRichHistory","deleteRichHistory","deleteAllFromRichHistory","toRawTimeRange","from","raw","isDateTime","valueOf","toString","to","split","replace","urlReplaced","urlStates","leftUrlState","clearQueryKeys","showingLogs","serializeStateToUrlParam","rightUrlState","updateLocation","setUrlReplacedAction","config","absRange","actionRange","rawRange","itemState","dateTimeForTimeZone","getTimeRange","getTimeSrv","time","refresh","getTimezone","timeRangeUpdated","changeRangeAction","scanStart","scanStartAction","setQueries","rawQueries","setQueriesAction","splitClose","itemId","splitCloseAction","splitOpen","leftState","queryState","location","urlState","parseUrlState","slice","splitOpenAction","syncTimes","rightState","isTimeSynced","syncTimesAction","togglePanelActionCreator","actionCreator","isPanelVisible","uiFragmentStateUpdate","shouldRunQueries","type","toggleGraphAction","toggleTableAction","toggleGraph","toggleTable","changeDedupStrategy","refreshExplore","initialized","update","urlRange","refreshQueries","push","getTimeRangeFromUrl","initialQueries","navigateToExplore","panel","dependencies","getDataSourceSrv","getExploreUrl","openInNewWindow","datasourceSrv","panelTargets","targets","panelDatasource","timeSrv","path","DataSourcePicker","onChange","item","datasources","find","this","current","autoFocus","hideTextValue","onBlur","openMenuOnFocus","showLoading","label","imgUrl","info","logos","small","substr","loading","hideText","className","isMulti","isClearable","backspaceRemovesValue","maxMenuHeight","placeholder","noOptionsMessage","PureComponent","defaultProps","createDetectElementResize","nonce","_window","window","self","global","cancel","raf","attachEvent","document","requestFrame","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","fn","setTimeout","cancelFrame","cancelAnimationFrame","mozCancelAnimationFrame","webkitCancelAnimationFrame","clearTimeout","resetTriggers","element","triggers","__resizeTriggers__","expand","firstElementChild","contract","lastElementChild","expandChild","scrollLeft","scrollWidth","scrollTop","scrollHeight","offsetWidth","offsetHeight","scrollListener","e","target","indexOf","__resizeRAF__","__resizeLast__","checkTriggers","__resizeListeners__","forEach","call","animation","keyframeprefix","animationstartevent","domPrefixes","startEvents","elm","createElement","animationName","i","toLowerCase","animationKeyframes","animationStyle","addResizeListener","doc","ownerDocument","elementStyle","getComputedStyle","position","getElementById","css","head","getElementsByTagName","setAttribute","styleSheet","cssText","appendChild","createTextNode","createStyles","innerHTML","addEventListener","__animationListener__","removeResizeListener","detachEvent","splice","removeEventListener","removeChild","classCallCheck","Constructor","TypeError","createClass","defineProperties","descriptor","enumerable","configurable","writable","Object","defineProperty","protoProps","staticProps","prototype","_extends","assign","arguments","source","hasOwnProperty","possibleConstructorReturn","ReferenceError","AutoSizer","_React$PureComponent","_ref","_temp","_this","_len","args","Array","_key","__proto__","getPrototypeOf","apply","concat","defaultHeight","defaultWidth","_onResize","_this$props","disableHeight","disableWidth","onResize","_parentNode","_height","_width","_style","paddingLeft","parseInt","paddingRight","paddingTop","paddingBottom","newHeight","newWidth","setState","_setRef","autoSizer","_autoSizer","subClass","superClass","create","constructor","setPrototypeOf","inherits","parentNode","defaultView","HTMLElement","_detectElementResize","_props","_state","outerStyle","overflow","childParams","bailoutOnChildren","ref","RICH_HISTORY_KEY","RICH_HISTORY_SETTING_KEYS","retentionPeriod","starredTabAsFirstTab","activeDatasourceOnly","datasourceFilters","starred","comment","sessionName","Date","now","queriesToSave","filter","expr","Boolean","retentionPeriodLastTs","createRetentionPeriodBoundary","queriesToKeep","q","JSON","stringify","newHistory","setObject","delete","updatedQueries","isStarred","newComment","sortQueries","array","sortOrder","sortFunc","SortOrder","Ascending","a","b","Descending","DatasourceZA","DatasourceAZ","sort","copyStringToClipboard","string","el","body","select","execCommand","createUrlFromRichHistory","exploreState","Metrics","context","serializedState","baseUrl","exec","href","renderUrl","mapNumbertoTimeInSlider","num","str","days","isLastTs","today","date","setDate","getDate","setHours","createQueryHeading","month","day","heading","toLocaleString","createDataQuery","queryString","parse","isParsable","mapQueriesToHeadings","mappedQueriesToHeadings","createDatasourcesList","queriesDatasources","exploreDatasources","queryDsName","findIndex","exploreDs","isRemoved"],"mappings":"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","file":"default~DashboardPage~SoloPanelPage~explore.a2a620545dc45e05493f.js","sourcesContent":["import { UserState } from 'app/types';\n\nexport const getTimeZone = (state: UserState) => state.timeZone;\n","import { createSelector } from 'reselect';\nimport { ExploreItemState } from 'app/types';\nimport { filterLogLevels, dedupLogRows } from 'app/core/logs_model';\nimport { getDatasourceSrv } from '../../plugins/datasource_srv';\nimport { DataSourceSelectItem } from '@grafana/data';\n\nconst logsRowsSelector = (state: ExploreItemState) => state.logsResult && state.logsResult.rows;\nconst hiddenLogLevelsSelector = (state: ExploreItemState) => state.hiddenLogLevels;\nconst dedupStrategySelector = (state: ExploreItemState) => state.dedupStrategy;\nexport const deduplicatedRowsSelector = createSelector(\n logsRowsSelector,\n hiddenLogLevelsSelector,\n dedupStrategySelector,\n function dedupRows(rows, hiddenLogLevels, dedupStrategy) {\n if (!(rows && rows.length)) {\n return rows;\n }\n const filteredRows = filterLogLevels(rows, new Set(hiddenLogLevels));\n return dedupLogRows(filteredRows, dedupStrategy);\n }\n);\n\nexport const getExploreDatasources = (): DataSourceSelectItem[] => {\n return getDatasourceSrv()\n .getExternal()\n .map(\n (ds: any) =>\n ({\n value: ds.name,\n name: ds.name,\n meta: ds.meta,\n } as DataSourceSelectItem)\n );\n};\n","import React, { FC, CSSProperties } from 'react';\nimport Transition, { ExitHandler } from 'react-transition-group/Transition';\n\ninterface Props {\n duration: number;\n children: JSX.Element;\n in: boolean;\n unmountOnExit?: boolean;\n onExited?: ExitHandler;\n}\n\nexport const FadeIn: FC = props => {\n const defaultStyle: CSSProperties = {\n transition: `opacity ${props.duration}ms linear`,\n opacity: 0,\n };\n\n const transitionStyles: { [str: string]: CSSProperties } = {\n exited: { opacity: 0, display: 'none' },\n entering: { opacity: 0 },\n entered: { opacity: 1 },\n exiting: { opacity: 0 },\n };\n\n return (\n \n {state => (\n \n {props.children}\n \n )}\n \n );\n};\n","// Libraries\nimport { map, throttleTime } from 'rxjs/operators';\nimport { identity } from 'rxjs';\nimport { ActionCreatorWithPayload, PayloadAction } from '@reduxjs/toolkit';\nimport { DataSourceSrv } from '@grafana/runtime';\nimport { RefreshPicker } from '@grafana/ui';\nimport {\n AbsoluteTimeRange,\n DataQuery,\n DataSourceApi,\n dateTimeForTimeZone,\n isDateTime,\n LoadingState,\n LogsDedupStrategy,\n PanelData,\n QueryFixAction,\n RawTimeRange,\n TimeRange,\n ExploreMode,\n} from '@grafana/data';\n// Services & Utils\nimport store from 'app/core/store';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { Emitter } from 'app/core/core';\nimport {\n buildQueryTransaction,\n clearQueryKeys,\n ensureQueries,\n generateEmptyQuery,\n generateNewKeyAndAddRefIdIfMissing,\n GetExploreUrlArguments,\n getTimeRange,\n getTimeRangeFromUrl,\n hasNonEmptyQuery,\n lastUsedDatasourceKeyForOrgId,\n parseUrlState,\n serializeStateToUrlParam,\n stopQueryState,\n updateHistory,\n} from 'app/core/utils/explore';\nimport {\n addToRichHistory,\n deleteAllFromRichHistory,\n updateStarredInRichHistory,\n updateCommentInRichHistory,\n deleteQueryInRichHistory,\n getQueryDisplayText,\n getRichHistory,\n} from 'app/core/utils/richHistory';\n// Types\nimport { ExploreItemState, ExploreUrlState, ThunkResult } from 'app/types';\n\nimport { ExploreId, ExploreUIState, QueryOptions } from 'app/types/explore';\nimport {\n addQueryRowAction,\n changeModeAction,\n changeQueryAction,\n changeRangeAction,\n changeRefreshIntervalAction,\n ChangeRefreshIntervalPayload,\n changeSizeAction,\n ChangeSizePayload,\n clearQueriesAction,\n historyUpdatedAction,\n richHistoryUpdatedAction,\n initializeExploreAction,\n loadDatasourceMissingAction,\n loadDatasourcePendingAction,\n loadDatasourceReadyAction,\n LoadDatasourceReadyPayload,\n modifyQueriesAction,\n queriesImportedAction,\n queryStoreSubscriptionAction,\n queryStreamUpdatedAction,\n scanStartAction,\n scanStopAction,\n setQueriesAction,\n setUrlReplacedAction,\n splitCloseAction,\n splitOpenAction,\n syncTimesAction,\n toggleGraphAction,\n ToggleGraphPayload,\n toggleTableAction,\n ToggleTablePayload,\n updateDatasourceInstanceAction,\n updateUIStateAction,\n} from './actionTypes';\nimport { getTimeZone } from 'app/features/profile/state/selectors';\nimport { getShiftedTimeRange } from 'app/core/utils/timePicker';\nimport { updateLocation } from '../../../core/actions';\nimport { getTimeSrv, TimeSrv } from '../../dashboard/services/TimeSrv';\nimport { preProcessPanelData, runRequest } from '../../dashboard/state/runRequest';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { getExploreDatasources } from './selectors';\n\n/**\n * Updates UI state and save it to the URL\n */\nconst updateExploreUIState = (exploreId: ExploreId, uiStateFragment: Partial): ThunkResult => {\n return dispatch => {\n dispatch(updateUIStateAction({ exploreId, ...uiStateFragment }));\n dispatch(stateSave());\n };\n};\n\n/**\n * Adds a query row after the row with the given index.\n */\nexport function addQueryRow(exploreId: ExploreId, index: number): ThunkResult {\n return (dispatch, getState) => {\n const queries = getState().explore[exploreId].queries;\n const query = generateEmptyQuery(queries, index);\n\n dispatch(addQueryRowAction({ exploreId, index, query }));\n };\n}\n\n/**\n * Loads a new datasource identified by the given name.\n */\nexport function changeDatasource(exploreId: ExploreId, datasource: string): ThunkResult {\n return async (dispatch, getState) => {\n let newDataSourceInstance: DataSourceApi = null;\n\n if (!datasource) {\n newDataSourceInstance = await getDatasourceSrv().get();\n } else {\n newDataSourceInstance = await getDatasourceSrv().get(datasource);\n }\n\n const currentDataSourceInstance = getState().explore[exploreId].datasourceInstance;\n const queries = getState().explore[exploreId].queries;\n const orgId = getState().user.orgId;\n const datasourceVersion = newDataSourceInstance.getVersion && (await newDataSourceInstance.getVersion());\n\n // HACK: Switch to logs mode if coming from Prometheus to Loki\n const prometheusToLoki =\n currentDataSourceInstance?.meta?.name === 'Prometheus' && newDataSourceInstance?.meta?.name === 'Loki';\n\n dispatch(\n updateDatasourceInstanceAction({\n exploreId,\n datasourceInstance: newDataSourceInstance,\n version: datasourceVersion,\n mode: prometheusToLoki ? ExploreMode.Logs : undefined,\n })\n );\n\n await dispatch(importQueries(exploreId, queries, currentDataSourceInstance, newDataSourceInstance));\n\n if (getState().explore[exploreId].isLive) {\n dispatch(changeRefreshInterval(exploreId, RefreshPicker.offOption.value));\n }\n\n await dispatch(loadDatasource(exploreId, newDataSourceInstance, orgId));\n dispatch(runQueries(exploreId));\n };\n}\n\n/**\n * Change the display mode in Explore.\n */\nexport function changeMode(exploreId: ExploreId, mode: ExploreMode): ThunkResult {\n return dispatch => {\n dispatch(changeModeAction({ exploreId, mode }));\n };\n}\n\n/**\n * Query change handler for the query row with the given index.\n * If `override` is reset the query modifications and run the queries. Use this to set queries via a link.\n */\nexport function changeQuery(\n exploreId: ExploreId,\n query: DataQuery,\n index: number,\n override = false\n): ThunkResult {\n return (dispatch, getState) => {\n // Null query means reset\n if (query === null) {\n const queries = getState().explore[exploreId].queries;\n const { refId, key } = queries[index];\n query = generateNewKeyAndAddRefIdIfMissing({ refId, key }, queries, index);\n }\n\n dispatch(changeQueryAction({ exploreId, query, index, override }));\n if (override) {\n dispatch(runQueries(exploreId));\n }\n };\n}\n\n/**\n * Keep track of the Explore container size, in particular the width.\n * The width will be used to calculate graph intervals (number of datapoints).\n */\nexport function changeSize(\n exploreId: ExploreId,\n { height, width }: { height: number; width: number }\n): PayloadAction {\n return changeSizeAction({ exploreId, height, width });\n}\n\nexport const updateTimeRange = (options: {\n exploreId: ExploreId;\n rawRange?: RawTimeRange;\n absoluteRange?: AbsoluteTimeRange;\n}): ThunkResult => {\n return (dispatch, getState) => {\n const { syncedTimes } = getState().explore;\n if (syncedTimes) {\n dispatch(updateTime({ ...options, exploreId: ExploreId.left }));\n dispatch(runQueries(ExploreId.left));\n dispatch(updateTime({ ...options, exploreId: ExploreId.right }));\n dispatch(runQueries(ExploreId.right));\n } else {\n dispatch(updateTime({ ...options }));\n dispatch(runQueries(options.exploreId));\n }\n };\n};\n/**\n * Change the refresh interval of Explore. Called from the Refresh picker.\n */\nexport function changeRefreshInterval(\n exploreId: ExploreId,\n refreshInterval: string\n): PayloadAction {\n return changeRefreshIntervalAction({ exploreId, refreshInterval });\n}\n\n/**\n * Clear all queries and results.\n */\nexport function clearQueries(exploreId: ExploreId): ThunkResult {\n return dispatch => {\n dispatch(scanStopAction({ exploreId }));\n dispatch(clearQueriesAction({ exploreId }));\n dispatch(stateSave());\n };\n}\n\n/**\n * Loads all explore data sources and sets the chosen datasource.\n * If there are no datasources a missing datasource action is dispatched.\n */\nexport function loadExploreDatasourcesAndSetDatasource(\n exploreId: ExploreId,\n datasourceName: string\n): ThunkResult {\n return dispatch => {\n const exploreDatasources = getExploreDatasources();\n\n if (exploreDatasources.length >= 1) {\n dispatch(changeDatasource(exploreId, datasourceName));\n } else {\n dispatch(loadDatasourceMissingAction({ exploreId }));\n }\n };\n}\n\n/**\n * Initialize Explore state with state from the URL and the React component.\n * Call this only on components for with the Explore state has not been initialized.\n */\nexport function initializeExplore(\n exploreId: ExploreId,\n datasourceName: string,\n queries: DataQuery[],\n range: TimeRange,\n mode: ExploreMode,\n containerWidth: number,\n eventBridge: Emitter,\n ui: ExploreUIState,\n originPanelId: number\n): ThunkResult {\n return async (dispatch, getState) => {\n dispatch(loadExploreDatasourcesAndSetDatasource(exploreId, datasourceName));\n dispatch(\n initializeExploreAction({\n exploreId,\n containerWidth,\n eventBridge,\n queries,\n range,\n mode,\n ui,\n originPanelId,\n })\n );\n dispatch(updateTime({ exploreId }));\n const richHistory = getRichHistory();\n dispatch(richHistoryUpdatedAction({ richHistory }));\n };\n}\n\n/**\n * Datasource loading was successfully completed.\n */\nexport const loadDatasourceReady = (\n exploreId: ExploreId,\n instance: DataSourceApi,\n orgId: number\n): PayloadAction => {\n const historyKey = `grafana.explore.history.${instance.meta.id}`;\n const history = store.getObject(historyKey, []);\n // Save last-used datasource\n\n store.set(lastUsedDatasourceKeyForOrgId(orgId), instance.name);\n\n return loadDatasourceReadyAction({\n exploreId,\n history,\n });\n};\n\n/**\n * Import queries from previous datasource if possible eg Loki and Prometheus have similar query language so the\n * labels part can be reused to get similar data.\n * @param exploreId\n * @param queries\n * @param sourceDataSource\n * @param targetDataSource\n */\nexport const importQueries = (\n exploreId: ExploreId,\n queries: DataQuery[],\n sourceDataSource: DataSourceApi,\n targetDataSource: DataSourceApi\n): ThunkResult => {\n return async dispatch => {\n if (!sourceDataSource) {\n // explore not initialized\n dispatch(queriesImportedAction({ exploreId, queries }));\n return;\n }\n\n let importedQueries = queries;\n // Check if queries can be imported from previously selected datasource\n if (sourceDataSource.meta.id === targetDataSource.meta.id) {\n // Keep same queries if same type of datasource\n importedQueries = [...queries];\n } else if (targetDataSource.importQueries) {\n // Datasource-specific importers\n importedQueries = await targetDataSource.importQueries(queries, sourceDataSource.meta);\n } else {\n // Default is blank queries\n importedQueries = ensureQueries();\n }\n\n const nextQueries = ensureQueries(importedQueries);\n\n dispatch(queriesImportedAction({ exploreId, queries: nextQueries }));\n };\n};\n\n/**\n * Main action to asynchronously load a datasource. Dispatches lots of smaller actions for feedback.\n */\nexport const loadDatasource = (exploreId: ExploreId, instance: DataSourceApi, orgId: number): ThunkResult => {\n return async (dispatch, getState) => {\n const datasourceName = instance.name;\n\n // Keep ID to track selection\n dispatch(loadDatasourcePendingAction({ exploreId, requestedDatasourceName: datasourceName }));\n\n if (instance.init) {\n try {\n instance.init();\n } catch (err) {\n console.log(err);\n }\n }\n\n if (datasourceName !== getState().explore[exploreId].requestedDatasourceName) {\n // User already changed datasource, discard results\n return;\n }\n\n dispatch(loadDatasourceReady(exploreId, instance, orgId));\n };\n};\n\n/**\n * Action to modify a query given a datasource-specific modifier action.\n * @param exploreId Explore area\n * @param modification Action object with a type, e.g., ADD_FILTER\n * @param index Optional query row index. If omitted, the modification is applied to all query rows.\n * @param modifier Function that executes the modification, typically `datasourceInstance.modifyQueries`.\n */\nexport function modifyQueries(\n exploreId: ExploreId,\n modification: QueryFixAction,\n modifier: any,\n index?: number\n): ThunkResult {\n return dispatch => {\n dispatch(modifyQueriesAction({ exploreId, modification, index, modifier }));\n if (!modification.preventSubmit) {\n dispatch(runQueries(exploreId));\n }\n };\n}\n\n/**\n * Main action to run queries and dispatches sub-actions based on which result viewers are active\n */\nexport const runQueries = (exploreId: ExploreId): ThunkResult => {\n return (dispatch, getState) => {\n dispatch(updateTime({ exploreId }));\n\n const richHistory = getState().explore.richHistory;\n const exploreItemState = getState().explore[exploreId];\n const {\n datasourceInstance,\n queries,\n containerWidth,\n isLive: live,\n range,\n scanning,\n queryResponse,\n querySubscription,\n history,\n mode,\n showingGraph,\n showingTable,\n } = exploreItemState;\n\n if (!hasNonEmptyQuery(queries)) {\n dispatch(clearQueriesAction({ exploreId }));\n dispatch(stateSave()); // Remember to save to state and update location\n return;\n }\n\n // Some datasource's query builders allow per-query interval limits,\n // but we're using the datasource interval limit for now\n const minInterval = datasourceInstance.interval;\n\n stopQueryState(querySubscription);\n\n const datasourceId = datasourceInstance.meta.id;\n\n const queryOptions: QueryOptions = {\n minInterval,\n // maxDataPoints is used in:\n // Loki - used for logs streaming for buffer size, with undefined it falls back to datasource config if it supports that.\n // Elastic - limits the number of datapoints for the counts query and for logs it has hardcoded limit.\n // Influx - used to correctly display logs in graph\n maxDataPoints: mode === ExploreMode.Logs && datasourceId === 'loki' ? undefined : containerWidth,\n liveStreaming: live,\n showingGraph,\n showingTable,\n mode,\n };\n\n const datasourceName = exploreItemState.requestedDatasourceName;\n\n const transaction = buildQueryTransaction(queries, queryOptions, range, scanning);\n\n let firstResponse = true;\n\n const newQuerySub = runRequest(datasourceInstance, transaction.request)\n .pipe(\n // Simple throttle for live tailing, in case of > 1000 rows per interval we spend about 200ms on processing and\n // rendering. In case this is optimized this can be tweaked, but also it should be only as fast as user\n // actually can see what is happening.\n live ? throttleTime(500) : identity,\n map((data: PanelData) => preProcessPanelData(data, queryResponse))\n )\n .subscribe((data: PanelData) => {\n if (!data.error && firstResponse) {\n // Side-effect: Saving history in localstorage\n const nextHistory = updateHistory(history, datasourceId, queries);\n const arrayOfStringifiedQueries = queries.map(query =>\n datasourceInstance?.getQueryDisplayText\n ? datasourceInstance.getQueryDisplayText(query)\n : getQueryDisplayText(query)\n );\n\n const nextRichHistory = addToRichHistory(\n richHistory || [],\n datasourceId,\n datasourceName,\n arrayOfStringifiedQueries,\n false,\n '',\n ''\n );\n dispatch(historyUpdatedAction({ exploreId, history: nextHistory }));\n dispatch(richHistoryUpdatedAction({ richHistory: nextRichHistory }));\n\n // We save queries to the URL here so that only successfully run queries change the URL.\n dispatch(stateSave());\n }\n\n firstResponse = false;\n\n dispatch(queryStreamUpdatedAction({ exploreId, response: data }));\n\n // Keep scanning for results if this was the last scanning transaction\n if (getState().explore[exploreId].scanning) {\n if (data.state === LoadingState.Done && data.series.length === 0) {\n const range = getShiftedTimeRange(-1, getState().explore[exploreId].range);\n dispatch(updateTime({ exploreId, absoluteRange: range }));\n dispatch(runQueries(exploreId));\n } else {\n // We can stop scanning if we have a result\n dispatch(scanStopAction({ exploreId }));\n }\n }\n });\n\n dispatch(queryStoreSubscriptionAction({ exploreId, querySubscription: newQuerySub }));\n };\n};\n\nexport const updateRichHistory = (ts: number, property: string, updatedProperty?: string): ThunkResult => {\n return (dispatch, getState) => {\n // Side-effect: Saving rich history in localstorage\n let nextRichHistory;\n if (property === 'starred') {\n nextRichHistory = updateStarredInRichHistory(getState().explore.richHistory, ts);\n }\n if (property === 'comment') {\n nextRichHistory = updateCommentInRichHistory(getState().explore.richHistory, ts, updatedProperty);\n }\n if (property === 'delete') {\n nextRichHistory = deleteQueryInRichHistory(getState().explore.richHistory, ts);\n }\n dispatch(richHistoryUpdatedAction({ richHistory: nextRichHistory }));\n };\n};\n\nexport const deleteRichHistory = (): ThunkResult => {\n return dispatch => {\n deleteAllFromRichHistory();\n dispatch(richHistoryUpdatedAction({ richHistory: [] }));\n };\n};\n\nconst toRawTimeRange = (range: TimeRange): RawTimeRange => {\n let from = range.raw.from;\n if (isDateTime(from)) {\n from = from.valueOf().toString(10);\n }\n\n let to = range.raw.to;\n if (isDateTime(to)) {\n to = to.valueOf().toString(10);\n }\n\n return {\n from,\n to,\n };\n};\n\n/**\n * Save local redux state back to the URL. Should be called when there is some change that should affect the URL.\n * Not all of the redux state is reflected in URL though.\n */\nexport const stateSave = (): ThunkResult => {\n return (dispatch, getState) => {\n const { left, right, split } = getState().explore;\n const orgId = getState().user.orgId.toString();\n const replace = left && left.urlReplaced === false;\n const urlStates: { [index: string]: string } = { orgId };\n const leftUrlState: ExploreUrlState = {\n datasource: left.datasourceInstance.name,\n queries: left.queries.map(clearQueryKeys),\n range: toRawTimeRange(left.range),\n mode: left.mode,\n ui: {\n showingGraph: left.showingGraph,\n showingLogs: true,\n showingTable: left.showingTable,\n dedupStrategy: left.dedupStrategy,\n },\n };\n urlStates.left = serializeStateToUrlParam(leftUrlState, true);\n if (split) {\n const rightUrlState: ExploreUrlState = {\n datasource: right.datasourceInstance.name,\n queries: right.queries.map(clearQueryKeys),\n range: toRawTimeRange(right.range),\n mode: right.mode,\n ui: {\n showingGraph: right.showingGraph,\n showingLogs: true,\n showingTable: right.showingTable,\n dedupStrategy: right.dedupStrategy,\n },\n };\n\n urlStates.right = serializeStateToUrlParam(rightUrlState, true);\n }\n\n dispatch(updateLocation({ query: urlStates, replace }));\n if (replace) {\n dispatch(setUrlReplacedAction({ exploreId: ExploreId.left }));\n }\n };\n};\n\nexport const updateTime = (config: {\n exploreId: ExploreId;\n rawRange?: RawTimeRange;\n absoluteRange?: AbsoluteTimeRange;\n}): ThunkResult => {\n return (dispatch, getState) => {\n const { exploreId, absoluteRange: absRange, rawRange: actionRange } = config;\n const itemState = getState().explore[exploreId];\n const timeZone = getTimeZone(getState().user);\n const { range: rangeInState } = itemState;\n let rawRange: RawTimeRange = rangeInState.raw;\n\n if (absRange) {\n rawRange = {\n from: dateTimeForTimeZone(timeZone, absRange.from),\n to: dateTimeForTimeZone(timeZone, absRange.to),\n };\n }\n\n if (actionRange) {\n rawRange = actionRange;\n }\n\n const range = getTimeRange(timeZone, rawRange);\n const absoluteRange: AbsoluteTimeRange = { from: range.from.valueOf(), to: range.to.valueOf() };\n\n getTimeSrv().init({\n time: range.raw,\n refresh: false,\n getTimezone: () => timeZone,\n timeRangeUpdated: (): any => undefined,\n });\n\n dispatch(changeRangeAction({ exploreId, range, absoluteRange }));\n };\n};\n\n/**\n * Start a scan for more results using the given scanner.\n * @param exploreId Explore area\n * @param scanner Function that a) returns a new time range and b) triggers a query run for the new range\n */\nexport function scanStart(exploreId: ExploreId): ThunkResult {\n return (dispatch, getState) => {\n // Register the scanner\n dispatch(scanStartAction({ exploreId }));\n // Scanning must trigger query run, and return the new range\n const range = getShiftedTimeRange(-1, getState().explore[exploreId].range);\n // Set the new range to be displayed\n dispatch(updateTime({ exploreId, absoluteRange: range }));\n dispatch(runQueries(exploreId));\n };\n}\n\n/**\n * Reset queries to the given queries. Any modifications will be discarded.\n * Use this action for clicks on query examples. Triggers a query run.\n */\nexport function setQueries(exploreId: ExploreId, rawQueries: DataQuery[]): ThunkResult {\n return (dispatch, getState) => {\n // Inject react keys into query objects\n const queries = getState().explore[exploreId].queries;\n const nextQueries = rawQueries.map((query, index) => generateNewKeyAndAddRefIdIfMissing(query, queries, index));\n dispatch(setQueriesAction({ exploreId, queries: nextQueries }));\n dispatch(runQueries(exploreId));\n };\n}\n\n/**\n * Close the split view and save URL state.\n */\nexport function splitClose(itemId: ExploreId): ThunkResult {\n return dispatch => {\n dispatch(splitCloseAction({ itemId }));\n dispatch(stateSave());\n };\n}\n\n/**\n * Open the split view and copy the left state to be the right state.\n * The right state is automatically initialized.\n * The copy keeps all query modifications but wipes the query results.\n */\nexport function splitOpen(): ThunkResult {\n return (dispatch, getState) => {\n // Clone left state to become the right state\n const leftState = getState().explore[ExploreId.left];\n const queryState = getState().location.query[ExploreId.left] as string;\n const urlState = parseUrlState(queryState);\n const itemState: ExploreItemState = {\n ...leftState,\n queries: leftState.queries.slice(),\n urlState,\n };\n dispatch(splitOpenAction({ itemState }));\n dispatch(stateSave());\n };\n}\n\n/**\n * Syncs time interval, if they are not synced on both panels in a split mode.\n * Unsyncs time interval, if they are synced on both panels in a split mode.\n */\nexport function syncTimes(exploreId: ExploreId): ThunkResult {\n return (dispatch, getState) => {\n if (exploreId === ExploreId.left) {\n const leftState = getState().explore.left;\n dispatch(updateTimeRange({ exploreId: ExploreId.right, rawRange: leftState.range.raw }));\n } else {\n const rightState = getState().explore.right;\n dispatch(updateTimeRange({ exploreId: ExploreId.left, rawRange: rightState.range.raw }));\n }\n const isTimeSynced = getState().explore.syncedTimes;\n dispatch(syncTimesAction({ syncedTimes: !isTimeSynced }));\n dispatch(stateSave());\n };\n}\n\n/**\n * Creates action to collapse graph/logs/table panel. When panel is collapsed,\n * queries won't be run\n */\nconst togglePanelActionCreator = (\n actionCreator: ActionCreatorWithPayload | ActionCreatorWithPayload\n) => (exploreId: ExploreId, isPanelVisible: boolean): ThunkResult => {\n return dispatch => {\n let uiFragmentStateUpdate: Partial;\n const shouldRunQueries = !isPanelVisible;\n\n switch (actionCreator.type) {\n case toggleGraphAction.type:\n uiFragmentStateUpdate = { showingGraph: !isPanelVisible };\n break;\n case toggleTableAction.type:\n uiFragmentStateUpdate = { showingTable: !isPanelVisible };\n break;\n }\n\n dispatch(actionCreator({ exploreId }));\n dispatch(updateExploreUIState(exploreId, uiFragmentStateUpdate));\n\n if (shouldRunQueries) {\n dispatch(runQueries(exploreId));\n }\n };\n};\n\n/**\n * Expand/collapse the graph result viewer. When collapsed, graph queries won't be run.\n */\nexport const toggleGraph = togglePanelActionCreator(toggleGraphAction);\n\n/**\n * Expand/collapse the table result viewer. When collapsed, table queries won't be run.\n */\nexport const toggleTable = togglePanelActionCreator(toggleTableAction);\n\n/**\n * Change logs deduplication strategy and update URL.\n */\nexport const changeDedupStrategy = (exploreId: ExploreId, dedupStrategy: LogsDedupStrategy): ThunkResult => {\n return dispatch => {\n dispatch(updateExploreUIState(exploreId, { dedupStrategy }));\n };\n};\n\n/**\n * Reacts to changes in URL state that we need to sync back to our redux state. Checks the internal update variable\n * to see which parts change and need to be synced.\n * @param exploreId\n */\nexport function refreshExplore(exploreId: ExploreId): ThunkResult {\n return (dispatch, getState) => {\n const itemState = getState().explore[exploreId];\n if (!itemState.initialized) {\n return;\n }\n\n const { urlState, update, containerWidth, eventBridge } = itemState;\n const { datasource, queries, range: urlRange, mode, ui, originPanelId } = urlState;\n const refreshQueries: DataQuery[] = [];\n for (let index = 0; index < queries.length; index++) {\n const query = queries[index];\n refreshQueries.push(generateNewKeyAndAddRefIdIfMissing(query, refreshQueries, index));\n }\n const timeZone = getTimeZone(getState().user);\n const range = getTimeRangeFromUrl(urlRange, timeZone);\n\n // need to refresh datasource\n if (update.datasource) {\n const initialQueries = ensureQueries(queries);\n dispatch(\n initializeExplore(\n exploreId,\n datasource,\n initialQueries,\n range,\n mode,\n containerWidth,\n eventBridge,\n ui,\n originPanelId\n )\n );\n return;\n }\n\n if (update.range) {\n dispatch(updateTime({ exploreId, rawRange: range.raw }));\n }\n\n // need to refresh ui state\n if (update.ui) {\n dispatch(updateUIStateAction({ ...ui, exploreId }));\n }\n\n // need to refresh queries\n if (update.queries) {\n dispatch(setQueriesAction({ exploreId, queries: refreshQueries }));\n }\n\n // need to refresh mode\n if (update.mode) {\n dispatch(changeModeAction({ exploreId, mode }));\n }\n\n // always run queries when refresh is needed\n if (update.queries || update.ui || update.range) {\n dispatch(runQueries(exploreId));\n }\n };\n}\n\nexport interface NavigateToExploreDependencies {\n getDataSourceSrv: () => DataSourceSrv;\n getTimeSrv: () => TimeSrv;\n getExploreUrl: (args: GetExploreUrlArguments) => Promise;\n openInNewWindow?: (url: string) => void;\n}\n\nexport const navigateToExplore = (\n panel: PanelModel,\n dependencies: NavigateToExploreDependencies\n): ThunkResult => {\n return async dispatch => {\n const { getDataSourceSrv, getTimeSrv, getExploreUrl, openInNewWindow } = dependencies;\n const datasourceSrv = getDataSourceSrv();\n const datasource = await datasourceSrv.get(panel.datasource);\n const path = await getExploreUrl({\n panel,\n panelTargets: panel.targets,\n panelDatasource: datasource,\n datasourceSrv,\n timeSrv: getTimeSrv(),\n });\n\n if (openInNewWindow) {\n openInNewWindow(path);\n return;\n }\n\n const query = {}; // strips any angular query param\n dispatch(updateLocation({ path, query }));\n };\n};\n","// Libraries\nimport React, { PureComponent } from 'react';\n\n// Components\nimport { Select } from '@grafana/ui';\nimport { SelectableValue, DataSourceSelectItem } from '@grafana/data';\n\nexport interface Props {\n onChange: (ds: DataSourceSelectItem) => void;\n datasources: DataSourceSelectItem[];\n current: DataSourceSelectItem;\n hideTextValue?: boolean;\n onBlur?: () => void;\n autoFocus?: boolean;\n openMenuOnFocus?: boolean;\n showLoading?: boolean;\n}\n\nexport class DataSourcePicker extends PureComponent {\n static defaultProps: Partial = {\n autoFocus: false,\n openMenuOnFocus: false,\n };\n\n searchInput: HTMLElement;\n\n constructor(props: Props) {\n super(props);\n }\n\n onChange = (item: SelectableValue) => {\n const ds = this.props.datasources.find(ds => ds.name === item.value);\n this.props.onChange(ds);\n };\n\n render() {\n const { datasources, current, autoFocus, hideTextValue, onBlur, openMenuOnFocus, showLoading } = this.props;\n\n const options = datasources.map(ds => ({\n value: ds.name,\n label: ds.name,\n imgUrl: ds.meta.info.logos.small,\n }));\n\n const value = current && {\n label: current.name.substr(0, 37),\n value: current.name,\n imgUrl: current.meta.info.logos.small,\n loading: showLoading,\n hideText: hideTextValue,\n };\n\n return (\n
\n 'No datasources found'}\n value={value}\n />\n
\n );\n }\n}\n\nexport default DataSourcePicker;\n","import { createElement, PureComponent } from 'react';\n\n/**\n * Detect Element Resize.\n * https://github.com/sdecima/javascript-detect-element-resize\n * Sebastian Decima\n *\n * Forked from version 0.5.3; includes the following modifications:\n * 1) Guard against unsafe 'window' and 'document' references (to support SSR).\n * 2) Defer initialization code via a top-level function wrapper (to support SSR).\n * 3) Avoid unnecessary reflows by not measuring size for scroll events bubbling from children.\n * 4) Add nonce for style element.\n **/\n\nfunction createDetectElementResize(nonce) {\n // Check `document` and `window` in case of server-side rendering\n var _window;\n if (typeof window !== 'undefined') {\n _window = window;\n } else if (typeof self !== 'undefined') {\n _window = self;\n } else {\n _window = global;\n }\n\n var attachEvent = typeof document !== 'undefined' && document.attachEvent;\n\n if (!attachEvent) {\n var requestFrame = function () {\n var raf = _window.requestAnimationFrame || _window.mozRequestAnimationFrame || _window.webkitRequestAnimationFrame || function (fn) {\n return _window.setTimeout(fn, 20);\n };\n return function (fn) {\n return raf(fn);\n };\n }();\n\n var cancelFrame = function () {\n var cancel = _window.cancelAnimationFrame || _window.mozCancelAnimationFrame || _window.webkitCancelAnimationFrame || _window.clearTimeout;\n return function (id) {\n return cancel(id);\n };\n }();\n\n var resetTriggers = function resetTriggers(element) {\n var triggers = element.__resizeTriggers__,\n expand = triggers.firstElementChild,\n contract = triggers.lastElementChild,\n expandChild = expand.firstElementChild;\n contract.scrollLeft = contract.scrollWidth;\n contract.scrollTop = contract.scrollHeight;\n expandChild.style.width = expand.offsetWidth + 1 + 'px';\n expandChild.style.height = expand.offsetHeight + 1 + 'px';\n expand.scrollLeft = expand.scrollWidth;\n expand.scrollTop = expand.scrollHeight;\n };\n\n var checkTriggers = function checkTriggers(element) {\n return element.offsetWidth != element.__resizeLast__.width || element.offsetHeight != element.__resizeLast__.height;\n };\n\n var scrollListener = function scrollListener(e) {\n // Don't measure (which forces) reflow for scrolls that happen inside of children!\n if (e.target.className.indexOf('contract-trigger') < 0 && e.target.className.indexOf('expand-trigger') < 0) {\n return;\n }\n\n var element = this;\n resetTriggers(this);\n if (this.__resizeRAF__) {\n cancelFrame(this.__resizeRAF__);\n }\n this.__resizeRAF__ = requestFrame(function () {\n if (checkTriggers(element)) {\n element.__resizeLast__.width = element.offsetWidth;\n element.__resizeLast__.height = element.offsetHeight;\n element.__resizeListeners__.forEach(function (fn) {\n fn.call(element, e);\n });\n }\n });\n };\n\n /* Detect CSS Animations support to detect element display/re-attach */\n var animation = false,\n keyframeprefix = '',\n animationstartevent = 'animationstart',\n domPrefixes = 'Webkit Moz O ms'.split(' '),\n startEvents = 'webkitAnimationStart animationstart oAnimationStart MSAnimationStart'.split(' '),\n pfx = '';\n {\n var elm = document.createElement('fakeelement');\n if (elm.style.animationName !== undefined) {\n animation = true;\n }\n\n if (animation === false) {\n for (var i = 0; i < domPrefixes.length; i++) {\n if (elm.style[domPrefixes[i] + 'AnimationName'] !== undefined) {\n pfx = domPrefixes[i];\n keyframeprefix = '-' + pfx.toLowerCase() + '-';\n animationstartevent = startEvents[i];\n animation = true;\n break;\n }\n }\n }\n }\n\n var animationName = 'resizeanim';\n var animationKeyframes = '@' + keyframeprefix + 'keyframes ' + animationName + ' { from { opacity: 0; } to { opacity: 0; } } ';\n var animationStyle = keyframeprefix + 'animation: 1ms ' + animationName + '; ';\n }\n\n var createStyles = function createStyles(doc) {\n if (!doc.getElementById('detectElementResize')) {\n //opacity:0 works around a chrome bug https://code.google.com/p/chromium/issues/detail?id=286360\n var css = (animationKeyframes ? animationKeyframes : '') + '.resize-triggers { ' + (animationStyle ? animationStyle : '') + 'visibility: hidden; opacity: 0; } ' + '.resize-triggers, .resize-triggers > div, .contract-trigger:before { content: \" \"; display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; z-index: -1; } .resize-triggers > div { background: #eee; overflow: auto; } .contract-trigger:before { width: 200%; height: 200%; }',\n head = doc.head || doc.getElementsByTagName('head')[0],\n style = doc.createElement('style');\n\n style.id = 'detectElementResize';\n style.type = 'text/css';\n\n if (nonce != null) {\n style.setAttribute('nonce', nonce);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(doc.createTextNode(css));\n }\n\n head.appendChild(style);\n }\n };\n\n var addResizeListener = function addResizeListener(element, fn) {\n if (attachEvent) {\n element.attachEvent('onresize', fn);\n } else {\n if (!element.__resizeTriggers__) {\n var doc = element.ownerDocument;\n var elementStyle = _window.getComputedStyle(element);\n if (elementStyle && elementStyle.position == 'static') {\n element.style.position = 'relative';\n }\n createStyles(doc);\n element.__resizeLast__ = {};\n element.__resizeListeners__ = [];\n (element.__resizeTriggers__ = doc.createElement('div')).className = 'resize-triggers';\n element.__resizeTriggers__.innerHTML = '
' + '
';\n element.appendChild(element.__resizeTriggers__);\n resetTriggers(element);\n element.addEventListener('scroll', scrollListener, true);\n\n /* Listen for a css animation to detect element display/re-attach */\n if (animationstartevent) {\n element.__resizeTriggers__.__animationListener__ = function animationListener(e) {\n if (e.animationName == animationName) {\n resetTriggers(element);\n }\n };\n element.__resizeTriggers__.addEventListener(animationstartevent, element.__resizeTriggers__.__animationListener__);\n }\n }\n element.__resizeListeners__.push(fn);\n }\n };\n\n var removeResizeListener = function removeResizeListener(element, fn) {\n if (attachEvent) {\n element.detachEvent('onresize', fn);\n } else {\n element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);\n if (!element.__resizeListeners__.length) {\n element.removeEventListener('scroll', scrollListener, true);\n if (element.__resizeTriggers__.__animationListener__) {\n element.__resizeTriggers__.removeEventListener(animationstartevent, element.__resizeTriggers__.__animationListener__);\n element.__resizeTriggers__.__animationListener__ = null;\n }\n try {\n element.__resizeTriggers__ = !element.removeChild(element.__resizeTriggers__);\n } catch (e) {\n // Preact compat; see developit/preact-compat/issues/228\n }\n }\n }\n };\n\n return {\n addResizeListener: addResizeListener,\n removeResizeListener: removeResizeListener\n };\n}\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar AutoSizer = function (_React$PureComponent) {\n inherits(AutoSizer, _React$PureComponent);\n\n function AutoSizer() {\n var _ref;\n\n var _temp, _this, _ret;\n\n classCallCheck(this, AutoSizer);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = possibleConstructorReturn(this, (_ref = AutoSizer.__proto__ || Object.getPrototypeOf(AutoSizer)).call.apply(_ref, [this].concat(args))), _this), _this.state = {\n height: _this.props.defaultHeight || 0,\n width: _this.props.defaultWidth || 0\n }, _this._onResize = function () {\n var _this$props = _this.props,\n disableHeight = _this$props.disableHeight,\n disableWidth = _this$props.disableWidth,\n onResize = _this$props.onResize;\n\n\n if (_this._parentNode) {\n // Guard against AutoSizer component being removed from the DOM immediately after being added.\n // This can result in invalid style values which can result in NaN values if we don't handle them.\n // See issue #150 for more context.\n\n var _height = _this._parentNode.offsetHeight || 0;\n var _width = _this._parentNode.offsetWidth || 0;\n\n var _style = window.getComputedStyle(_this._parentNode) || {};\n var paddingLeft = parseInt(_style.paddingLeft, 10) || 0;\n var paddingRight = parseInt(_style.paddingRight, 10) || 0;\n var paddingTop = parseInt(_style.paddingTop, 10) || 0;\n var paddingBottom = parseInt(_style.paddingBottom, 10) || 0;\n\n var newHeight = _height - paddingTop - paddingBottom;\n var newWidth = _width - paddingLeft - paddingRight;\n\n if (!disableHeight && _this.state.height !== newHeight || !disableWidth && _this.state.width !== newWidth) {\n _this.setState({\n height: _height - paddingTop - paddingBottom,\n width: _width - paddingLeft - paddingRight\n });\n\n onResize({ height: _height, width: _width });\n }\n }\n }, _this._setRef = function (autoSizer) {\n _this._autoSizer = autoSizer;\n }, _temp), possibleConstructorReturn(_this, _ret);\n }\n\n createClass(AutoSizer, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n var nonce = this.props.nonce;\n\n if (this._autoSizer && this._autoSizer.parentNode && this._autoSizer.parentNode.ownerDocument && this._autoSizer.parentNode.ownerDocument.defaultView && this._autoSizer.parentNode instanceof this._autoSizer.parentNode.ownerDocument.defaultView.HTMLElement) {\n // Delay access of parentNode until mount.\n // This handles edge-cases where the component has already been unmounted before its ref has been set,\n // As well as libraries like react-lite which have a slightly different lifecycle.\n this._parentNode = this._autoSizer.parentNode;\n\n // Defer requiring resize handler in order to support server-side rendering.\n // See issue #41\n this._detectElementResize = createDetectElementResize(nonce);\n this._detectElementResize.addResizeListener(this._parentNode, this._onResize);\n\n this._onResize();\n }\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n if (this._detectElementResize && this._parentNode) {\n this._detectElementResize.removeResizeListener(this._parentNode, this._onResize);\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var _props = this.props,\n children = _props.children,\n className = _props.className,\n disableHeight = _props.disableHeight,\n disableWidth = _props.disableWidth,\n style = _props.style;\n var _state = this.state,\n height = _state.height,\n width = _state.width;\n\n // Outer div should not force width/height since that may prevent containers from shrinking.\n // Inner component should overflow and use calculated width/height.\n // See issue #68 for more information.\n\n var outerStyle = { overflow: 'visible' };\n var childParams = {};\n\n // Avoid rendering children before the initial measurements have been collected.\n // At best this would just be wasting cycles.\n var bailoutOnChildren = false;\n\n if (!disableHeight) {\n if (height === 0) {\n bailoutOnChildren = true;\n }\n outerStyle.height = 0;\n childParams.height = height;\n }\n\n if (!disableWidth) {\n if (width === 0) {\n bailoutOnChildren = true;\n }\n outerStyle.width = 0;\n childParams.width = width;\n }\n\n return createElement(\n 'div',\n {\n className: className,\n ref: this._setRef,\n style: _extends({}, outerStyle, style) },\n !bailoutOnChildren && children(childParams)\n );\n }\n }]);\n return AutoSizer;\n}(PureComponent);\n\nAutoSizer.defaultProps = {\n onResize: function onResize() {},\n disableHeight: false,\n disableWidth: false,\n style: {}\n};\n\nexport default AutoSizer;\n","// Libraries\nimport _ from 'lodash';\n\n// Services & Utils\nimport { DataQuery, ExploreMode } from '@grafana/data';\nimport { renderUrl } from 'app/core/utils/url';\nimport store from 'app/core/store';\nimport { serializeStateToUrlParam, SortOrder } from './explore';\nimport { getExploreDatasources } from '../../features/explore/state/selectors';\n\n// Types\nimport { ExploreUrlState, RichHistoryQuery } from 'app/types/explore';\n\nconst RICH_HISTORY_KEY = 'grafana.explore.richHistory';\n\nexport const RICH_HISTORY_SETTING_KEYS = {\n retentionPeriod: 'grafana.explore.richHistory.retentionPeriod',\n starredTabAsFirstTab: 'grafana.explore.richHistory.starredTabAsFirstTab',\n activeDatasourceOnly: 'grafana.explore.richHistory.activeDatasourceOnly',\n datasourceFilters: 'grafana.explore.richHistory.datasourceFilters',\n};\n\n/*\n * Add queries to rich history. Save only queries within the retention period, or that are starred.\n * Side-effect: store history in local storage\n */\n\nexport function addToRichHistory(\n richHistory: RichHistoryQuery[],\n datasourceId: string,\n datasourceName: string | null,\n queries: string[],\n starred: boolean,\n comment: string | null,\n sessionName: string\n): any {\n const ts = Date.now();\n /* Save only queries, that are not falsy (e.g. empty strings, null) */\n const queriesToSave = queries.filter(expr => Boolean(expr));\n\n const retentionPeriod = store.getObject(RICH_HISTORY_SETTING_KEYS.retentionPeriod, 7);\n const retentionPeriodLastTs = createRetentionPeriodBoundary(retentionPeriod, false);\n\n /* Keep only queries, that are within the selected retention period or that are starred.\n * If no queries, initialize with exmpty array\n */\n const queriesToKeep = richHistory.filter(q => q.ts > retentionPeriodLastTs || q.starred === true) || [];\n\n if (queriesToSave.length > 0) {\n if (\n /* Don't save duplicated queries for the same datasource */\n queriesToKeep.length > 0 &&\n JSON.stringify(queriesToSave) === JSON.stringify(queriesToKeep[0].queries) &&\n JSON.stringify(datasourceName) === JSON.stringify(queriesToKeep[0].datasourceName)\n ) {\n return richHistory;\n }\n\n let newHistory = [\n { queries: queriesToSave, ts, datasourceId, datasourceName, starred, comment, sessionName },\n ...queriesToKeep,\n ];\n\n /* Combine all queries of a datasource type into one rich history */\n const isSaved = store.setObject(RICH_HISTORY_KEY, newHistory);\n\n /* If newHistory is succesfully saved, return it. Otherwise return not updated richHistory. */\n if (isSaved) {\n return newHistory;\n } else {\n return richHistory;\n }\n }\n\n return richHistory;\n}\n\nexport function getRichHistory() {\n return store.getObject(RICH_HISTORY_KEY, []);\n}\n\nexport function deleteAllFromRichHistory() {\n return store.delete(RICH_HISTORY_KEY);\n}\n\nexport function updateStarredInRichHistory(richHistory: RichHistoryQuery[], ts: number) {\n const updatedQueries = richHistory.map(query => {\n /* Timestamps are currently unique - we can use them to identify specific queries */\n if (query.ts === ts) {\n const isStarred = query.starred;\n const updatedQuery = Object.assign({}, query, { starred: !isStarred });\n return updatedQuery;\n }\n return query;\n });\n\n store.setObject(RICH_HISTORY_KEY, updatedQueries);\n return updatedQueries;\n}\n\nexport function updateCommentInRichHistory(\n richHistory: RichHistoryQuery[],\n ts: number,\n newComment: string | undefined\n) {\n const updatedQueries = richHistory.map(query => {\n if (query.ts === ts) {\n const updatedQuery = Object.assign({}, query, { comment: newComment });\n return updatedQuery;\n }\n return query;\n });\n\n store.setObject(RICH_HISTORY_KEY, updatedQueries);\n return updatedQueries;\n}\n\nexport function deleteQueryInRichHistory(richHistory: RichHistoryQuery[], ts: number) {\n const updatedQueries = richHistory.filter(query => query.ts !== ts);\n store.setObject(RICH_HISTORY_KEY, updatedQueries);\n return updatedQueries;\n}\n\nexport const sortQueries = (array: RichHistoryQuery[], sortOrder: SortOrder) => {\n let sortFunc;\n\n if (sortOrder === SortOrder.Ascending) {\n sortFunc = (a: RichHistoryQuery, b: RichHistoryQuery) => (a.ts < b.ts ? -1 : a.ts > b.ts ? 1 : 0);\n }\n if (sortOrder === SortOrder.Descending) {\n sortFunc = (a: RichHistoryQuery, b: RichHistoryQuery) => (a.ts < b.ts ? 1 : a.ts > b.ts ? -1 : 0);\n }\n\n if (sortOrder === SortOrder.DatasourceZA) {\n sortFunc = (a: RichHistoryQuery, b: RichHistoryQuery) =>\n a.datasourceName < b.datasourceName ? -1 : a.datasourceName > b.datasourceName ? 1 : 0;\n }\n\n if (sortOrder === SortOrder.DatasourceAZ) {\n sortFunc = (a: RichHistoryQuery, b: RichHistoryQuery) =>\n a.datasourceName < b.datasourceName ? 1 : a.datasourceName > b.datasourceName ? -1 : 0;\n }\n\n return array.sort(sortFunc);\n};\n\nexport const copyStringToClipboard = (string: string) => {\n const el = document.createElement('textarea');\n el.value = string;\n document.body.appendChild(el);\n el.select();\n document.execCommand('copy');\n document.body.removeChild(el);\n};\n\nexport const createUrlFromRichHistory = (query: RichHistoryQuery) => {\n const queries = query.queries.map(query => ({ expr: query }));\n const exploreState: ExploreUrlState = {\n /* Default range, as we are not saving timerange in rich history */\n range: { from: 'now-1h', to: 'now' },\n datasource: query.datasourceName,\n queries,\n /* Default mode. In the future, we can also save the query mode */\n mode: query.datasourceId === 'loki' ? ExploreMode.Logs : ExploreMode.Metrics,\n ui: {\n showingGraph: true,\n showingLogs: true,\n showingTable: true,\n },\n context: 'explore',\n };\n\n const serializedState = serializeStateToUrlParam(exploreState, true);\n const baseUrl = /.*(?=\\/explore)/.exec(`${window.location.href}`)[0];\n const url = renderUrl(`${baseUrl}/explore`, { left: serializedState });\n return url;\n};\n\n/* Needed for slider in Rich history to map numerical values to meaningful strings */\nexport const mapNumbertoTimeInSlider = (num: number) => {\n let str;\n switch (num) {\n case 0:\n str = 'today';\n break;\n case 1:\n str = 'yesterday';\n break;\n case 7:\n str = 'a week ago';\n break;\n case 14:\n str = 'two weeks ago';\n break;\n default:\n str = `${num} days ago`;\n }\n\n return str;\n};\n\nexport const createRetentionPeriodBoundary = (days: number, isLastTs: boolean) => {\n const today = new Date();\n const date = new Date(today.setDate(today.getDate() - days));\n /*\n * As a retention period boundaries, we consider:\n * - The last timestamp equals to the 24:00 of the last day of retention\n * - The first timestamp that equals to the 00:00 of the first day of retention\n */\n const boundary = isLastTs ? date.setHours(24, 0, 0, 0) : date.setHours(0, 0, 0, 0);\n return boundary;\n};\n\nexport function createDateStringFromTs(ts: number) {\n const date = new Date(ts);\n const month = date.toLocaleString('default', { month: 'long' });\n const day = date.getDate();\n return `${month} ${day}`;\n}\n\nexport function getQueryDisplayText(query: DataQuery): string {\n return JSON.stringify(query);\n}\n\nexport function createQueryHeading(query: RichHistoryQuery, sortOrder: SortOrder) {\n let heading = '';\n if (sortOrder === SortOrder.DatasourceAZ || sortOrder === SortOrder.DatasourceZA) {\n heading = query.datasourceName;\n } else {\n heading = createDateStringFromTs(query.ts);\n }\n return heading;\n}\n\nexport function isParsable(string: string) {\n try {\n JSON.parse(string);\n } catch (e) {\n return false;\n }\n return true;\n}\n\nexport function createDataQuery(query: RichHistoryQuery, queryString: string, index: number) {\n let dataQuery;\n const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n isParsable(queryString)\n ? (dataQuery = JSON.parse(queryString))\n : (dataQuery = { expr: queryString, refId: letters[index], datasource: query.datasourceName });\n\n return dataQuery;\n}\n\nexport function mapQueriesToHeadings(query: RichHistoryQuery[], sortOrder: SortOrder) {\n let mappedQueriesToHeadings: any = {};\n\n query.forEach(q => {\n let heading = createQueryHeading(q, sortOrder);\n if (!(heading in mappedQueriesToHeadings)) {\n mappedQueriesToHeadings[heading] = [q];\n } else {\n mappedQueriesToHeadings[heading] = [...mappedQueriesToHeadings[heading], q];\n }\n });\n\n return mappedQueriesToHeadings;\n}\n\n/* Create datasource list with images. If specific datasource retrieved from Rich history is not part of\n * exploreDatasources add generic datasource image and add property isRemoved = true.\n */\nexport function createDatasourcesList(queriesDatasources: string[]) {\n const exploreDatasources = getExploreDatasources();\n const datasources: Array<{ label: string; value: string; imgUrl: string; isRemoved: boolean }> = [];\n\n queriesDatasources.forEach(queryDsName => {\n const index = exploreDatasources.findIndex(exploreDs => exploreDs.name === queryDsName);\n if (index !== -1) {\n datasources.push({\n label: queryDsName,\n value: queryDsName,\n imgUrl: exploreDatasources[index].meta.info.logos.small,\n isRemoved: false,\n });\n } else {\n datasources.push({\n label: queryDsName,\n value: queryDsName,\n imgUrl: 'public/img/icn-datasource.svg',\n isRemoved: true,\n });\n }\n });\n return datasources;\n}\n"],"sourceRoot":""}