Add isPublic field to evaluation API and detail page for public visibility management
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 3m6s

This commit is contained in:
Julien Froidefond
2026-02-20 13:55:21 +01:00
parent dc8581f545
commit 2ef9b4d6f9
2 changed files with 18 additions and 1 deletions

View File

@@ -118,7 +118,7 @@ export async function PUT(
const { id } = await params;
const body = await req.json();
const { candidateName, candidateRole, candidateTeam, evaluatorName, evaluationDate, status, findings, recommendations, dimensionScores } = body;
const { candidateName, candidateRole, candidateTeam, evaluatorName, evaluationDate, status, findings, recommendations, dimensionScores, isPublic } = body;
const existing = await prisma.evaluation.findUnique({ where: { id } });
if (!existing) {
@@ -146,6 +146,7 @@ export async function PUT(
if (status != null) updateData.status = status;
if (findings != null) updateData.findings = findings;
if (recommendations != null) updateData.recommendations = recommendations;
if (typeof isPublic === "boolean") updateData.isPublic = isPublic;
if (Object.keys(updateData).length > 0) {
await prisma.auditLog.create({

View File

@@ -45,6 +45,7 @@ interface Evaluation {
recommendations: string | null;
dimensionScores: DimensionScore[];
sharedWith?: { id: string; user: { id: string; email: string; name: string | null } }[];
isPublic?: boolean;
}
export default function EvaluationDetailPage() {
@@ -168,6 +169,7 @@ export default function EvaluationDetailPage() {
status: toSave.status,
findings: toSave.findings,
recommendations: toSave.recommendations,
isPublic: toSave.isPublic ?? false,
dimensionScores: (toSave.dimensionScores ?? []).map((ds) => ({
dimensionId: ds.dimensionId,
evaluationId: id,
@@ -258,6 +260,20 @@ export default function EvaluationDetailPage() {
>
{saving ? "..." : "save"}
</button>
<button
onClick={() => {
const next = !(evaluation.isPublic ?? false);
setEvaluation((e) => (e ? { ...e, isPublic: next } : null));
handleSave(evaluation ? { ...evaluation, isPublic: next } : null);
}}
className={`rounded border px-3 py-1.5 font-mono text-xs ${
evaluation.isPublic
? "border-emerald-500/50 bg-emerald-500/20 text-emerald-600 dark:text-emerald-400"
: "border-zinc-300 dark:border-zinc-600 bg-zinc-100 dark:bg-zinc-700 text-zinc-600 dark:text-zinc-400 hover:bg-zinc-200 dark:hover:bg-zinc-600"
}`}
>
{evaluation.isPublic ? "publique" : "rendre publique"}
</button>
<button
onClick={() => setShareOpen(true)}
className="rounded border border-cyan-500/50 bg-cyan-500/10 px-3 py-1.5 font-mono text-xs text-cyan-600 dark:text-cyan-400 hover:bg-cyan-500/20"