feat: allow bulk deleting attribution groups for moderators (#6839)

* feat: allow bulk deleting attribution groups for moderators

* prepr
This commit is contained in:
aecsocket
2026-07-24 13:42:36 +00:00
committed by GitHub
parent e58af98f21
commit a6d9bb7b3e
13 changed files with 302 additions and 46 deletions
@@ -18,7 +18,7 @@ import { renderString } from '@modrinth/utils'
import { useMutation, useQueryClient } from '@tanstack/vue-query'
import { computed, ref, useTemplateRef, watch } from 'vue'
import { ButtonStyled, Collapsible, OverflowMenu } from '#ui/components'
import { ButtonStyled, Collapsible, ConfirmModal, OverflowMenu } from '#ui/components'
import type { OverflowMenuOption } from '#ui/components/base'
import { commonMessages } from '#ui/utils'
@@ -79,6 +79,7 @@ const addToGlobalModalRef =
useTemplateRef<typeof AddToGlobalPermissionsDatabaseModal>('addToGlobalModalRef')
const addToExistingModalRef =
useTemplateRef<typeof AddToExistingExternalProjectModal>('addToExistingModalRef')
const deleteGroupModalRef = useTemplateRef<InstanceType<typeof ConfirmModal>>('deleteGroupModalRef')
const { formatMessage } = useVIntl()
const client = injectModrinthClient()
@@ -138,7 +139,20 @@ const messages = defineMessages({
},
removeGroup: {
id: 'external-files.permissions-card.remove-group',
defaultMessage: 'Remove group',
defaultMessage: 'Delete group',
},
removeGroupConfirmationTitle: {
id: 'external-files.permissions-card.remove-group-confirmation.title',
defaultMessage: 'Delete {title}?',
},
removeGroupConfirmationDescription: {
id: 'external-files.permissions-card.remove-group-confirmation.description',
defaultMessage:
'This will permanently delete this attribution group and all files inside it. This action cannot be undone.',
},
removeGroupShiftHint: {
id: 'external-files.permissions-card.remove-group-shift-hint',
defaultMessage: 'Hold Shift while clicking to skip confirmation.',
},
moderationReasonLabel: {
id: 'external-files.permissions-card.moderation-reason',
@@ -254,7 +268,7 @@ const splitFileMutation = useMutation({
})
const deleteGroupMutation = useMutation({
mutationFn: () => client.labrinth.attribution_internal.deleteGroup(props.group.id),
mutationFn: () => client.labrinth.attribution_internal.deleteGroups([props.group.id]),
onSuccess: async () => {
await queryClient.invalidateQueries({ queryKey: ['project-attribution', props.projectId] })
emit('updated')
@@ -265,7 +279,7 @@ const deleteGroupMutation = useMutation({
title: formatMessage(
defineMessage({
id: 'external-files.permissions-card.remove-group-error.title',
defaultMessage: 'Could not remove group',
defaultMessage: 'Could not delete group',
}),
),
text: error.message,
@@ -305,10 +319,19 @@ function handleConfirmAddFiles(sha1s: string[]) {
assignFilesMutation.mutate(sha1s)
}
function handleDeleteGroup() {
function deleteGroup() {
deleteGroupMutation.mutate()
}
function handleDeleteGroup(event: MouseEvent) {
if (event.shiftKey) {
deleteGroup()
return
}
deleteGroupModalRef.value?.show()
}
async function handleAddFilesToGroup(event: MouseEvent) {
try {
const groups = await queryClient.ensureQueryData({
@@ -825,6 +848,18 @@ const visibleQuickReplies = computed<OverflowMenuOption[]>(() => {
</div>
</div>
</Collapsible>
<ConfirmModal
v-if="isModerator"
ref="deleteGroupModalRef"
:title="formatMessage(messages.removeGroupConfirmationTitle, { title })"
:description="formatMessage(messages.removeGroupConfirmationDescription)"
:proceed-label="formatMessage(messages.removeGroup)"
@proceed="deleteGroup"
>
<p class="m-0 text-xs text-secondary">
{{ formatMessage(messages.removeGroupShiftHint) }}
</p>
</ConfirmModal>
<AddFilesToAttributionGroupModal
ref="addFilesModalRef"
:group-id="group.id"
+11 -2
View File
@@ -1194,10 +1194,19 @@
"defaultMessage": "You have obtained special permission to redistribute this work in your modpack."
},
"external-files.permissions-card.remove-group": {
"defaultMessage": "Remove group"
"defaultMessage": "Delete group"
},
"external-files.permissions-card.remove-group-confirmation.description": {
"defaultMessage": "This will permanently delete this attribution group and all files inside it. This action cannot be undone."
},
"external-files.permissions-card.remove-group-confirmation.title": {
"defaultMessage": "Delete {title}?"
},
"external-files.permissions-card.remove-group-error.title": {
"defaultMessage": "Could not remove group"
"defaultMessage": "Could not delete group"
},
"external-files.permissions-card.remove-group-shift-hint": {
"defaultMessage": "Hold Shift while clicking to skip confirmation."
},
"external-files.permissions-card.split-file": {
"defaultMessage": "Remove from group"