EventFormatter.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { IconArrowsCross, IconBolt, IconBoltOff, IconDisc, IconLock, IconShield, IconUser } from "@tabler/icons-react";
  2. import cn from "classnames";
  3. import type { AuditLog } from "src/api/backend";
  4. import { DateTimeFormat, T } from "src/locale";
  5. const getEventValue = (event: AuditLog) => {
  6. switch (event.objectType) {
  7. case "access-list":
  8. case "user":
  9. return event.meta?.name;
  10. case "proxy-host":
  11. case "redirection-host":
  12. case "dead-host":
  13. return event.meta?.domainNames?.join(", ") || "N/A";
  14. case "stream":
  15. return event.meta?.incomingPort || "N/A";
  16. case "certificate":
  17. return event.meta?.domainNames?.join(", ") || event.meta?.niceName || "N/A";
  18. default:
  19. return `UNKNOWN EVENT TYPE: ${event.objectType}`;
  20. }
  21. };
  22. const getColorForAction = (action: string) => {
  23. switch (action) {
  24. case "created":
  25. return "text-lime";
  26. case "deleted":
  27. return "text-red";
  28. default:
  29. return "text-blue";
  30. }
  31. };
  32. const getIcon = (row: AuditLog) => {
  33. const c = cn(getColorForAction(row.action), "me-1");
  34. let ico = null;
  35. switch (row.objectType) {
  36. case "user":
  37. ico = <IconUser size={16} className={c} />;
  38. break;
  39. case "proxy-host":
  40. ico = <IconBolt size={16} className={c} />;
  41. break;
  42. case "redirection-host":
  43. ico = <IconArrowsCross size={16} className={c} />;
  44. break;
  45. case "dead-host":
  46. ico = <IconBoltOff size={16} className={c} />;
  47. break;
  48. case "stream":
  49. ico = <IconDisc size={16} className={c} />;
  50. break;
  51. case "access-list":
  52. ico = <IconLock size={16} className={c} />;
  53. break;
  54. case "certificate":
  55. ico = <IconShield size={16} className={c} />;
  56. break;
  57. }
  58. return ico;
  59. };
  60. interface Props {
  61. row: AuditLog;
  62. }
  63. export function EventFormatter({ row }: Props) {
  64. return (
  65. <div className="flex-fill">
  66. <div className="font-weight-medium">
  67. {getIcon(row)}
  68. <T id={`object.event.${row.action}`} tData={{ object: row.objectType }} />
  69. &nbsp; &mdash; <span className="badge">{getEventValue(row)}</span>
  70. </div>
  71. <div className="text-secondary mt-1">{DateTimeFormat(row.createdOn)}</div>
  72. </div>
  73. );
  74. }