EventFormatter.tsx 2.0 KB

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