mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
LogRowMessageDisplayedFields: sync implementation with LogRowMessage (#71770)
* LogRowMessageDisplayedFields: sync implementation with LogRowMessage * Add regression test
This commit is contained in:
parent
626ac67dd7
commit
43f4e55a76
@ -120,4 +120,17 @@ describe('LogRow', () => {
|
|||||||
|
|
||||||
expect(screen.getByLabelText('Show context')).toBeInTheDocument();
|
expect(screen.getByLabelText('Show context')).toBeInTheDocument();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should render the menu cell on mouse over with displayed fields', async () => {
|
||||||
|
setup(
|
||||||
|
{ showContextToggle: jest.fn().mockReturnValue(true), displayedFields: ['test'] },
|
||||||
|
{ labels: { test: 'field value' } }
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(screen.queryByLabelText('Show context')).not.toBeInTheDocument();
|
||||||
|
|
||||||
|
await userEvent.hover(screen.getByText('test=field value'));
|
||||||
|
|
||||||
|
expect(screen.getByLabelText('Show context')).toBeInTheDocument();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -239,6 +239,7 @@ class UnThemedLogRow extends PureComponent<Props, State> {
|
|||||||
onPinLine={this.props.onPinLine}
|
onPinLine={this.props.onPinLine}
|
||||||
onUnpinLine={this.props.onUnpinLine}
|
onUnpinLine={this.props.onUnpinLine}
|
||||||
pinned={this.props.pinned}
|
pinned={this.props.pinned}
|
||||||
|
mouseIsOver={this.state.mouseIsOver}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<LogRowMessage
|
<LogRowMessage
|
||||||
|
@ -20,6 +20,7 @@ const setup = (propOverrides: Partial<Props> = {}, detectedFields = ['place', 'p
|
|||||||
onOpenContext: () => {},
|
onOpenContext: () => {},
|
||||||
styles,
|
styles,
|
||||||
detectedFields,
|
detectedFields,
|
||||||
|
mouseIsOver: true,
|
||||||
...propOverrides,
|
...propOverrides,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { css } from '@emotion/css';
|
import { css } from '@emotion/css';
|
||||||
import React, { useCallback, useMemo, useState } from 'react';
|
import React, { useMemo } from 'react';
|
||||||
|
|
||||||
import { LogRowModel, Field, LinkModel, DataFrame } from '@grafana/data';
|
import { LogRowModel, Field, LinkModel, DataFrame } from '@grafana/data';
|
||||||
|
|
||||||
@ -19,11 +19,11 @@ export interface Props {
|
|||||||
onPinLine?: (row: LogRowModel) => void;
|
onPinLine?: (row: LogRowModel) => void;
|
||||||
onUnpinLine?: (row: LogRowModel) => void;
|
onUnpinLine?: (row: LogRowModel) => void;
|
||||||
pinned?: boolean;
|
pinned?: boolean;
|
||||||
|
mouseIsOver: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const LogRowMessageDisplayedFields = React.memo((props: Props) => {
|
export const LogRowMessageDisplayedFields = React.memo((props: Props) => {
|
||||||
const [hover, setHover] = useState(false);
|
const { row, detectedFields, getFieldLinks, wrapLogMessage, styles, mouseIsOver, pinned, ...rest } = props;
|
||||||
const { row, detectedFields, getFieldLinks, wrapLogMessage, styles, pinned, ...rest } = props;
|
|
||||||
const fields = getAllFields(row, getFieldLinks);
|
const fields = getAllFields(row, getFieldLinks);
|
||||||
const wrapClassName = wrapLogMessage ? '' : displayedFieldsStyles.noWrap;
|
const wrapClassName = wrapLogMessage ? '' : displayedFieldsStyles.noWrap;
|
||||||
// only single key/value rows are filterable, so we only need the first field key for filtering
|
// only single key/value rows are filterable, so we only need the first field key for filtering
|
||||||
@ -51,22 +51,23 @@ export const LogRowMessageDisplayedFields = React.memo((props: Props) => {
|
|||||||
[detectedFields, fields, row.labels]
|
[detectedFields, fields, row.labels]
|
||||||
);
|
);
|
||||||
|
|
||||||
const showMenu = useCallback(() => {
|
const shouldShowMenu = useMemo(() => mouseIsOver || pinned, [mouseIsOver, pinned]);
|
||||||
setHover(true);
|
|
||||||
}, []);
|
|
||||||
const hideMenu = useCallback(() => {
|
|
||||||
setHover(false);
|
|
||||||
}, []);
|
|
||||||
const shouldShowMenu = useMemo(() => hover || pinned, [hover, pinned]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<td className={styles.logsRowMessage} onMouseEnter={showMenu} onMouseLeave={hideMenu}>
|
<td className={styles.logsRowMessage}>
|
||||||
<div className={wrapClassName}>{line}</div>
|
<div className={wrapClassName}>{line}</div>
|
||||||
</td>
|
</td>
|
||||||
<td className={`log-row-menu-cell ${styles.logRowMenuCell}`} onMouseEnter={showMenu} onMouseLeave={hideMenu}>
|
<td className={`log-row-menu-cell ${styles.logRowMenuCell}`}>
|
||||||
{shouldShowMenu && (
|
{shouldShowMenu && (
|
||||||
<LogRowMenuCell logText={line} row={row} styles={styles} pinned={pinned} {...rest} mouseIsOver={false} />
|
<LogRowMenuCell
|
||||||
|
logText={line}
|
||||||
|
row={row}
|
||||||
|
styles={styles}
|
||||||
|
pinned={pinned}
|
||||||
|
{...rest}
|
||||||
|
mouseIsOver={mouseIsOver}
|
||||||
|
/>
|
||||||
)}
|
)}
|
||||||
</td>
|
</td>
|
||||||
</>
|
</>
|
||||||
|
Loading…
Reference in New Issue
Block a user