import { Head, Link, router, usePage } from '@inertiajs/react'; import { Check, CircleHelp, RefreshCw, Search, X } from 'lucide-react'; import type { FormEvent } from 'react'; import { useState } from 'react'; import InputError from '@/components/input-error'; import { PageHeading } from '@/components/page-heading'; import { ReservationStatus } from '@/components/reservation-status'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import type { Asset, Paginated, Reservation } from '@/types'; type ApprovalReservation = Reservation & { requester: { name: string; email: string; department: string | null; }; approval_actions: { id: number; action: string; comment: string | null; created_at: string; actor: { name: string }; }[]; }; export default function ApprovalsIndex({ reservations, filters, replacementAssets, categories, }: { reservations: Paginated; filters: { search?: string; category?: string; date_from?: string; date_to?: string; }; replacementAssets: Asset[]; categories: string[]; }) { const [search, setSearch] = useState(filters.search ?? ''); const [category, setCategory] = useState(filters.category ?? ''); const [dateFrom, setDateFrom] = useState(filters.date_from ?? ''); const [dateTo, setDateTo] = useState(filters.date_to ?? ''); const [comments, setComments] = useState>({}); const [replacements, setReplacements] = useState>( {}, ); const { errors } = usePage().props; function submitSearch(event: FormEvent) { event.preventDefault(); router.get('/aprovacoes', { search: search || undefined, category: category || undefined, date_from: dateFrom || undefined, date_to: dateTo || undefined, }); } function decide(reservation: ApprovalReservation, action: string) { router.post( `/aprovacoes/${reservation.uuid}/${action}`, { comment: comments[reservation.id] ?? '' }, { preserveScroll: true }, ); } function substitute(reservation: ApprovalReservation, itemId: number) { router.post( `/aprovacoes/${reservation.uuid}/itens/${itemId}/substituir`, { replacement_asset_id: Number(replacements[itemId]), comment: comments[reservation.id] ?? '', }, { preserveScroll: true }, ); } return ( <>
setSearch(event.target.value)} placeholder="Referência ou requisitante…" className="pl-9" />
setDateFrom(event.target.value)} /> setDateTo(event.target.value)} />
{reservations.data.map((reservation) => (
{reservation.reference}

{reservation.requester.name} ·{' '} {reservation.requester.department ?? reservation.requester.email}

Equipamentos

{reservation.items .filter( (item) => item.status !== 'cancelled', ) .map((item) => { const candidates = replacementAssets.filter( (asset) => asset.id !== item.asset .id && (item.asset .category_id != null ? asset.category_id === item.asset .category_id : asset.category_name === item.asset .category_name), ); return (

{ item.asset .name }{' '} { item .asset .asset_tag }

{reservation.status === 'pending_approval' && candidates.length > 0 && (
)}
); })}

Período

{formatPeriod(reservation)}

{reservation.purpose}

{reservation.status === 'pending_approval' ? ( <>