Files
modrinth/apps/frontend/src/pages/moderation.vue
T
aecsocket 7f59feeb98 Merge branch 'main' of github.com:modrinth/code into boris/dev-1205-trace-rules
# Conflicts:
#	apps/frontend/src/components/ui/moderation/GlobalDetailLocalTraceCard.vue
#	apps/frontend/src/pages/moderation.vue
#	apps/labrinth/.sqlx/query-06384971752b20c04d7a747777bf03a765ab60c2b029a47fcd3fe97c02ee5b2a.json
#	apps/labrinth/.sqlx/query-1551b022217df05490a01e715b3584d26550d01a1917d1af64fe236d63dd5005.json
#	apps/labrinth/.sqlx/query-33d4e31565ece4a99832cbfd0a39bc49666e9fc8a400a5c41660504205e7cac5.json
#	apps/labrinth/.sqlx/query-4680c4a59c6679f90e3b9e1a33ed1cb1fb60b93ffb79ba5b99e01ee0c14c991a.json
#	apps/labrinth/.sqlx/query-5a68c53bd00c08edf9dfb9ffdabc28f86cdd77cd06bbb10c9a8e5199509f9c4b.json
#	apps/labrinth/.sqlx/query-87d30e8802ebe69858141d0d918cafb5286f984cfe55ad1a7ac2219ec50539a4.json
#	apps/labrinth/.sqlx/query-aedd5d9fe052a9fa70e585f389c3b4915a88cb9c3ec54493a2a29582c80b5c76.json
#	apps/labrinth/.sqlx/query-befd8c75e7ed4621f5e99d88719c0fde9d617b6603b99b75cc18d1a02387bac4.json
#	apps/labrinth/.sqlx/query-c268a2a256f11a65449bd132a14f931c2e9776ffed87f4406bb5c2bc30087f5b.json
#	apps/labrinth/.sqlx/query-c40c2085202bc4486568fb24db9201239cefbe174f4a5cc4b8eb21a10268cd73.json
#	apps/labrinth/.sqlx/query-d37041da5452ecb82da506a83154cd66b78ebb9a1dbf0bb46e5bd6bb2b3a9bb9.json
#	apps/labrinth/.sqlx/query-d3d320af2786bf7908e65f5b7a35ade08110fb341d694ca0f25eecca2f5ad5bf.json
#	apps/labrinth/src/routes/internal/delphi/tech_review_sync.rs
#	apps/labrinth/src/routes/internal/moderation/tech_review/global.rs
2026-08-11 06:35:49 +00:00

146 lines
4.0 KiB
Vue

<template>
<div
class="relativemb-6 flex min-h-screen w-full max-w-[1280px] flex-col px-6"
:class="`m${marginTarget}-auto`"
>
<h1>Moderation</h1>
<NavTabs :links="moderationLinks" class="mb-4 hidden sm:flex" />
<div class="mb-4 sm:hidden">
<Chips
v-model="selectedChip"
:items="mobileNavOptions"
:never-empty="true"
@change="navigateToPage"
/>
</div>
<NuxtPage />
</div>
</template>
<script setup lang="ts">
import {
FolderIcon,
GlobeIcon,
HashIcon,
ReportIcon,
SettingsIcon,
ShieldCheckIcon,
} from '@modrinth/assets'
import { getMarginTarget } from '@modrinth/moderation'
import { Chips, defineMessages, NavTabs, useVIntl } from '@modrinth/ui'
definePageMeta({
middleware: ['auth', 'staff'],
})
useSeoMeta({
robots: 'noindex',
})
const { formatMessage } = useVIntl()
const route = useRoute()
const router = useRouter()
const modSettings = useModerationSettings()
const marginTarget = computed(() => getMarginTarget(modSettings.value))
const messages = defineMessages({
projectsTitle: {
id: 'moderation.page.projects',
defaultMessage: 'Projects',
},
technicalReviewTitle: {
id: 'moderation.page.technicalReview',
defaultMessage: 'Tech review',
},
reportsTitle: {
id: 'moderation.page.reports',
defaultMessage: 'Reports',
},
externalFilesTitle: {
id: 'moderation.page.external-projects',
defaultMessage: 'External projects',
},
globalDetailTracesTitle: {
id: 'moderation.page.global-detail-traces',
defaultMessage: 'Global traces',
},
delphiRulesTitle: {
id: 'moderation.page.delphi-rules',
defaultMessage: 'Delphi rules',
},
})
const moderationLinks = [
{ label: formatMessage(messages.projectsTitle), href: '/moderation', icon: FolderIcon },
{
label: formatMessage(messages.technicalReviewTitle),
href: '/moderation/technical-review',
icon: ShieldCheckIcon,
},
{ label: formatMessage(messages.reportsTitle), href: '/moderation/reports', icon: ReportIcon },
{
label: formatMessage(messages.externalFilesTitle),
href: '/moderation/external-projects',
icon: GlobeIcon,
},
{
label: formatMessage(messages.globalDetailTracesTitle),
href: '/moderation/global-traces',
icon: HashIcon,
},
{
label: formatMessage(messages.delphiRulesTitle),
href: '/moderation/technical-review/rules',
icon: SettingsIcon,
},
]
const mobileNavOptions = [
formatMessage(messages.projectsTitle),
formatMessage(messages.technicalReviewTitle),
formatMessage(messages.reportsTitle),
formatMessage(messages.externalFilesTitle),
formatMessage(messages.globalDetailTracesTitle),
formatMessage(messages.delphiRulesTitle),
]
const selectedChip = computed({
get() {
const path = route.path
if (path.startsWith('/moderation/technical-review/rules')) {
return formatMessage(messages.delphiRulesTitle)
} else if (path.startsWith('/moderation/technical-review')) {
return formatMessage(messages.technicalReviewTitle)
} else if (path.startsWith('/moderation/reports')) {
return formatMessage(messages.reportsTitle)
} else if (path.startsWith('/moderation/external-projects')) {
return formatMessage(messages.externalFilesTitle)
} else if (path.startsWith('/moderation/global-traces')) {
return formatMessage(messages.globalDetailTracesTitle)
} else {
return formatMessage(messages.projectsTitle)
}
},
set(value: string) {
navigateToPage(value)
},
})
function navigateToPage(selectedOption: string) {
if (selectedOption === formatMessage(messages.technicalReviewTitle)) {
router.push('/moderation/technical-review')
} else if (selectedOption === formatMessage(messages.reportsTitle)) {
router.push('/moderation/reports')
} else if (selectedOption === formatMessage(messages.externalFilesTitle)) {
router.push('/moderation/external-projects')
} else if (selectedOption === formatMessage(messages.globalDetailTracesTitle)) {
router.push('/moderation/global-traces')
} else if (selectedOption === formatMessage(messages.delphiRulesTitle)) {
router.push('/moderation/technical-review/rules')
} else {
router.push('/moderation')
}
}
</script>