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..cc5c98023f9 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,10 +29,12 @@ 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 FindingsCountBadge from '../review-panel/findings-count-badge.vue' +import FlagsCountBadge from '../review-panel/flags-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..99b15ee0c7b 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 @@ >
+
@@ -37,6 +38,7 @@ import { injectReviewPreviousIssues } from '~/providers/project-review/review-pr import { injectReviewContext } from './context' import FindingsCountBadge from './findings-count-badge.vue' +import FlagsCountBadge from './flags-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 @@ +