diff --git a/src/components/panels/super-admin-panel.tsx b/src/components/panels/super-admin-panel.tsx
index c2ffd10..73f9e3b 100644
--- a/src/components/panels/super-admin-panel.tsx
+++ b/src/components/panels/super-admin-panel.tsx
@@ -395,6 +395,34 @@ export function SuperAdminPanel() {
}
}
+ const approveAndRunJob = async (jobId: number) => {
+ setBusyJobId(jobId)
+ try {
+ const approveRes = await fetch(`/api/super/provision-jobs/${jobId}`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ action: 'approve' }),
+ })
+ const approveJson = await approveRes.json().catch(() => ({}))
+ if (!approveRes.ok) throw new Error(approveJson?.error || `Failed to approve job #${jobId}`)
+
+ const runRes = await fetch(`/api/super/provision-jobs/${jobId}/run`, { method: 'POST' })
+ const runJson = await runRes.json().catch(() => ({}))
+ if (!runRes.ok) throw new Error(runJson?.error || `Failed to run job #${jobId}`)
+
+ showFeedback(true, `Job #${jobId} approved and executed`)
+ await load()
+ await loadJobDetail(jobId)
+ } catch (e: any) {
+ showFeedback(false, e?.message || `Failed to approve/run job #${jobId}`)
+ await load()
+ await loadJobDetail(jobId)
+ } finally {
+ setBusyJobId(null)
+ setOpenActionMenu(null)
+ }
+ }
+
const openDecommissionDialog = (tenant: TenantRow) => {
setOpenActionMenu(null)
setDecommissionDialog({
@@ -884,11 +912,11 @@ export function SuperAdminPanel() {
View events