owncast/web/pages/components/log-table.tsx

90 lines
1.9 KiB
TypeScript
Raw Normal View History

2020-10-30 04:01:38 +03:00
import React from "react";
import { timeFormat } from "d3-time-format";
2020-11-13 14:57:57 +03:00
import { Table, Tag, Typography } from "antd";
2020-10-30 04:01:38 +03:00
import Linkify from "react-linkify";
2020-11-01 09:17:44 +03:00
import { SortOrder } from "antd/lib/table/interface";
2020-11-13 14:57:57 +03:00
const { Title } = Typography;
2020-11-01 09:17:44 +03:00
function renderColumnLevel(text, entry) {
let color = 'black';
if (entry.level === "warning") {
color = "orange";
} else if (entry.level === 'error') {
color = "red";
}
2020-11-03 04:23:32 +03:00
return <Tag color={color}>{text}</Tag>;
2020-11-01 09:17:44 +03:00
}
2020-11-01 10:01:37 +03:00
function renderMessage(text) {
2020-11-01 09:17:44 +03:00
return (
<Linkify>{text}</Linkify>
)
}
2020-10-30 04:01:38 +03:00
2020-11-01 10:01:37 +03:00
interface Props {
logs: object[],
pageSize: number
}
export default function LogTable({ logs, pageSize }: Props) {
2020-11-13 14:57:57 +03:00
if (!logs.length) {
return null;
}
2020-10-30 04:01:38 +03:00
const columns = [
{
title: "Level",
dataIndex: "level",
key: "level",
filters: [
{
text: "Info",
value: "info",
},
{
text: "Warning",
value: "warning",
},
{
text: "Error",
value: "Error",
},
],
onFilter: (level, row) => row.level.indexOf(level) === 0,
render: renderColumnLevel,
},
{
title: "Timestamp",
dataIndex: "time",
key: "time",
render: (timestamp) =>
timeFormat("%H:%M:%S %m/%d/%Y")(new Date(timestamp)),
sorter: (a, b) => new Date(a.time).getTime() - new Date(b.time).getTime(),
2020-11-01 09:17:44 +03:00
sortDirections: ["descend", "ascend"] as SortOrder[],
defaultSortOrder: "descend" as SortOrder,
2020-10-30 04:01:38 +03:00
},
{
title: "Message",
dataIndex: "message",
key: "message",
render: renderMessage,
},
];
return (
2020-11-13 14:57:57 +03:00
<div className="logs-section">
<Title level={2}>Logs</Title>
2020-10-30 04:01:38 +03:00
<Table
2020-11-01 05:29:06 +03:00
size="middle"
2020-10-30 04:01:38 +03:00
dataSource={logs}
columns={columns}
rowKey={(row) => row.time}
pagination={{ pageSize: pageSize || 20 }}
/>
</div>
);
}