Files
Investidor-V2/resources/js/pages/education/declaration.tsx
T

184 lines
7.5 KiB
TypeScript

import { Link } from '@inertiajs/react';
import EducationReview from '@/components/education-review';
import type { EducationReviewProps } from '@/lib/education-review';
import { Management } from '../management/shared';
import type { Paginated } from '../management/shared';
type ReviewEntry = {
id: string;
version: number | null;
actor: string | null;
occurred_at: string;
available: boolean;
status: 'reviewed' | 'rejected' | null;
reason: string | null;
previous_reason: string | null;
};
export default function Declaration(
props: EducationReviewProps & {
backUrl: string;
references: Record<string, string | null>;
history?: Paginated<ReviewEntry>;
},
) {
const row = props.declaration;
const labels: Record<string, string> = {
occupation: 'Ocupação',
skill: 'Competência',
location: 'Localização',
project: 'Projecto',
course: 'Curso',
};
return (
<Management
title={
props.kind === 'demands'
? 'Declaração de procura de trabalhadores'
: 'Declaração de vagas formativas'
}
>
<Link className="underline" href={props.backUrl}>
Voltar às declarações
</Link>
<section className="space-y-3 rounded border p-4">
<h2 className="text-xl font-semibold break-words">
{row.qualification}
</h2>
<p>
{row.quantity}{' '}
{props.kind === 'demands'
? 'trabalhadores'
: 'vagas formativas'}{' '}
· {row.period_start} a {row.period_end}
</p>
<p>
Fonte válida até {row.valid_until}
{row.valid_until < props.today ? ' · Expirada' : ''}
</p>
{row.reference_date && (
<p>Data de referência: {row.reference_date}</p>
)}
{props.kind === 'demands' && row.employer && (
<p>Empregador declarado: {row.employer}</p>
)}
<p className="break-words whitespace-pre-wrap">
Fonte: {row.source}
</p>
{!!Object.keys(props.references).length && (
<h3 className="font-semibold">
Referências no cadastro actual
</h3>
)}
{Object.entries(props.references).map(([field, value]) => (
<p key={field}>
{labels[field] ?? field}:{' '}
{value || 'Não identificado no cadastro actual'}
</p>
))}
{row.submitted_by_name && (
<p>Submetida por {row.submitted_by_name}</p>
)}
{row.reviewed_by_name && (
<p>Revisão actual por {row.reviewed_by_name}</p>
)}
{row.review_reason && (
<p className="break-words whitespace-pre-wrap">
Último fundamento registado: {row.review_reason}
</p>
)}
{props.kind === 'demands' && (
<Link
className="underline"
href={`/management/education/demands/${row.id}/analysis`}
>
Analisar procura e oferta
</Link>
)}
</section>
<EducationReview
key={`${props.kind}:${row.id}:${props.actorId}`}
{...props}
/>
{props.history && (
<section className="space-y-3 rounded border p-4">
<h2 className="text-xl font-semibold">
Registos de revisão disponíveis
</h2>
<p>
Os registos anteriores à preservação dos fundamentos
podem não estar disponíveis.
</p>
{!props.history.data.length && (
<p>Sem registos de revisão preservados.</p>
)}
{props.history.data.map((entry) => (
<article
key={entry.id}
className="space-y-2 border-t pt-3"
>
<h3 className="font-semibold">
Versão {entry.version ?? 'não identificada'} ·{' '}
{entry.actor ?? 'Autor não identificado'}
</h3>
<p>{entry.occurred_at}</p>
{entry.available ? (
<>
<p>
{entry.status === 'reviewed'
? 'Revista'
: 'Rejeitada'}
</p>
<p className="break-words whitespace-pre-wrap">
Fundamento: {entry.reason}
</p>
{entry.previous_reason && (
<p className="break-words whitespace-pre-wrap">
Fundamento anterior capturado:{' '}
{entry.previous_reason}
</p>
)}
</>
) : (
<p>
Fundamento indisponível para leitura. O
registo original foi preservado.
</p>
)}
</article>
))}
<nav
aria-label="Paginação do histórico de revisão"
className="flex flex-wrap items-center gap-4"
>
{props.history.prev_page_url && (
<Link
className="rounded border p-2"
href={props.history.prev_page_url}
preserveState
preserveScroll
>
Anterior
</Link>
)}
<span>
{props.history.total} registos · Página{' '}
{props.history.current_page} de{' '}
{props.history.last_page}
</span>
{props.history.next_page_url && (
<Link
className="rounded border p-2"
href={props.history.next_page_url}
preserveState
preserveScroll
>
Seguinte
</Link>
)}
</nav>
</section>
)}
</Management>
);
}