-
+
+
-
-
{{ reportItemTitle }}
-
-
+
+ {{ report.user?.username || 'Unknown User' }}
+
+
+
+ Joined {{ formatRelativeTime(report.user.created) }}
+
+
+
+
+
+
-
-
-
- {{ report.target.name || 'Unknown User' }}
-
-
+ {{ reportItemTitle }}
+
-
-
- {{ formattedItemType }}
-
-
- {{
- report.version.files.find((file) => file.primary)?.filename || 'Unknown Version'
- }}
+
+
+
+ {{ formatProjectType(report.project.project_type, true) }}
+
+
+ {{ report.version.files.find((f) => f.primary)?.filename || 'Unknown Version' }}
+
-
-
-
-
-
-
-
-
+
+
+
+ {{ report.target.name }}
+
+
+
-
-
-
+
+
+
+
+
+
+
+ Reopen Thread
+
+
+
+
+
+
+
+
+ Reply and close
+
+
+
+
+
+ Close report
+
+
+
+
+
+
-
-
diff --git a/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue b/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue
new file mode 100644
index 0000000000..4d9b12f2d3
--- /dev/null
+++ b/apps/frontend/src/components/ui/moderation/ModerationTechRevCard.vue
@@ -0,0 +1,1138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.project.name }}
+
+
+
+
+ {{ formatProjectType(project_type, true) }}
+
+
+
+ Auto-Flagged
+
+
+
+ {{
+ capitalizeString(highestSeverity.toLowerCase())
+ }}
+
+
+
+
+
+
+ {{ item.project_owner.name }}
+
+
({{ item.project_owner.id }})
+
+
+
+
+
+ {{ formattedDate }}
+
+
+
+
+
+
+
+ Copy ID
+
+
+
+ Copy link
+
+
+
+ View source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Pass
+
+
+
+
+ Fail
+
+
+
+ Debug Summary
+
+
+
+
+
+
+
+
+
+
+
0 && viewFileFlags(file)"
+ >
+ {{ file.file_name }}
+
+
+ {{
+ formatFileSize(file.file_size)
+ }}
+
+
+ {{
+ capitalizeString(getFileHighestSeverity(file))
+ }}
+
+
+
+ {{ getFileMarkedCount(file) }}/{{ getFileDetailCount(file) }} flags
+
+
+
+ Manual review
+
+
+ No flags
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ classItem.filePath }}
+
+
+ {{
+ capitalizeString(getHighestSeverityInClass(classItem.flags))
+ }}
+
+
+
+
+ {{ getMarkedFlagsCount(classItem.flags) }}/{{ classItem.flags.length }} flags
+
+
+
+
+
+
+ Loading source...
+
+
+
+
+
+
+
+
+
+
{{
+ flag.issueType.replace(/_/g, ' ')
+ }}
+
+
+
+ {{
+ capitalizeString(flag.detail.severity)
+ }}
+
+
+
+
+
+
+ Pass
+
+
+
+
+
+ Fail
+
+
+
+
+
+
+
+
+ Source code not available or failed to decompile for this file.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/frontend/src/components/ui/servers/FileItem.vue b/apps/frontend/src/components/ui/servers/FileItem.vue
index ac4c426591..ae4b2cea9d 100644
--- a/apps/frontend/src/components/ui/servers/FileItem.vue
+++ b/apps/frontend/src/components/ui/servers/FileItem.vue
@@ -68,26 +68,18 @@
import {
DownloadIcon,
EditIcon,
- FileArchiveIcon,
- FileIcon,
FolderOpenIcon,
MoreHorizontalIcon,
PackageOpenIcon,
RightArrowIcon,
TrashIcon,
} from '@modrinth/assets'
-import { ButtonStyled } from '@modrinth/ui'
+import { ButtonStyled, getFileExtensionIcon } from '@modrinth/ui'
import { computed, ref, shallowRef } from 'vue'
import { renderToString } from 'vue/server-renderer'
import { useRoute, useRouter } from 'vue-router'
-import {
- UiServersIconsCodeFileIcon,
- UiServersIconsCogFolderIcon,
- UiServersIconsEarthIcon,
- UiServersIconsImageFileIcon,
- UiServersIconsTextFileIcon,
-} from '#components'
+import { UiServersIconsCogFolderIcon, UiServersIconsEarthIcon } from '#components'
import PaletteIcon from '~/assets/icons/palette.svg?component'
import TeleportOverflowMenu from './TeleportOverflowMenu.vue'
@@ -116,36 +108,7 @@ const emit = defineEmits<{
const isDragOver = ref(false)
const isDragging = ref(false)
-const codeExtensions = Object.freeze([
- 'json',
- 'json5',
- 'jsonc',
- 'java',
- 'kt',
- 'kts',
- 'sh',
- 'bat',
- 'ps1',
- 'yml',
- 'yaml',
- 'toml',
- 'js',
- 'ts',
- 'py',
- 'rb',
- 'php',
- 'html',
- 'css',
- 'cpp',
- 'c',
- 'h',
- 'rs',
- 'go',
-])
-
const textExtensions = Object.freeze(['txt', 'md', 'log', 'cfg', 'conf', 'properties', 'ini', 'sk'])
-const imageExtensions = Object.freeze(['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp'])
-const supportedArchiveExtensions = Object.freeze(['zip'])
const units = Object.freeze(['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB'])
const route = shallowRef(useRoute())
@@ -199,12 +162,7 @@ const iconComponent = computed(() => {
return FolderOpenIcon
}
- const ext = fileExtension.value
- if (codeExtensions.includes(ext)) return UiServersIconsCodeFileIcon
- if (textExtensions.includes(ext)) return UiServersIconsTextFileIcon
- if (imageExtensions.includes(ext)) return UiServersIconsImageFileIcon
- if (supportedArchiveExtensions.includes(ext)) return FileArchiveIcon
- return FileIcon
+ return getFileExtensionIcon(fileExtension.value)
})
const subText = computed(() => {
diff --git a/apps/frontend/src/components/ui/servers/icons/LoaderIcon.vue b/apps/frontend/src/components/ui/servers/icons/LoaderIcon.vue
index 02d0ae05d2..4bd494e49f 100644
--- a/apps/frontend/src/components/ui/servers/icons/LoaderIcon.vue
+++ b/apps/frontend/src/components/ui/servers/icons/LoaderIcon.vue
@@ -1,232 +1,22 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/apps/frontend/src/components/ui/thread/ConversationThread.vue b/apps/frontend/src/components/ui/thread/ConversationThread.vue
index 8fb3904538..b288daf781 100644
--- a/apps/frontend/src/components/ui/thread/ConversationThread.vue
+++ b/apps/frontend/src/components/ui/thread/ConversationThread.vue
@@ -217,6 +217,14 @@
hoverFilled: true,
disabled: project.status === 'withheld',
},
+ {
+ id: 'send-to-review-reply',
+ action: () => {
+ sendReply('processing', true)
+ },
+ hoverFilled: true,
+ disabled: project.status === 'processing',
+ },
]
: [
{
@@ -228,6 +236,14 @@
hoverFilled: true,
disabled: project.status === 'withheld',
},
+ {
+ id: 'send-to-review',
+ action: () => {
+ setStatus('processing')
+ },
+ hoverFilled: true,
+ disabled: project.status === 'processing',
+ },
]
"
>
@@ -240,6 +256,14 @@
Withhold
+
+
+ Send to review with reply
+
+
+
+ Send to review
+
diff --git a/apps/frontend/src/components/ui/thread/ReportThread.vue b/apps/frontend/src/components/ui/thread/ReportThread.vue
deleted file mode 100644
index 7053f8e9e9..0000000000
--- a/apps/frontend/src/components/ui/thread/ReportThread.vue
+++ /dev/null
@@ -1,286 +0,0 @@
-
-
-
diff --git a/apps/frontend/src/components/ui/thread/ThreadMessage.vue b/apps/frontend/src/components/ui/thread/ThreadMessage.vue
index a599329d79..fb5148e287 100644
--- a/apps/frontend/src/components/ui/thread/ThreadMessage.vue
+++ b/apps/frontend/src/components/ui/thread/ThreadMessage.vue
@@ -4,7 +4,7 @@
:class="{
'has-body': message.body.type === 'text' && !forceCompact,
'no-actions': noLinks,
- private: message.body.private,
+ private: isPrivateMessage,
}"
>
diff --git a/apps/frontend/src/pages/moderation/technical-review.vue b/apps/frontend/src/pages/moderation/technical-review.vue
index 3a5ae57552..b1ff7150b2 100644
--- a/apps/frontend/src/pages/moderation/technical-review.vue
+++ b/apps/frontend/src/pages/moderation/technical-review.vue
@@ -1,3 +1,572 @@
+
+
diff --git a/apps/frontend/src/pages/settings/billing/index.vue b/apps/frontend/src/pages/settings/billing/index.vue
index ecc510ac9f..da4a1033d9 100644
--- a/apps/frontend/src/pages/settings/billing/index.vue
+++ b/apps/frontend/src/pages/settings/billing/index.vue
@@ -510,9 +510,7 @@
class="universal-card recessed !mb-0 flex items-center justify-between"
>