From 7a44ff8d02b18e258d6ef8ae586fbc537a90b2ff Mon Sep 17 00:00:00 2001 From: "Calum H. (IMB11)" Date: Thu, 29 Jan 2026 22:21:59 +0000 Subject: [PATCH 01/15] fix: only collapse if pending -> pass/fail, not pass <-> fail --- .../ui/moderation/ModerationTechRevCard.vue | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue b/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue index f9d4eab788..4cc606b9f6 100644 --- a/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue +++ b/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue @@ -358,6 +358,18 @@ function getFileMarkedCount(file: FlattenedFileReport): number { } async function updateDetailStatus(detailId: string, verdict: 'safe' | 'unsafe') { + let priorDecision: 'safe' | 'malware' | 'pending' = 'pending' + for (const report of props.item.reports) { + for (const issue of report.issues) { + const detail = issue.details.find((d) => d.id === detailId) + if (detail) { + priorDecision = getDetailDecision(detail.id, detail.status) + break + } + } + if (priorDecision !== 'pending') break + } + updatingDetails.value.add(detailId) try { @@ -395,11 +407,14 @@ async function updateDetailStatus(detailId: string, verdict: 'safe' | 'unsafe') detailDecisions.value.set(detailId, decision) } - for (const classGroup of groupedByClass.value) { - const hasThisDetail = classGroup.flags.some((f) => f.detail.id === detailId) - if (hasThisDetail && getMarkedFlagsCount(classGroup.flags) === classGroup.flags.length) { - expandedClasses.value.delete(classGroup.filePath) - break + // Only collapse if the prior state was 'pending' (new decision, not updating existing) + if (priorDecision === 'pending') { + for (const classGroup of groupedByClass.value) { + const hasThisDetail = classGroup.flags.some((f) => f.detail.id === detailId) + if (hasThisDetail && getMarkedFlagsCount(classGroup.flags) === classGroup.flags.length) { + expandedClasses.value.delete(classGroup.filePath) + break + } } } From 99740fa8db8e536edf603bb5849d93883b2c6c46 Mon Sep 17 00:00:00 2001 From: "Calum H. (IMB11)" Date: Thu, 29 Jan 2026 22:30:08 +0000 Subject: [PATCH 02/15] feat: wrap in full details block --- .../src/components/ui/moderation/ModerationTechRevCard.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue b/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue index 4cc606b9f6..c5df932e02 100644 --- a/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue +++ b/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue @@ -636,6 +636,7 @@ const reviewSummaryPreview = computed(() => { const timestamp = dayjs().utc().format('MMMM D, YYYY [at] h:mm A [UTC]') let markdown = `## Tech Review Summary\n*${timestamp}*\n\n` + markdown += `
\nFile Details (${totalSafe} safe, ${totalUnsafe} unsafe)\n\n` for (const [, fileData] of fileDecisions) { if (fileData.decisions.length === 0) continue @@ -658,6 +659,7 @@ const reviewSummaryPreview = computed(() => { markdown += `\n
\n\n` } + markdown += `\n\n` markdown += `---\n\n**Total:** ${totalDecisions} issues reviewed (${totalSafe} safe, ${totalUnsafe} unsafe)\n\n` return markdown From ab6ba2fbfbca3ed0d4e09bf82d7aa2dcf57273f7 Mon Sep 17 00:00:00 2001 From: "Calum H. (IMB11)" Date: Thu, 29 Jan 2026 22:36:13 +0000 Subject: [PATCH 03/15] feat: left badge --- .../ui/moderation/ModerationTechRevCard.vue | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue b/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue index c5df932e02..8268b01d6f 100644 --- a/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue +++ b/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue @@ -1071,22 +1071,17 @@ async function handleSubmitReview(verdict: 'safe' | 'unsafe') {
- {{ flag.issueType.replace(/_/g, ' ') }} -
+ {{ + flag.issueType.replace(/_/g, ' ') + }}
Date: Thu, 29 Jan 2026 22:56:39 +0000 Subject: [PATCH 04/15] feat: in mod queue -> in project queue --- apps/frontend/src/pages/moderation/technical-review/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/frontend/src/pages/moderation/technical-review/index.vue b/apps/frontend/src/pages/moderation/technical-review/index.vue index 4c769b9010..dca3ea3b77 100644 --- a/apps/frontend/src/pages/moderation/technical-review/index.vue +++ b/apps/frontend/src/pages/moderation/technical-review/index.vue @@ -576,7 +576,7 @@ watch([currentSortType, currentResponseFilter, inOtherQueueFilter, currentFilter