import React, { PureComponent } from 'react'; import { hot } from 'react-hot-loader'; import { connect } from 'react-redux'; import { Collapse } from '@grafana/ui'; import { DataSourceApi, RawTimeRange, LogLevel, TimeZone, AbsoluteTimeRange, LogRowModel, LogsDedupStrategy, TimeRange, LogsMetaItem, GraphSeriesXY, } from '@grafana/data'; import { ExploreId, ExploreItemState } from 'app/types/explore'; import { StoreState } from 'app/types'; import { changeDedupStrategy, updateTimeRange } from './state/actions'; import { toggleLogLevelAction } from 'app/features/explore/state/actionTypes'; import { deduplicatedRowsSelector } from 'app/features/explore/state/selectors'; import { getTimeZone } from '../profile/state/selectors'; import { LiveLogsWithTheme } from './LiveLogs'; import { Logs } from './Logs'; import { LogsCrossFadeTransition } from './utils/LogsCrossFadeTransition'; import { LiveTailControls } from './useLiveTailControls'; import { getLinksFromLogsField } from '../panel/panellinks/linkSuppliers'; interface LogsContainerProps { datasourceInstance: DataSourceApi | null; exploreId: ExploreId; loading: boolean; logsHighlighterExpressions?: string[]; logRows?: LogRowModel[]; logsMeta?: LogsMetaItem[]; logsSeries?: GraphSeriesXY[]; dedupedRows?: LogRowModel[]; onClickFilterLabel?: (key: string, value: string) => void; onClickFilterOutLabel?: (key: string, value: string) => void; onStartScanning: () => void; onStopScanning: () => void; timeZone: TimeZone; scanning?: boolean; scanRange?: RawTimeRange; toggleLogLevelAction: typeof toggleLogLevelAction; changeDedupStrategy: typeof changeDedupStrategy; dedupStrategy: LogsDedupStrategy; width: number; isLive: boolean; updateTimeRange: typeof updateTimeRange; range: TimeRange; syncedTimes: boolean; absoluteRange: AbsoluteTimeRange; isPaused: boolean; } export class LogsContainer extends PureComponent { onChangeTime = (absoluteRange: AbsoluteTimeRange) => { const { exploreId, updateTimeRange } = this.props; updateTimeRange({ exploreId, absoluteRange }); }; handleDedupStrategyChange = (dedupStrategy: LogsDedupStrategy) => { this.props.changeDedupStrategy(this.props.exploreId, dedupStrategy); }; handleToggleLogLevel = (hiddenLogLevels: LogLevel[]) => { const { exploreId } = this.props; this.props.toggleLogLevelAction({ exploreId, hiddenLogLevels, }); }; getLogRowContext = async (row: LogRowModel, options?: any): Promise => { const { datasourceInstance } = this.props; if (datasourceInstance) { return datasourceInstance.getLogRowContext(row, options); } return []; }; render() { const { loading, logsHighlighterExpressions, logRows, logsMeta, logsSeries, dedupedRows, onClickFilterLabel, onClickFilterOutLabel, onStartScanning, onStopScanning, absoluteRange, timeZone, scanning, range, width, isLive, exploreId, } = this.props; return ( <> {controls => ( )} ); } } function mapStateToProps(state: StoreState, { exploreId }: { exploreId: string }) { const explore = state.explore; // @ts-ignore const item: ExploreItemState = explore[exploreId]; const { logsHighlighterExpressions, logsResult, loading, scanning, datasourceInstance, isLive, isPaused, range, absoluteRange, dedupStrategy, } = item; const dedupedRows = deduplicatedRowsSelector(item); const timeZone = getTimeZone(state.user); return { loading, logsHighlighterExpressions, logRows: logsResult && logsResult.rows, logsMeta: logsResult && logsResult.meta, logsSeries: logsResult && logsResult.series, scanning, timeZone, dedupStrategy, dedupedRows, datasourceInstance, isLive, isPaused, range, absoluteRange, }; } const mapDispatchToProps = { changeDedupStrategy, toggleLogLevelAction, updateTimeRange, }; export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(LogsContainer));