Files
nginx-proxy-manager/frontend/src/components/Table/Formatter/EventFormatter.tsx
2025-10-26 00:28:39 +10:00

74 lines
1.8 KiB
TypeScript

import { IconArrowsCross, IconBolt, IconBoltOff, IconDisc, IconLock, IconUser } from "@tabler/icons-react";
import type { AuditLog } from "src/api/backend";
import { DateTimeFormat, T } from "src/locale";
const getEventValue = (event: AuditLog) => {
switch (event.objectType) {
case "access-list":
case "user":
return event.meta?.name;
case "proxy-host":
case "redirection-host":
case "dead-host":
return event.meta?.domainNames?.join(", ") || "N/A";
case "stream":
return event.meta?.incomingPort || "N/A";
default:
return `UNKNOWN EVENT TYPE: ${event.objectType}`;
}
};
const getColorForAction = (action: string) => {
switch (action) {
case "created":
return "text-lime";
case "deleted":
return "text-red";
default:
return "text-blue";
}
};
const getIcon = (row: AuditLog) => {
const c = getColorForAction(row.action);
let ico = null;
switch (row.objectType) {
case "user":
ico = <IconUser size={16} className={c} />;
break;
case "proxy-host":
ico = <IconBolt size={16} className={c} />;
break;
case "redirection-host":
ico = <IconArrowsCross size={16} className={c} />;
break;
case "dead-host":
ico = <IconBoltOff size={16} className={c} />;
break;
case "stream":
ico = <IconDisc size={16} className={c} />;
break;
case "access-list":
ico = <IconLock size={16} className={c} />;
break;
}
return ico;
};
interface Props {
row: AuditLog;
}
export function EventFormatter({ row }: Props) {
return (
<div className="flex-fill">
<div className="font-weight-medium">
{getIcon(row)}
<T id={`object.event.${row.action}`} tData={{ object: row.objectType }} />
&mdash; <span className="badge">{getEventValue(row)}</span>
</div>
<div className="text-secondary mt-1">{DateTimeFormat(row.createdOn)}</div>
</div>
);
}