- DB: trucks table + incidents.truck_id FK + transport enum value - Validation: transport type requires truck_id - Create API: validates truck exists/active, persists truck_id - Report form: truck dropdown shown when type=transport (required) - Admin: TruckManager CRUD + /api/admin/trucks route - Detail: trucks join surfaced in incident-detail + detail page query - Inbox (HSE + supervisor): truck filter, transport in TYPE_OPTIONS, fixed stale enum values (dropped dangerous_occurrence/mhe_asset/occupational_disease) - List: transport label + truck number badge in rows - i18n: transport + truckLabel/truckPlaceholder in en/ms/zh Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CPf5Rc8QPx6V8KLEEgfKEQ
66 lines
2.1 KiB
TypeScript
66 lines
2.1 KiB
TypeScript
export const dynamic = 'force-dynamic'
|
|
|
|
import { redirect } from 'next/navigation'
|
|
import { createClient } from '@/lib/supabase/server'
|
|
import { ReportForm } from '@/components/incidents/report-form'
|
|
import { LanguageSwitcher } from '@/components/language-switcher'
|
|
import { OfflineSync } from '@/components/incidents/offline-sync'
|
|
|
|
interface Props {
|
|
searchParams: Promise<{ zone?: string }>
|
|
}
|
|
|
|
export default async function ReportPage({ searchParams }: Props) {
|
|
const { zone } = await searchParams
|
|
const supabase = await createClient()
|
|
const { data, error: authError } = await supabase.auth.getUser()
|
|
|
|
if (authError || !data?.user) redirect(`/login?redirect=/report${zone ? `?zone=${zone}` : ''}`)
|
|
|
|
let zoneName: string | null = null
|
|
let siteName: string | null = null
|
|
|
|
if (zone) {
|
|
const { data: zd } = await supabase
|
|
.from('zones')
|
|
.select('id, name, site_id, sites (name)')
|
|
.eq('qr_code_token', zone)
|
|
.single()
|
|
if (zd) {
|
|
zoneName = (zd as { name: string }).name ?? null
|
|
siteName = (zd.sites as unknown as { name: string } | null)?.name ?? null
|
|
}
|
|
}
|
|
|
|
const { data: trucks } = await supabase
|
|
.from('trucks')
|
|
.select('id, truck_no, carrier')
|
|
.eq('active', true)
|
|
.order('truck_no')
|
|
|
|
return (
|
|
<main className="min-h-screen bg-gray-50 py-6 px-4 max-w-lg mx-auto">
|
|
<div className="mb-6">
|
|
<div className="flex items-center justify-between">
|
|
<h1 className="text-2xl font-bold text-gray-900">{/* will be translated via ReportForm */}Report an Incident</h1>
|
|
<LanguageSwitcher />
|
|
</div>
|
|
{zoneName ? (
|
|
<p className="text-sm text-gray-600 mt-1">
|
|
{siteName ?? 'Unknown Site'} — {zoneName}
|
|
</p>
|
|
) : (
|
|
<p className="text-sm text-amber-600 mt-1">No zone detected — zone will not be recorded</p>
|
|
)}
|
|
</div>
|
|
<ReportForm
|
|
zoneToken={zone ?? null}
|
|
zoneName={zoneName}
|
|
siteName={siteName}
|
|
trucks={(trucks ?? []) as Array<{ id: string; truck_no: string; carrier: string | null }>}
|
|
/>
|
|
<OfflineSync />
|
|
</main>
|
|
)
|
|
}
|