diff --git a/src/app/(app)/reports/[id]/page.tsx b/src/app/(app)/reports/[id]/page.tsx index 9b0d5f1..50c4b59 100644 --- a/src/app/(app)/reports/[id]/page.tsx +++ b/src/app/(app)/reports/[id]/page.tsx @@ -31,6 +31,14 @@ export default function ReportDetailPage() { const [reportData, setReportData] = useState(null) const [loading, setLoading] = useState(true) const [generating, setGenerating] = useState(false) + const [permissions, setPermissions] = useState([]) + + useEffect(() => { + fetch('/api/auth/me') + .then(r => r.json()) + .then(u => { if (u.user?.permissions) setPermissions(u.user.permissions) }) + .catch(() => {}) + }, []) const fetchReport = () => { fetch(`/api/reports/${params.id}`) @@ -84,16 +92,18 @@ export default function ReportDetailPage() { setGenerating(false) } + const can = (perm: string) => permissions.includes('*') || permissions.includes(perm) + const renderRightButton = () => { if (!report) return null switch (report.status) { case 'ready': - return ( + return can('reports:create') ? ( - ) + ) : null case 'generating': return ( ) case 'completed': - return ( + return can('reports:download') ? ( - ) + ) : null case 'failed': - return ( + return can('reports:create') ? ( - ) + ) : null default: return null } diff --git a/src/app/(app)/reports/page.tsx b/src/app/(app)/reports/page.tsx index dc09073..bbbca80 100644 --- a/src/app/(app)/reports/page.tsx +++ b/src/app/(app)/reports/page.tsx @@ -84,6 +84,14 @@ export default function ReportsPage() { const [selectedIds, setSelectedIds] = useState>(new Set()) const [batchDeleteOpen, setBatchDeleteOpen] = useState(false) const [generatingIds, setGeneratingIds] = useState>(new Set()) + const [permissions, setPermissions] = useState([]) + + useEffect(() => { + fetch('/api/auth/me') + .then(r => r.json()) + .then(u => { if (u.user?.permissions) setPermissions(u.user.permissions) }) + .catch(() => {}) + }, []) const toggleSelect = (id: number) => { setSelectedIds(prev => { @@ -269,12 +277,16 @@ export default function ReportsPage() { - - + {can('reports:create') && ( + + )} + {can('reports:create') && ( + + )} ) case 'generating': @@ -291,12 +303,16 @@ export default function ReportsPage() { - - + {can('reports:download') && ( + + )} + {can('reports:create') && ( + + )} ) case 'failed': @@ -305,25 +321,33 @@ export default function ReportsPage() { - - + {can('reports:create') && ( + + )} + {can('reports:create') && ( + + )} ) default: return (
- + {can('reports:create') && ( + + )}
) } } + const can = (perm: string) => permissions.includes('*') || permissions.includes(perm) + const renderStatusBadge = (status: string) => { if (status === 'generating') { return ( @@ -356,17 +380,23 @@ export default function ReportsPage() {
{selectedIds.size > 0 && ( <> - - + {can('reports:download') && ( + + )} + {can('reports:create') && ( + + )} )} - + {can('reports:create') && ( + + )}
diff --git a/src/components/tickets/TicketList.tsx b/src/components/tickets/TicketList.tsx index 1690131..0341b07 100644 --- a/src/components/tickets/TicketList.tsx +++ b/src/components/tickets/TicketList.tsx @@ -166,8 +166,16 @@ function TicketListInner({ onPaginationChange, defaultStatusFilter, showSlaColum const [dateFilter, setDateFilter] = useState>({}) const [fieldOptions, setFieldOptions] = useState>({}) const [ticketNoFilter, setTicketNoFilter] = useState('') + const [permissions, setPermissions] = useState([]) const filterDropRef = useRef(null) + useEffect(() => { + fetch('/api/auth/me') + .then(r => r.json()) + .then(u => { if (u.user?.permissions) setPermissions(u.user.permissions) }) + .catch(() => {}) + }, []) + // 列宽拖拽调整 const [colWidths, setColWidths] = useState>({}) const [resizingCol, setResizingCol] = useState(null) @@ -429,7 +437,9 @@ function TicketListInner({ onPaginationChange, defaultStatusFilter, showSlaColum
- + {(permissions.includes('*') || permissions.includes('tickets:export')) && ( + + )}