From 13efdcde49c40646c800a02f3e66cee303a8ca80 Mon Sep 17 00:00:00 2001 From: tdgao Date: Thu, 5 Nov 2026 16:52:15 -0600 Subject: [PATCH 1/2] feat: surface project flags in modview --- .../project-review/flag-list/flag-card.vue | 47 ++++ .../project-review/flag-list/index.vue | 27 +++ .../src/components/project-review/index.vue | 12 +- .../project-review/project-info/section.vue | 10 +- .../project-review/review-panel/anchor.vue | 2 + .../review-panel/flags-count-badge.vue | 21 ++ .../project-review/review-panel/flags.vue | 56 +++++ .../project-review/review-panel/index.vue | 3 + .../project-review/review-panel/popover.vue | 2 +- .../re-review-findings-count-badge.vue | 4 +- .../providers/project-review/review-flags.ts | 97 ++++++++ .../labrinth/project-flags/internal.ts | 8 + .../modules/labrinth/project-flags/types.ts | 9 +- packages/assets/generated-icons.ts | 217 +++++++++--------- 14 files changed, 400 insertions(+), 115 deletions(-) create mode 100644 apps/frontend/src/components/project-review/flag-list/flag-card.vue create mode 100644 apps/frontend/src/components/project-review/flag-list/index.vue create mode 100644 apps/frontend/src/components/project-review/review-panel/flags-count-badge.vue create mode 100644 apps/frontend/src/components/project-review/review-panel/flags.vue create mode 100644 apps/frontend/src/providers/project-review/review-flags.ts diff --git a/apps/frontend/src/components/project-review/flag-list/flag-card.vue b/apps/frontend/src/components/project-review/flag-list/flag-card.vue new file mode 100644 index 00000000000..38a597789d5 --- /dev/null +++ b/apps/frontend/src/components/project-review/flag-list/flag-card.vue @@ -0,0 +1,47 @@ + + + diff --git a/apps/frontend/src/components/project-review/flag-list/index.vue b/apps/frontend/src/components/project-review/flag-list/index.vue new file mode 100644 index 00000000000..9634efacdcc --- /dev/null +++ b/apps/frontend/src/components/project-review/flag-list/index.vue @@ -0,0 +1,27 @@ + + + diff --git a/apps/frontend/src/components/project-review/index.vue b/apps/frontend/src/components/project-review/index.vue index a28cf5962d3..21672abb249 100644 --- a/apps/frontend/src/components/project-review/index.vue +++ b/apps/frontend/src/components/project-review/index.vue @@ -70,6 +70,7 @@ + @@ -105,6 +106,7 @@ import { import { isStaff } from '~/helpers/users.js' import { injectProjectReviewPageContext } from '~/providers/project-review' import { previousReviewLinkUrls } from '~/providers/project-review/project-links' +import { createReviewFlags, provideReviewFlags } from '~/providers/project-review/review-flags' import { createReviewMessages, provideReviewMessages, @@ -126,6 +128,7 @@ import { import Description from './description/index.vue' import Disclosures from './disclosures/index.vue' +import FlagList from './flag-list/index.vue' import Gallery from './gallery/index.vue' import IssueList from './issue-list/index.vue' import IssuePicker from './issue-list/issue-picker.vue' @@ -177,6 +180,7 @@ const visibleTabs = computed((previousTabs) => { ) }) const reviewProjectId = computed(() => project.value?.id) +const reviewFlags = provideReviewFlags(createReviewFlags(reviewProjectId)) const session = provideReviewSession(createReviewSession()) const settings = useModerationSettings() const panels = provideReviewPanels( @@ -298,6 +302,7 @@ const rightPanelTabs = computed(() => [ value: 'issues', label: `Issues (${issueCount.value})`, }, + { value: 'flags', label: `Flags (${reviewFlags.flags.value.length})` }, ]) watch( @@ -313,7 +318,12 @@ watch(projectId, () => { }) useShortcut('cycle-conversation', () => { - const tabs = ['issues', 'thread', ...(hasPreviousStructuredIssues.value ? ['re-review'] : [])] + const tabs = [ + 'issues', + 'flags', + 'thread', + ...(hasPreviousStructuredIssues.value ? ['re-review'] : []), + ] activeReviewTab.value = tabs[(tabs.indexOf(activeReviewTab.value) + 1) % tabs.length] shortcuts.run('reveal-right') }) diff --git a/apps/frontend/src/components/project-review/project-info/section.vue b/apps/frontend/src/components/project-review/project-info/section.vue index 556137c6943..0fd3a63d4de 100644 --- a/apps/frontend/src/components/project-review/project-info/section.vue +++ b/apps/frontend/src/components/project-review/project-info/section.vue @@ -12,10 +12,11 @@
+
@@ -28,9 +29,11 @@ import { computed } from 'vue' import type { ReviewTarget } from '~/providers/project-review/review' +import { injectReviewFlags } from '~/providers/project-review/review-flags' import { injectReviewPanels } from '~/providers/project-review/review-panels' import { injectReviewPreviousIssues } from '~/providers/project-review/review-previous-issues' +import FlagsCountBadge from '../review-panel/flags-count-badge.vue' import FindingsCountBadge from '../review-panel/findings-count-badge.vue' import ReviewPanel from '../review-panel/index.vue' import ReReviewFindingsCountBadge from '../review-panel/re-review-findings-count-badge.vue' @@ -41,6 +44,11 @@ const props = defineProps<{ }>() const panels = injectReviewPanels() const previousIssues = injectReviewPreviousIssues() +const reviewFlags = injectReviewFlags(null) +const flagCount = computed(() => { + const binding = props.target ? panels.resolve(props.target) : undefined + return binding ? (reviewFlags?.forPanel(binding.key).length ?? 0) : 0 +}) const reReviewFindingCount = computed(() => { const binding = props.target ? panels.resolve(props.target) : undefined return binding ? previousIssues.reReviewFindingCount(binding) : 0 diff --git a/apps/frontend/src/components/project-review/review-panel/anchor.vue b/apps/frontend/src/components/project-review/review-panel/anchor.vue index 5634ba05012..466ff1628da 100644 --- a/apps/frontend/src/components/project-review/review-panel/anchor.vue +++ b/apps/frontend/src/components/project-review/review-panel/anchor.vue @@ -19,6 +19,7 @@ >
+
@@ -36,6 +37,7 @@ import { injectReviewPanels } from '~/providers/project-review/review-panels' import { injectReviewPreviousIssues } from '~/providers/project-review/review-previous-issues' import { injectReviewContext } from './context' +import FlagsCountBadge from './flags-count-badge.vue' import FindingsCountBadge from './findings-count-badge.vue' import Highlight from './highlight.vue' import ReReviewFindingsCountBadge from './re-review-findings-count-badge.vue' diff --git a/apps/frontend/src/components/project-review/review-panel/flags-count-badge.vue b/apps/frontend/src/components/project-review/review-panel/flags-count-badge.vue new file mode 100644 index 00000000000..76de6571820 --- /dev/null +++ b/apps/frontend/src/components/project-review/review-panel/flags-count-badge.vue @@ -0,0 +1,21 @@ + + + diff --git a/apps/frontend/src/components/project-review/review-panel/flags.vue b/apps/frontend/src/components/project-review/review-panel/flags.vue new file mode 100644 index 00000000000..74b0a9876ac --- /dev/null +++ b/apps/frontend/src/components/project-review/review-panel/flags.vue @@ -0,0 +1,56 @@ + + + diff --git a/apps/frontend/src/components/project-review/review-panel/index.vue b/apps/frontend/src/components/project-review/review-panel/index.vue index 455615302a4..b759f5eab0b 100644 --- a/apps/frontend/src/components/project-review/review-panel/index.vue +++ b/apps/frontend/src/components/project-review/review-panel/index.vue @@ -43,6 +43,7 @@ +