|
@@ -61,31 +61,31 @@ function Row({
|
|
|
const previewHighlights = highlighterExpressions && !_.isEqual(highlighterExpressions, row.searchWords);
|
|
const previewHighlights = highlighterExpressions && !_.isEqual(highlighterExpressions, row.searchWords);
|
|
|
const highlights = previewHighlights ? highlighterExpressions : row.searchWords;
|
|
const highlights = previewHighlights ? highlighterExpressions : row.searchWords;
|
|
|
const needsHighlighter = highlights && highlights.length > 0;
|
|
const needsHighlighter = highlights && highlights.length > 0;
|
|
|
- const highlightClassName = classnames('logs-row-match-highlight', {
|
|
|
|
|
- 'logs-row-match-highlight--preview': previewHighlights,
|
|
|
|
|
|
|
+ const highlightClassName = classnames('logs-row__match-highlight', {
|
|
|
|
|
+ 'logs-row__match-highlight--preview': previewHighlights,
|
|
|
});
|
|
});
|
|
|
return (
|
|
return (
|
|
|
- <>
|
|
|
|
|
|
|
+ <div className="logs-row">
|
|
|
{showDuplicates && (
|
|
{showDuplicates && (
|
|
|
- <div className="logs-row-duplicates">{row.duplicates > 0 ? `${row.duplicates + 1}x` : null}</div>
|
|
|
|
|
|
|
+ <div className="logs-row__duplicates">{row.duplicates > 0 ? `${row.duplicates + 1}x` : null}</div>
|
|
|
)}
|
|
)}
|
|
|
- <div className={row.logLevel ? `logs-row-level logs-row-level-${row.logLevel}` : ''} />
|
|
|
|
|
|
|
+ <div className={row.logLevel ? `logs-row__level logs-row__level--${row.logLevel}` : ''} />
|
|
|
{showUtc && (
|
|
{showUtc && (
|
|
|
- <div className="logs-row-time" title={`Local: ${row.timeLocal} (${row.timeFromNow})`}>
|
|
|
|
|
|
|
+ <div className="logs-row__time" title={`Local: ${row.timeLocal} (${row.timeFromNow})`}>
|
|
|
{row.timestamp}
|
|
{row.timestamp}
|
|
|
</div>
|
|
</div>
|
|
|
)}
|
|
)}
|
|
|
{showLocalTime && (
|
|
{showLocalTime && (
|
|
|
- <div className="logs-row-time" title={`${row.timestamp} (${row.timeFromNow})`}>
|
|
|
|
|
|
|
+ <div className="logs-row__time" title={`${row.timestamp} (${row.timeFromNow})`}>
|
|
|
{row.timeLocal}
|
|
{row.timeLocal}
|
|
|
</div>
|
|
</div>
|
|
|
)}
|
|
)}
|
|
|
{showLabels && (
|
|
{showLabels && (
|
|
|
- <div className="logs-row-labels">
|
|
|
|
|
|
|
+ <div className="logs-row__labels">
|
|
|
<LogLabels allRows={allRows} labels={row.uniqueLabels} onClickLabel={onClickLabel} />
|
|
<LogLabels allRows={allRows} labels={row.uniqueLabels} onClickLabel={onClickLabel} />
|
|
|
</div>
|
|
</div>
|
|
|
)}
|
|
)}
|
|
|
- <div className="logs-row-message">
|
|
|
|
|
|
|
+ <div className="logs-row__message">
|
|
|
{needsHighlighter ? (
|
|
{needsHighlighter ? (
|
|
|
<Highlighter
|
|
<Highlighter
|
|
|
textToHighlight={row.entry}
|
|
textToHighlight={row.entry}
|
|
@@ -97,14 +97,14 @@ function Row({
|
|
|
row.entry
|
|
row.entry
|
|
|
)}
|
|
)}
|
|
|
</div>
|
|
</div>
|
|
|
- </>
|
|
|
|
|
|
|
+ </div>
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function renderMetaItem(value: any, kind: LogsMetaKind) {
|
|
function renderMetaItem(value: any, kind: LogsMetaKind) {
|
|
|
if (kind === LogsMetaKind.LabelsMap) {
|
|
if (kind === LogsMetaKind.LabelsMap) {
|
|
|
return (
|
|
return (
|
|
|
- <span className="logs-meta-item__value-labels">
|
|
|
|
|
|
|
+ <span className="logs-meta-item__labels">
|
|
|
<LogLabels labels={value} plain />
|
|
<LogLabels labels={value} plain />
|
|
|
</span>
|
|
</span>
|
|
|
);
|
|
);
|
|
@@ -113,7 +113,6 @@ function renderMetaItem(value: any, kind: LogsMetaKind) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
interface LogsProps {
|
|
interface LogsProps {
|
|
|
- className?: string;
|
|
|
|
|
data: LogsModel;
|
|
data: LogsModel;
|
|
|
highlighterExpressions: string[];
|
|
highlighterExpressions: string[];
|
|
|
loading: boolean;
|
|
loading: boolean;
|
|
@@ -221,7 +220,6 @@ export default class Logs extends PureComponent<LogsProps, LogsState> {
|
|
|
|
|
|
|
|
render() {
|
|
render() {
|
|
|
const {
|
|
const {
|
|
|
- className = '',
|
|
|
|
|
data,
|
|
data,
|
|
|
highlighterExpressions,
|
|
highlighterExpressions,
|
|
|
loading = false,
|
|
loading = false,
|
|
@@ -264,31 +262,31 @@ export default class Logs extends PureComponent<LogsProps, LogsState> {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Grid options
|
|
// Grid options
|
|
|
- const cssColumnSizes = [];
|
|
|
|
|
- if (showDuplicates) {
|
|
|
|
|
- cssColumnSizes.push('max-content');
|
|
|
|
|
- }
|
|
|
|
|
- // Log-level indicator line
|
|
|
|
|
- cssColumnSizes.push('3px');
|
|
|
|
|
- if (showUtc) {
|
|
|
|
|
- cssColumnSizes.push('minmax(100px, max-content)');
|
|
|
|
|
- }
|
|
|
|
|
- if (showLocalTime) {
|
|
|
|
|
- cssColumnSizes.push('minmax(100px, max-content)');
|
|
|
|
|
- }
|
|
|
|
|
- if (showLabels) {
|
|
|
|
|
- cssColumnSizes.push('fit-content(20%)');
|
|
|
|
|
- }
|
|
|
|
|
- cssColumnSizes.push('1fr');
|
|
|
|
|
- const logEntriesStyle = {
|
|
|
|
|
- gridTemplateColumns: cssColumnSizes.join(' '),
|
|
|
|
|
- };
|
|
|
|
|
|
|
+ // const cssColumnSizes = [];
|
|
|
|
|
+ // if (showDuplicates) {
|
|
|
|
|
+ // cssColumnSizes.push('max-content');
|
|
|
|
|
+ // }
|
|
|
|
|
+ // // Log-level indicator line
|
|
|
|
|
+ // cssColumnSizes.push('3px');
|
|
|
|
|
+ // if (showUtc) {
|
|
|
|
|
+ // cssColumnSizes.push('minmax(220px, max-content)');
|
|
|
|
|
+ // }
|
|
|
|
|
+ // if (showLocalTime) {
|
|
|
|
|
+ // cssColumnSizes.push('minmax(140px, max-content)');
|
|
|
|
|
+ // }
|
|
|
|
|
+ // if (showLabels) {
|
|
|
|
|
+ // cssColumnSizes.push('fit-content(20%)');
|
|
|
|
|
+ // }
|
|
|
|
|
+ // cssColumnSizes.push('1fr');
|
|
|
|
|
+ // const logEntriesStyle = {
|
|
|
|
|
+ // gridTemplateColumns: cssColumnSizes.join(' '),
|
|
|
|
|
+ // };
|
|
|
|
|
|
|
|
const scanText = scanRange ? `Scanning ${rangeUtil.describeTimeRange(scanRange)}` : 'Scanning...';
|
|
const scanText = scanRange ? `Scanning ${rangeUtil.describeTimeRange(scanRange)}` : 'Scanning...';
|
|
|
|
|
|
|
|
return (
|
|
return (
|
|
|
- <div className={`${className} logs`}>
|
|
|
|
|
- <div className="logs-graph">
|
|
|
|
|
|
|
+ <div className="logs-panel">
|
|
|
|
|
+ <div className="logs-panel-graph">
|
|
|
<Graph
|
|
<Graph
|
|
|
data={data.series}
|
|
data={data.series}
|
|
|
height="100px"
|
|
height="100px"
|
|
@@ -299,9 +297,8 @@ export default class Logs extends PureComponent<LogsProps, LogsState> {
|
|
|
userOptions={graphOptions}
|
|
userOptions={graphOptions}
|
|
|
/>
|
|
/>
|
|
|
</div>
|
|
</div>
|
|
|
-
|
|
|
|
|
- <div className="logs-options">
|
|
|
|
|
- <div className="logs-controls">
|
|
|
|
|
|
|
+ <div className="logs-panel-options">
|
|
|
|
|
+ <div className="logs-panel-controls">
|
|
|
<Switch label="Timestamp" checked={showUtc} onChange={this.onChangeUtc} small />
|
|
<Switch label="Timestamp" checked={showUtc} onChange={this.onChangeUtc} small />
|
|
|
<Switch label="Local time" checked={showLocalTime} onChange={this.onChangeLocalTime} small />
|
|
<Switch label="Local time" checked={showLocalTime} onChange={this.onChangeLocalTime} small />
|
|
|
<Switch label="Labels" checked={showLabels} onChange={this.onChangeLabels} small />
|
|
<Switch label="Labels" checked={showLabels} onChange={this.onChangeLabels} small />
|
|
@@ -331,11 +328,11 @@ export default class Logs extends PureComponent<LogsProps, LogsState> {
|
|
|
/>
|
|
/>
|
|
|
{hasData &&
|
|
{hasData &&
|
|
|
meta && (
|
|
meta && (
|
|
|
- <div className="logs-meta">
|
|
|
|
|
|
|
+ <div className="logs-panel-meta">
|
|
|
{meta.map(item => (
|
|
{meta.map(item => (
|
|
|
- <div className="logs-meta-item" key={item.label}>
|
|
|
|
|
- <span className="logs-meta-item__label">{item.label}:</span>
|
|
|
|
|
- <span className="logs-meta-item__value">{renderMetaItem(item.value, item.kind)}</span>
|
|
|
|
|
|
|
+ <div className="logs-panel-meta__item" key={item.label}>
|
|
|
|
|
+ <span className="logs-panel-meta__label">{item.label}:</span>
|
|
|
|
|
+ <span className="logs-panel-meta__value">{renderMetaItem(item.value, item.kind)}</span>
|
|
|
</div>
|
|
</div>
|
|
|
))}
|
|
))}
|
|
|
</div>
|
|
</div>
|
|
@@ -343,7 +340,7 @@ export default class Logs extends PureComponent<LogsProps, LogsState> {
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <div className="logs-entries" style={logEntriesStyle}>
|
|
|
|
|
|
|
+ <div className="logs-rows">
|
|
|
{hasData &&
|
|
{hasData &&
|
|
|
!deferLogs &&
|
|
!deferLogs &&
|
|
|
// Only inject highlighterExpression in the first set for performance reasons
|
|
// Only inject highlighterExpression in the first set for performance reasons
|
|
@@ -380,7 +377,7 @@ export default class Logs extends PureComponent<LogsProps, LogsState> {
|
|
|
{!loading &&
|
|
{!loading &&
|
|
|
!hasData &&
|
|
!hasData &&
|
|
|
!scanning && (
|
|
!scanning && (
|
|
|
- <div className="logs-nodata">
|
|
|
|
|
|
|
+ <div className="logs-panel-nodata">
|
|
|
No logs found.
|
|
No logs found.
|
|
|
<a className="link" onClick={this.onClickScan}>
|
|
<a className="link" onClick={this.onClickScan}>
|
|
|
Scan for older logs
|
|
Scan for older logs
|
|
@@ -389,7 +386,7 @@ export default class Logs extends PureComponent<LogsProps, LogsState> {
|
|
|
)}
|
|
)}
|
|
|
|
|
|
|
|
{scanning && (
|
|
{scanning && (
|
|
|
- <div className="logs-nodata">
|
|
|
|
|
|
|
+ <div className="logs-panel-nodata">
|
|
|
<span>{scanText}</span>
|
|
<span>{scanText}</span>
|
|
|
<a className="link" onClick={this.onClickStopScan}>
|
|
<a className="link" onClick={this.onClickStopScan}>
|
|
|
Stop scan
|
|
Stop scan
|