import { A, useParams } from '@solidjs/router'; import { createMemo, createResource, createSignal, Show } from 'solid-js'; import AdminShell from '~/components/AdminShell'; const API = '/api/gateway'; type ApprovalDetail = { id: string; requestType?: string; type?: string; requestStatus?: string; status?: string; priority?: number; createdAt?: string; created_at?: string; requester?: { name?: string; email?: string }; requesterName?: string; requesterEmail?: string; requester_name?: string; requester_email?: string; payload?: unknown; }; async function loadApproval(id: string): Promise { try { const res = await fetch(`${API}/api/admin/approvals/${id}`); if (!res.ok) return null; return res.json(); } catch { return null; } } export default function ApprovalDetailPage() { const params = useParams(); const [approval, { refetch }] = createResource(() => params.id, loadApproval); const [acting, setActing] = createSignal(''); const [error, setError] = createSignal(''); const status = createMemo(() => (approval()?.requestStatus || approval()?.status || 'PENDING').toUpperCase()); const requestType = createMemo(() => (approval()?.requestType || approval()?.type || 'OTHER').toUpperCase()); const requesterName = createMemo(() => approval()?.requester?.name || approval()?.requesterName || approval()?.requester_name || 'Unknown'); const requesterEmail = createMemo(() => approval()?.requester?.email || approval()?.requesterEmail || approval()?.requester_email || '—'); const submittedAt = createMemo(() => approval()?.createdAt || approval()?.created_at || ''); const act = async (nextStatus: 'APPROVED' | 'REJECTED' | 'CHANGES_REQUESTED') => { try { setActing(nextStatus); setError(''); const res = await fetch(`${API}/api/admin/approvals/${params.id}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status: nextStatus }), }); if (!res.ok) throw new Error(`Failed to mark as ${nextStatus.toLowerCase()}`); refetch(); } catch (err: any) { setError(err.message || 'Failed to update approval status'); } finally { setActing(''); } }; return (

Approval Detail

Review one approval request in detail and take action.

Back to Approval List
{error()}

Loading approval...

Approval request not found.

Request Summary

ID: {approval()!.id}

Type: {requestType()}

Status: {status()}

Priority: {approval()!.priority ?? '—'}

Submitted: {submittedAt() ? new Date(submittedAt()).toLocaleString() : '—'}

Requester

Name: {requesterName()}

Email: {requesterEmail()}

Raw Payload

{JSON.stringify(approval(), null, 2)}
); }