diff --git a/package.json b/package.json index 43a94f4c..254d7460 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "lodash": "^4.17.21", "moment": "^2.29.1", "notistack": "^2.0.2", + "pb-util": "^1.0.1", "query-string": "^6.8.3", "react": "^17.0.2", "react-beautiful-dnd": "^13.0.0", diff --git a/src/components/Table/TableHeader/CloudLogs/LogItem.tsx b/src/components/Table/TableHeader/CloudLogs/CloudLogItem.tsx similarity index 70% rename from src/components/Table/TableHeader/CloudLogs/LogItem.tsx rename to src/components/Table/TableHeader/CloudLogs/CloudLogItem.tsx index 0b944ec9..7a5fbe5b 100644 --- a/src/components/Table/TableHeader/CloudLogs/LogItem.tsx +++ b/src/components/Table/TableHeader/CloudLogs/CloudLogItem.tsx @@ -1,6 +1,8 @@ import { format } from "date-fns"; import _get from "lodash/get"; import ReactJson from "react-json-view"; +import { struct } from "pb-util"; +import jsonFormat from "json-format"; import { styled, @@ -12,13 +14,15 @@ import { Chip as MuiChip, ChipProps, Typography, + Divider, } from "@mui/material"; import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; -import LogSeverityIcon from "./LogSeverityIcon"; +import CloudLogSeverityIcon from "./CloudLogSeverityIcon"; import { DATE_FORMAT, TIME_FORMAT } from "@src/constants/dates"; const Accordion = styled(MuiAccordion)(({ theme }) => ({ + background: "none", marginTop: 0, "&::before": { display: "none" }, @@ -30,6 +34,11 @@ const AccordionSummary = styled(MuiAccordionSummary)(({ theme }) => ({ minHeight: 32, alignItems: "flex-start", + "&.Mui-expanded": { + backgroundColor: theme.palette.action.hover, + "&:hover": { backgroundColor: theme.palette.action.selected }, + }, + "& svg": { fontSize: 18, height: 20, @@ -58,13 +67,12 @@ const AccordionSummary = styled(MuiAccordionSummary)(({ theme }) => ({ "& .log-preview": { flexShrink: 1, - ".Mui-expanded&": { - overflow: "visible", - whiteSpace: "pre-wrap", - }, + // ".Mui-expanded&": { + // overflow: "visible", + // whiteSpace: "pre-wrap", + // }, }, - margin: theme.spacing(0, -1.5), padding: theme.spacing(0, 1.375, 0, 1.5), borderRadius: theme.shape.borderRadius, "&:hover": { backgroundColor: theme.palette.action.hover }, @@ -80,19 +88,26 @@ const Chip = styled((props: ChipProps) => )({ }); const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({ - paddingLeft: theme.spacing(18 / 8 + 2), - paddingRight: 0, + paddingLeft: theme.spacing(18 / 8 + 2 + 1.5), + paddingRight: theme.spacing(18 / 8 + 2 + 1.5), })); -export interface ILogItemProps { +export interface ICloudLogItemProps { // https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#FIELDS.insert_id data: Record; chips?: string[]; } -export default function LogItem({ data, chips }: ILogItemProps) { +export default function CloudLogItem({ + data: dataProp, + chips, +}: ICloudLogItemProps) { const theme = useTheme(); + const data = { ...dataProp }; + if (dataProp.payload === "jsonPayload" && dataProp.jsonPayload) + data.jsonPayload = struct.decode(dataProp.jsonPayload ?? {}); + const timestamp = new Date( data.timestamp.seconds * 1000 + data.timestamp.nanos / 1_000_000 ); @@ -130,7 +145,7 @@ export default function LogItem({ data, chips }: ILogItemProps) { aria-controls={`${data.insertId}-content`} id={`${data.insertId}-header`} > - +