) : (
@@ -314,7 +331,11 @@ export default function OneTimeForm({ bodies, semesters, onClose, onSuccess }: O
{visibleRequests.map(r => (
- {r.bodies?.name ?? '—'}
+ ({ id: x.body_id, name: x.bodies?.name ?? '' }))}
+ className="text-sm font-semibold text-[#f0f6ff]"
+ />
{new Date(r.created_at).toLocaleDateString()}
{r.purpose}
diff --git a/app/(dashboard)/administrator/requests-tab.tsx b/app/(dashboard)/administrator/requests-tab.tsx
index 85060e0..e5fa0fd 100644
--- a/app/(dashboard)/administrator/requests-tab.tsx
+++ b/app/(dashboard)/administrator/requests-tab.tsx
@@ -4,6 +4,8 @@ import { useEffect, useState } from 'react'
import FulfillModal from './fulfill-modal'
import DenyModal from './deny-modal'
import { Skeleton } from '@/app/_components/skeleton'
+import ScopeLabel from '@/app/_components/scope-label'
+import type { BookingScope, Division } from '@/lib/booking-scope'
function RequestsTabSkeleton() {
const card = (wide: boolean) => (
@@ -62,8 +64,11 @@ interface RoomRequest {
status: RequestStatus
notes: string | null
created_at: string
+ scope: BookingScope
+ division: Division | null
bodies: { name: string } | null
users: { full_name: string } | null
+ room_request_bodies: { body_id: string; bodies: { name: string } | null }[] | null
room_request_details: {
room_name: string | null
start_date: string
@@ -113,7 +118,12 @@ export default function RequestsTab({ onCountChange }: RequestsTabProps) {
type: string
purpose: string
body_id: string
+ bodyName: string
+ scope: BookingScope
+ division: Division | null
+ linkedBodies: { id: string; name: string }[]
} | null>(null)
+ const [typeFilter, setTypeFilter] = useState<'all' | BookingScope>('all')
const fetchRequests = async () => {
const [reqRes, revRes] = await Promise.all([
@@ -135,6 +145,15 @@ export default function RequestsTab({ onCountChange }: RequestsTabProps) {
if (requests.length === 0 && revisions.length === 0) return
No requests found.
+ const filteredRequests = requests.filter(r => typeFilter === 'all' || r.scope === typeFilter)
+
+ const TYPE_FILTERS: { value: 'all' | BookingScope; label: string }[] = [
+ { value: 'all', label: 'All' },
+ { value: 'single', label: 'Single Body' },
+ { value: 'divisional', label: 'Divisional' },
+ { value: 'multi', label: 'Multi-Body' },
+ ]
+
return (
{revisions.length > 0 && (
@@ -175,13 +194,38 @@ export default function RequestsTab({ onCountChange }: RequestsTabProps) {
{requests.length > 0 && (
- {revisions.length > 0 &&
Room Requests
}
- {requests.map(r => (
+
+ {revisions.length > 0 && (
+
Room Requests
+ )}
+
+ {TYPE_FILTERS.map(f => (
+
+ ))}
+
+
+ {filteredRequests.length === 0 ? (
+
No requests match this filter.
+ ) : filteredRequests.map(r => (
{/* Header */}
- {r.bodies?.name || 'Unknown Body'}
+ ({ id: x.body_id, name: x.bodies?.name ?? '' }))}
+ className="font-semibold text-[#f0f6ff]"
+ />
·
{r.type === 'One-Time Room' ? 'One-Time/Multiple Room' : r.type}
@@ -245,7 +289,16 @@ export default function RequestsTab({ onCountChange }: RequestsTabProps) {
) : (