Logs.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import React, { Fragment, PureComponent } from 'react';
  2. import Highlighter from 'react-highlight-words';
  3. import { LogsModel } from 'app/core/logs_model';
  4. import { findHighlightChunksInText } from 'app/core/utils/text';
  5. interface LogsProps {
  6. className?: string;
  7. data: LogsModel;
  8. loading: boolean;
  9. }
  10. export default class Logs extends PureComponent<LogsProps, {}> {
  11. render() {
  12. const { className = '', data, loading = false } = this.props;
  13. const hasData = data && data.rows && data.rows.length > 0;
  14. return (
  15. <div className={`${className} logs`}>
  16. <div className="panel-container">
  17. {loading && <div className="explore-panel__loader" />}
  18. <div className="logs-entries">
  19. {hasData &&
  20. data.rows.map(row => (
  21. <Fragment key={row.key}>
  22. <div className={row.logLevel ? `logs-row-level logs-row-level-${row.logLevel}` : ''} />
  23. <div title={`${row.timestamp} (${row.timeFromNow})`}>{row.timeLocal}</div>
  24. <div>
  25. <Highlighter
  26. textToHighlight={row.entry}
  27. searchWords={row.searchWords}
  28. findChunks={findHighlightChunksInText}
  29. highlightClassName="logs-row-match-highlight"
  30. />
  31. </div>
  32. </Fragment>
  33. ))}
  34. </div>
  35. {!loading && !hasData && 'No data was returned.'}
  36. </div>
  37. </div>
  38. );
  39. }
  40. }