From 31f6828f30c0c44cea2b32c9927734d30df19434 Mon Sep 17 00:00:00 2001 From: The Doom Lab Date: Mon, 1 Jun 2026 21:22:33 -0500 Subject: [PATCH] allow for data to be anonymous --- db/schema.prisma | 1 + .../[projectId]/tasks/[taskId]/edit.tsx | 1 + src/pages/projects/[projectId]/tasks/new.tsx | 1 + src/summary/queries/getProjectData.ts | 1 + src/summary/utils/processProjectData.ts | 20 ++++++++------ src/tasks/components/TaskForm.tsx | 27 ++++++++++++++++--- src/tasks/components/TaskInformation.tsx | 12 +++++++++ src/tasks/schemas.ts | 3 +++ 8 files changed, 54 insertions(+), 12 deletions(-) diff --git a/db/schema.prisma b/db/schema.prisma index ff74b580..3c467a5c 100644 --- a/db/schema.prisma +++ b/db/schema.prisma @@ -215,6 +215,7 @@ model Task { element Element? @relation(fields: [elementId], references: [id]) autoAssignNew AutoAssignNew @default(NONE) anonymous Boolean @default(false) + anonymousResponses Boolean @default(false) } model TaskLog { diff --git a/src/pages/projects/[projectId]/tasks/[taskId]/edit.tsx b/src/pages/projects/[projectId]/tasks/[taskId]/edit.tsx index 906d5be4..4acbae50 100644 --- a/src/pages/projects/[projectId]/tasks/[taskId]/edit.tsx +++ b/src/pages/projects/[projectId]/tasks/[taskId]/edit.tsx @@ -55,6 +55,7 @@ export const EditTask = () => { milestoneId: task.milestoneId, autoAssignNew: task.autoAssignNew ?? "NONE", anonymous: task.anonymous ?? false, + anonymousResponses: task.anonymousResponses ?? false, tags: Array.isArray(task.tags) ? (task.tags as Tag[]).map((tag) => ({ id: tag.key, // Use 'key' as the ID diff --git a/src/pages/projects/[projectId]/tasks/new.tsx b/src/pages/projects/[projectId]/tasks/new.tsx index d9bcf401..c84338b2 100644 --- a/src/pages/projects/[projectId]/tasks/new.tsx +++ b/src/pages/projects/[projectId]/tasks/new.tsx @@ -29,6 +29,7 @@ const mapTaskToInitialValues = (task: any) => { if ("startDate" in task && task.startDate) initial.startDate = new Date(task.startDate) if ("containerId" in task) initial.containerId = task.containerId ?? null if ("anonymous" in task) initial.anonymous = task.anonymous ?? false + if ("anonymousResponses" in task) initial.anonymousResponses = task.anonymousResponses ?? false // Map contributors/teams from assignedMembers if present (kept minimal) if (Array.isArray((task as any).assignedMembers)) { diff --git a/src/summary/queries/getProjectData.ts b/src/summary/queries/getProjectData.ts index 24fcba63..29ebd532 100644 --- a/src/summary/queries/getProjectData.ts +++ b/src/summary/queries/getProjectData.ts @@ -57,6 +57,7 @@ export default resolver.pipe(resolver.zod(GetProjectData), resolver.authorize(), status: true, // needed for anonymization downstream anonymous: true, + anonymousResponses: true, milestoneId: true, // relations on task milestone: { diff --git a/src/summary/utils/processProjectData.ts b/src/summary/utils/processProjectData.ts index c9198cf2..a37d0a01 100644 --- a/src/summary/utils/processProjectData.ts +++ b/src/summary/utils/processProjectData.ts @@ -24,17 +24,21 @@ export function cleanProjectData(project: any) { return member }) - // Scrub task fields for anonymous tasks + // Scrub task fields based on anonymous flags if (Array.isArray(project.tasks)) { project.tasks = project.tasks.map((task: any) => { - if (task && task.anonymous) { - return { - ...task, - name: "Anonymous task", - description: "Anonymous task", - } + if (!task) return task + const scrubbed: any = { ...task } + if (task.anonymous) { + scrubbed.name = "Anonymous task" + scrubbed.description = "Anonymous task" } - return task + if (task.anonymousResponses) { + scrubbed.taskLogs = Array.isArray(task.taskLogs) + ? task.taskLogs.map((log: any) => ({ ...log, metadata: null })) + : task.taskLogs + } + return scrubbed }) } diff --git a/src/tasks/components/TaskForm.tsx b/src/tasks/components/TaskForm.tsx index 489c40dd..ead42dcd 100644 --- a/src/tasks/components/TaskForm.tsx +++ b/src/tasks/components/TaskForm.tsx @@ -286,18 +286,18 @@ export function TaskForm>(props: TaskFormProps) type="string" // 👈 add this line /> - {/* Anonymous toggle */} -
+ {/* Anonymous toggles */} +
+
diff --git a/src/tasks/components/TaskInformation.tsx b/src/tasks/components/TaskInformation.tsx index 11628e37..e94e1adc 100644 --- a/src/tasks/components/TaskInformation.tsx +++ b/src/tasks/components/TaskInformation.tsx @@ -48,6 +48,18 @@ export const TaskInformation = () => { Milestone:{" "} {task["milestone"] ? task["milestone"]!.name : "No milestone"}

+ {task.anonymous && ( +

+ Anonymous: + Task identity hidden in project summary +

+ )} + {task.anonymousResponses && ( +

+ Anonymous responses: + Form responses hidden in project summary +

+ )}

Created by: {pm.users[0].firstName diff --git a/src/tasks/schemas.ts b/src/tasks/schemas.ts index ffb0274b..61114e65 100644 --- a/src/tasks/schemas.ts +++ b/src/tasks/schemas.ts @@ -15,6 +15,7 @@ export const FormTaskSchema = z startDate: z.date().optional().nullable(), autoAssignNew: z.nativeEnum(AutoAssignNew).optional().nullable(), anonymous: z.boolean(), + anonymousResponses: z.boolean(), }) .refine( (data) => { @@ -44,6 +45,7 @@ export const CreateTaskSchema = z.object({ rolesId: z.array(z.number()).optional().nullable(), autoAssignNew: z.nativeEnum(AutoAssignNew).optional().nullable(), anonymous: z.boolean(), + anonymousResponses: z.boolean(), tags: z .array( z.object({ @@ -69,6 +71,7 @@ export const UpdateTaskSchema = z.object({ startDate: z.date().optional().nullable(), autoAssignNew: z.nativeEnum(AutoAssignNew).optional().nullable(), anonymous: z.boolean(), + anonymousResponses: z.boolean(), tags: z .array( z.object({