LogList: add version with no scroll

This commit is contained in:
Matias Chomicki
2025-05-21 12:37:54 +02:00
parent cefd2dab7a
commit f26cdce696
2 changed files with 75 additions and 39 deletions
@@ -7,7 +7,7 @@ import { createLogRow } from '../__mocks__/logRow';
import { LogList, Props } from './LogList';
describe('LogList', () => {
describe.each([false, true])('LogList with scroll = %s', (noScroll: boolean) => {
let logs: LogRowModel[], defaultProps: Props;
beforeEach(() => {
logs = [
@@ -21,6 +21,7 @@ describe('LogList', () => {
displayedFields: [],
enableLogDetails: false,
logs,
noScroll,
showControls: false,
showTime: false,
sortOrder: LogsSortOrder.Descending,
@@ -18,11 +18,11 @@ import {
store,
TimeRange,
} from '@grafana/data';
import { PopoverContent, useTheme2 } from '@grafana/ui';
import { PopoverContent, useStyles2, useTheme2 } from '@grafana/ui';
import { GetFieldLinksFn } from 'app/plugins/panel/logs/types';
import { InfiniteScroll } from './InfiniteScroll';
import { getGridTemplateColumns } from './LogLine';
import { getGridTemplateColumns, LogLine, getStyles as getLogLineStyles } from './LogLine';
import { LogLineDetails } from './LogLineDetails';
import { GetRowContextQueryFn } from './LogLineMenu';
import { LogListContextProvider, LogListState, useLogListContext } from './LogListContext';
@@ -57,6 +57,7 @@ export interface Props {
logs: LogRowModel[];
logsMeta?: LogsMetaItem[];
logSupportsContext?: (row: LogRowModel) => boolean;
noScroll?: boolean;
onClickFilterLabel?: (key: string, value: string, frame?: DataFrame) => void;
onClickFilterOutLabel?: (key: string, value: string, frame?: DataFrame) => void;
onClickFilterString?: (value: string, refId?: string) => void;
@@ -113,6 +114,7 @@ export const LogList = ({
logs,
logsMeta,
logSupportsContext,
noScroll,
onClickFilterLabel,
onClickFilterOutLabel,
onClickFilterString,
@@ -178,6 +180,7 @@ export const LogList = ({
loading={loading}
loadMore={loadMore}
logs={logs}
noScroll={noScroll}
showControls={showControls}
timeRange={timeRange}
timeZone={timeZone}
@@ -195,6 +198,7 @@ const LogListComponent = ({
loading,
loadMore,
logs,
noScroll,
showControls,
timeRange,
timeZone,
@@ -320,42 +324,46 @@ const LogListComponent = ({
return (
<div className={styles.logListContainer}>
<div className={styles.logListWrapper} ref={wrapperRef}>
<InfiniteScroll
displayedFields={displayedFields}
handleOverflow={handleOverflow}
logs={filteredLogs}
loadMore={loadMore}
onClick={handleLogLineClick}
scrollElement={scrollRef.current}
showTime={showTime}
sortOrder={sortOrder}
timeRange={timeRange}
timeZone={timeZone}
setInitialScrollPosition={handleScrollPosition}
wrapLogMessage={wrapLogMessage}
>
{({ getItemKey, itemCount, onItemsRendered, Renderer }) => (
<VariableSizeList
className={styles.logList}
height={listHeight}
itemCount={itemCount}
itemSize={getLogLineSize.bind(null, filteredLogs, widthContainer, displayedFields, {
showDuplicates: dedupStrategy !== LogsDedupStrategy.none,
showTime,
wrap: wrapLogMessage,
})}
itemKey={getItemKey}
layout="vertical"
onItemsRendered={onItemsRendered}
outerRef={scrollRef}
ref={listRef}
style={{ overflowY: 'scroll' }}
width="100%"
>
{Renderer}
</VariableSizeList>
)}
</InfiniteScroll>
{!noScroll ? (
<InfiniteScroll
displayedFields={displayedFields}
handleOverflow={handleOverflow}
logs={filteredLogs}
loadMore={loadMore}
onClick={handleLogLineClick}
scrollElement={scrollRef.current}
showTime={showTime}
sortOrder={sortOrder}
timeRange={timeRange}
timeZone={timeZone}
setInitialScrollPosition={handleScrollPosition}
wrapLogMessage={wrapLogMessage}
>
{({ getItemKey, itemCount, onItemsRendered, Renderer }) => (
<VariableSizeList
className={styles.logList}
height={listHeight}
itemCount={itemCount}
itemSize={getLogLineSize.bind(null, filteredLogs, widthContainer, displayedFields, {
showDuplicates: dedupStrategy !== LogsDedupStrategy.none,
showTime,
wrap: wrapLogMessage,
})}
itemKey={getItemKey}
layout="vertical"
onItemsRendered={onItemsRendered}
outerRef={scrollRef}
ref={listRef}
style={{ overflowY: 'scroll' }}
width="100%"
>
{Renderer}
</VariableSizeList>
)}
</InfiniteScroll>
) : (
<LogListNoScroll logs={filteredLogs} onClick={handleLogLineClick} />
)}
</div>
{showDetails.length > 0 && (
<LogLineDetails
@@ -370,6 +378,33 @@ const LogListComponent = ({
);
};
interface LogListNoScrollProps {
logs: LogListModel[];
onClick: (log: LogListModel) => void;
}
const LogListNoScroll = ({ logs, onClick }: LogListNoScrollProps) => {
const { displayedFields, showTime, wrapLogMessage } = useLogListContext();
const styles = useStyles2(getLogLineStyles);
return (
<>
{logs.map((log, index) => (
<LogLine
displayedFields={displayedFields}
index={index}
key={log.uid}
log={log}
showTime={showTime}
style={{}}
styles={styles}
onClick={onClick}
wrapLogMessage={wrapLogMessage}
/>
))}
</>
);
};
function getStyles(dimensions: LogFieldDimension[], { showTime }: { showTime: boolean }) {
const columns = showTime ? dimensions : dimensions.filter((_, index) => index > 0);
return {