From 356fa0dce65ebaf72944f7a89e5520535821a659 Mon Sep 17 00:00:00 2001 From: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> Date: Tue, 15 Dec 2020 14:43:12 +0100 Subject: [PATCH] Explore/Logs: Correctly display newlines in detected fields (#29541) * Fix using of newlines in detected fields * Wrapping depends on main selection * Update props to be optional * Add missing wrapLogMessage prop to test --- .../src/components/Logs/LogDetails.test.tsx | 1 + .../grafana-ui/src/components/Logs/LogDetails.tsx | 3 +++ .../src/components/Logs/LogDetailsRow.test.tsx | 1 + .../grafana-ui/src/components/Logs/LogDetailsRow.tsx | 9 +++++++-- packages/grafana-ui/src/components/Logs/LogRow.tsx | 2 ++ .../components/Logs/LogRowMessageDetectedFields.tsx | 12 ++++++++++-- 6 files changed, 24 insertions(+), 4 deletions(-) diff --git a/packages/grafana-ui/src/components/Logs/LogDetails.test.tsx b/packages/grafana-ui/src/components/Logs/LogDetails.test.tsx index c5e0996c638..5a668b0c2a8 100644 --- a/packages/grafana-ui/src/components/Logs/LogDetails.test.tsx +++ b/packages/grafana-ui/src/components/Logs/LogDetails.test.tsx @@ -8,6 +8,7 @@ const setup = (propOverrides?: Partial, rowOverrides?: Partial LogRowModel[]; + wrapLogMessage: boolean; className?: string; hasError?: boolean; onMouseEnter?: () => void; @@ -85,6 +86,7 @@ class UnThemedLogDetails extends PureComponent { onClickHideDetectedField, showDetectedFields, getFieldLinks, + wrapLogMessage, } = this.props; const style = getLogRowStyles(theme, row.logLevel); const styles = getStyles(theme); @@ -163,6 +165,7 @@ class UnThemedLogDetails extends PureComponent { : calculateStats(row.dataFrame.fields[fieldIndex].values.toArray()) } showDetectedFields={showDetectedFields} + wrapLogMessage={wrapLogMessage} /> ); })} diff --git a/packages/grafana-ui/src/components/Logs/LogDetailsRow.test.tsx b/packages/grafana-ui/src/components/Logs/LogDetailsRow.test.tsx index efc5a994ffa..9bebe3ebce3 100644 --- a/packages/grafana-ui/src/components/Logs/LogDetailsRow.test.tsx +++ b/packages/grafana-ui/src/components/Logs/LogDetailsRow.test.tsx @@ -10,6 +10,7 @@ const setup = (propOverrides?: Partial) => { parsedValue: '', parsedKey: '', isLabel: true, + wrapLogMessage: false, getStats: () => null, onClickFilterLabel: () => {}, onClickFilterOutLabel: () => {}, diff --git a/packages/grafana-ui/src/components/Logs/LogDetailsRow.tsx b/packages/grafana-ui/src/components/Logs/LogDetailsRow.tsx index 6ac71df2c7b..7b2112c9761 100644 --- a/packages/grafana-ui/src/components/Logs/LogDetailsRow.tsx +++ b/packages/grafana-ui/src/components/Logs/LogDetailsRow.tsx @@ -15,6 +15,7 @@ import { Tag } from '..'; export interface Props extends Themeable { parsedValue: string; parsedKey: string; + wrapLogMessage?: boolean; isLabel?: boolean; onClickFilterLabel?: (key: string, value: string) => void; onClickFilterOutLabel?: (key: string, value: string) => void; @@ -50,6 +51,10 @@ const getStyles = stylesFactory((theme: GrafanaTheme) => { showingField: css` color: ${theme.palette.blue95}; `, + wrapLine: css` + label: wrapLine; + white-space: pre-wrap; + `, }; }); @@ -107,7 +112,7 @@ class UnThemedLogDetailsRow extends PureComponent { } render() { - const { theme, parsedKey, parsedValue, isLabel, links, showDetectedFields } = this.props; + const { theme, parsedKey, parsedValue, isLabel, links, showDetectedFields, wrapLogMessage } = this.props; const { showFieldsStats, fieldStats, fieldCount } = this.state; const styles = getStyles(theme); const style = getLogRowStyles(theme); @@ -146,7 +151,7 @@ class UnThemedLogDetailsRow extends PureComponent { {/* Key - value columns */} {parsedKey} - + {parsedValue} {links && links.map(link => { diff --git a/packages/grafana-ui/src/components/Logs/LogRow.tsx b/packages/grafana-ui/src/components/Logs/LogRow.tsx index 9ab3ce6e860..e715473e24e 100644 --- a/packages/grafana-ui/src/components/Logs/LogRow.tsx +++ b/packages/grafana-ui/src/components/Logs/LogRow.tsx @@ -203,6 +203,7 @@ class UnThemedLogRow extends PureComponent { row={row} showDetectedFields={showDetectedFields!} getFieldLinks={getFieldLinks} + wrapLogMessage={wrapLogMessage} /> ) : ( { onClickHideDetectedField={onClickHideDetectedField} getRows={getRows} row={row} + wrapLogMessage={wrapLogMessage} hasError={hasError} showDetectedFields={showDetectedFields} /> diff --git a/packages/grafana-ui/src/components/Logs/LogRowMessageDetectedFields.tsx b/packages/grafana-ui/src/components/Logs/LogRowMessageDetectedFields.tsx index 6d5b7c8708c..33dbe57d1f9 100644 --- a/packages/grafana-ui/src/components/Logs/LogRowMessageDetectedFields.tsx +++ b/packages/grafana-ui/src/components/Logs/LogRowMessageDetectedFields.tsx @@ -1,4 +1,5 @@ import React, { PureComponent } from 'react'; +import { cx, css } from 'emotion'; import { LogRowModel, Field, LinkModel } from '@grafana/data'; import { Themeable } from '../../types/theme'; @@ -9,13 +10,20 @@ import { getAllFields } from './logParser'; export interface Props extends Themeable { row: LogRowModel; showDetectedFields: string[]; + wrapLogMessage: boolean; getFieldLinks?: (field: Field, rowIndex: number) => Array>; } class UnThemedLogRowMessageDetectedFields extends PureComponent { render() { - const { row, showDetectedFields, getFieldLinks } = this.props; + const { row, showDetectedFields, getFieldLinks, wrapLogMessage } = this.props; const fields = getAllFields(row, getFieldLinks); + const wrapClassName = cx( + wrapLogMessage && + css` + white-space: pre-wrap; + ` + ); const line = showDetectedFields .map(parsedKey => { @@ -33,7 +41,7 @@ class UnThemedLogRowMessageDetectedFields extends PureComponent { .filter(s => s !== null) .join(' '); - return {line}; + return {line}; } }