diff --git a/ui/litellm-dashboard/src/components/view_logs/AuditLogDrawer/AuditLogDrawer.tsx b/ui/litellm-dashboard/src/components/view_logs/AuditLogDrawer/AuditLogDrawer.tsx index 1e8dca34f22..de76709f5b2 100644 --- a/ui/litellm-dashboard/src/components/view_logs/AuditLogDrawer/AuditLogDrawer.tsx +++ b/ui/litellm-dashboard/src/components/view_logs/AuditLogDrawer/AuditLogDrawer.tsx @@ -1,7 +1,10 @@ -import { Drawer, Tag, Tooltip } from "antd"; +import { Drawer, Tag, Typography } from "antd"; import { CloseOutlined } from "@ant-design/icons"; import moment from "moment"; import { AuditLogEntry } from "../columns"; +import DefaultProxyAdminTag from "../../common_components/DefaultProxyAdminTag"; + +const { Text } = Typography; interface AuditLogDrawerProps { open: boolean; @@ -26,7 +29,7 @@ const ACTION_COLOR: Record = { function JsonBlock({ value }: { value: Record }) { return ( -
+    
       {JSON.stringify(value, null, 2)}
     
); @@ -92,7 +95,7 @@ function DiffSection({ log }: { log: AuditLogEntry }) { : { note: "No differing fields detected" }; } - const renderValue = (value: Record | null | undefined, label: string) => { + const renderValue = (value: Record | null | undefined) => { if (!value || Object.keys(value).length === 0) { return

N/A

; } @@ -125,11 +128,11 @@ function DiffSection({ log }: { log: AuditLogEntry }) {

Before

- {renderValue(displayBefore, "before")} + {renderValue(displayBefore)}

After

- {renderValue(displayAfter, "after")} + {renderValue(displayAfter)}
); @@ -150,10 +153,10 @@ export function AuditLogDrawer({ open, onClose, log }: AuditLogDrawerProps) { closable={false} mask={true} maskClosable={true} - styles={{ body: { padding: 0 }, header: { display: "none" } }} + styles={{ body: { padding: 0, display: "flex", flexDirection: "column" }, header: { display: "none" } }} > {/* Header */} -
+
{log.action} @@ -172,7 +175,7 @@ export function AuditLogDrawer({ open, onClose, log }: AuditLogDrawerProps) {
{/* Body */} -
+
{/* Metadata */}

@@ -182,21 +185,22 @@ export function AuditLogDrawer({ open, onClose, log }: AuditLogDrawerProps) { - {log.object_id} - + + {log.object_id} + } /> - } + /> + - - {log.changed_by_api_key.slice(0, 12)}… - - + + {log.changed_by_api_key} + ) : ( "—" ) diff --git a/ui/litellm-dashboard/src/components/view_logs/audit_logs.tsx b/ui/litellm-dashboard/src/components/view_logs/audit_logs.tsx index 693318acca8..71300fe0427 100644 --- a/ui/litellm-dashboard/src/components/view_logs/audit_logs.tsx +++ b/ui/litellm-dashboard/src/components/view_logs/audit_logs.tsx @@ -1,12 +1,13 @@ import { useState } from "react"; import { useQuery, keepPreviousData } from "@tanstack/react-query"; -import { Table, Tag, Input, Select, Button, Tooltip } from "antd"; +import { Table, Tag, Input, Select, Button, Pagination } from "antd"; import { ReloadOutlined } from "@ant-design/icons"; -import type { ColumnsType, TablePaginationConfig } from "antd/es/table"; +import type { ColumnsType } from "antd/es/table"; import moment from "moment"; import { uiAuditLogsCall } from "../networking"; import { AuditLogEntry } from "./columns"; import { AuditLogDrawer } from "./AuditLogDrawer/AuditLogDrawer"; +import DefaultProxyAdminTag from "../common_components/DefaultProxyAdminTag"; const { Search } = Input; @@ -97,14 +98,7 @@ export default function AuditLogs({ placeholderData: keepPreviousData, }); - const handleFilterChange = () => { - // Reset to page 1 whenever a filter changes - setPage(1); - }; - - const handleTableChange = (pagination: TablePaginationConfig) => { - setPage(pagination.current ?? 1); - }; + const resetPage = () => setPage(1); const handleRowClick = (log: AuditLogEntry) => { setSelectedLog(log); @@ -146,9 +140,7 @@ export default function AuditLogs({ dataIndex: "object_id", key: "object_id", render: (val: string) => ( - - {val} - + {val} ), }, { @@ -156,18 +148,16 @@ export default function AuditLogs({ dataIndex: "changed_by", key: "changed_by", width: 200, - render: (val: string) => val || "—", + render: (val: string) => , }, { - title: "API Key", + title: "API Key (Hash)", dataIndex: "changed_by_api_key", key: "changed_by_api_key", width: 140, render: (val: string) => val ? ( - - {val.slice(0, 12)}… - + {val.slice(0, 12)}… ) : ( "—" ), @@ -212,76 +202,37 @@ export default function AuditLogs({

Audit Logs

-
- {/* Filters */} -
+ {/* Filters + pagination on same row */} +
{ - setObjectId(val); - handleFilterChange(); - }} - onChange={(e) => { - if (!e.target.value) { - setObjectId(""); - handleFilterChange(); - } - }} + onSearch={(val) => { setObjectId(val); resetPage(); }} + onChange={(e) => { if (!e.target.value) { setObjectId(""); resetPage(); } }} /> { - setChangedBy(val); - handleFilterChange(); - }} - onChange={(e) => { - if (!e.target.value) { - setChangedBy(""); - handleFilterChange(); - } - }} + onSearch={(val) => { setChangedBy(val); resetPage(); }} + onChange={(e) => { if (!e.target.value) { setChangedBy(""); resetPage(); } }} /> { - setTeamId(val); - handleFilterChange(); - }} - onChange={(e) => { - if (!e.target.value) { - setTeamId(""); - handleFilterChange(); - } - }} + onSearch={(val) => { setTeamId(val); resetPage(); }} + onChange={(e) => { if (!e.target.value) { setTeamId(""); resetPage(); } }} /> { - setKeyHash(val); - handleFilterChange(); - }} - onChange={(e) => { - if (!e.target.value) { - setKeyHash(""); - handleFilterChange(); - } - }} + onSearch={(val) => { setKeyHash(val); resetPage(); }} + onChange={(e) => { if (!e.target.value) { setKeyHash(""); resetPage(); } }} /> { - setTableName(val); - handleFilterChange(); - }} + onChange={(val) => { setTableName(val); resetPage(); }} /> + + {/* Pagination + refresh pushed to the right */} +
+
- {/* Table */} + {/* Table — pagination handled in header */} columns={columns} dataSource={auditLogs} rowKey="id" loading={query.isLoading} size="small" + pagination={false} onRow={(record) => ({ onClick: () => handleRowClick(record), style: { cursor: "pointer" }, })} - pagination={{ - current: page, - pageSize: PAGE_SIZE, - total, - showTotal: (t) => `${t} total`, - showSizeChanger: false, - onChange: (p) => setPage(p), - }} - onChange={handleTableChange} />