import './logsTable.styles.scss'; import { Card, Typography } from 'antd'; import LogDetail from 'components/LogDetail'; import { VIEW_TYPES } from 'components/LogDetail/constants'; // components import ListLogView from 'components/Logs/ListLogView'; import RawLogView from 'components/Logs/RawLogView'; import LogsTableView from 'components/Logs/TableView'; import OverlayScrollbar from 'components/OverlayScrollbar/OverlayScrollbar'; import Spinner from 'components/Spinner'; import { CARD_BODY_STYLE } from 'constants/card'; import { LOCALSTORAGE } from 'constants/localStorage'; import { useOptionsMenu } from 'container/OptionsMenu'; import { useActiveLog } from 'hooks/logs/useActiveLog'; import { memo, useCallback, useMemo } from 'react'; import { useSelector } from 'react-redux'; import { Virtuoso } from 'react-virtuoso'; import { AppState } from 'store/reducers'; import { DataSource, StringOperators } from 'types/common/queryBuilder'; // interfaces import { ILogsReducer } from 'types/reducer/logs'; // styles import { Container, Heading } from './styles'; export type LogViewMode = 'raw' | 'table' | 'list'; type LogsTableProps = { viewMode: LogViewMode; linesPerRow: number; }; function LogsTable(props: LogsTableProps): JSX.Element { const { viewMode, linesPerRow } = props; const { activeLog, onClearActiveLog, onAddToQuery, onGroupByAttribute, onSetActiveLog, } = useActiveLog(); const { logs, fields: { selected }, isLoading, liveTail, } = useSelector((state) => state.logs); const isLiveTail = useMemo(() => logs.length === 0 && liveTail === 'PLAYING', [ logs?.length, liveTail, ]); const isNoLogs = useMemo(() => logs.length === 0 && liveTail === 'STOPPED', [ logs?.length, liveTail, ]); const { options } = useOptionsMenu({ storageKey: LOCALSTORAGE.LOGS_LIST_OPTIONS, // this component will alwyays be called on old logs explorer page itself! dataSource: DataSource.LOGS, // and we do not have table / timeseries aggregated views in the old logs explorer! aggregateOperator: StringOperators.NOOP, }); const getItemContent = useCallback( (index: number): JSX.Element => { const log = logs[index]; if (viewMode === 'raw') { return ( ); } return ( ); }, [ logs, viewMode, selected, linesPerRow, onAddToQuery, onSetActiveLog, options.fontSize, ], ); const renderContent = useMemo(() => { if (viewMode === 'table') { return ( ); } return ( ); }, [ getItemContent, linesPerRow, logs, onSetActiveLog, options.fontSize, selected, viewMode, ]); if (isLoading) { return ; } return ( {viewMode !== 'table' && ( Event )} {isLiveTail && Getting live logs...} {isNoLogs && No logs lines found} {renderContent} ); } export default memo(LogsTable);