fix: attribution scanning details (#6651)

* key override file sources on file path, allow deleting groups

* dont scan modrinth files

* delete attr group button

* return what override files already exist on platform

* intl:extract

* uppercase queries

* fix dupe migration key
This commit is contained in:
aecsocket
2026-07-12 09:04:54 +00:00
committed by GitHub
parent 1741d12b7b
commit e1556a8ee3
15 changed files with 346 additions and 106 deletions
@@ -64,6 +64,21 @@ export class LabrinthAttributionInternalModule extends AbstractModule {
})
}
/**
* Delete an attribution group and all files inside it.
* DELETE /_internal/attribution/group/{group_id}
*
* @param groupId - The base62 attribution group id (as returned from listProjectAttribution).
*/
public async deleteGroup(groupId: string): Promise<void> {
const numericId = decodeBase62Id(groupId)
return this.client.request<void>(`/attribution/group/${numericId}`, {
api: 'labrinth',
version: 'internal',
method: 'DELETE',
})
}
/**
* Reassign a file (by sha1) to another attribution group within the same project.
* POST /_internal/attribution/assign
@@ -373,6 +373,14 @@ export namespace Labrinth {
date_created: string
}
export type OverrideFileOnPlatform = {
file_path: string
sha1: string
version_id: string
platform_version_id: string
platform_project_id: string
}
export type AttributionGroup = {
id: string
flame_project: FlameProject | null
@@ -381,6 +389,7 @@ export namespace Labrinth {
attributed_by: string | null
files: AttributionFile[]
versions: AttributionVersionInfo[]
override_files_on_platform: OverrideFileOnPlatform[]
}
export type UpdateGroupRequest = {
@@ -9,6 +9,7 @@ import {
ReportIcon,
ScaleIcon,
SpinnerIcon,
TrashIcon,
VersionIcon,
XCircleIcon,
XIcon,
@@ -135,6 +136,10 @@ const messages = defineMessages({
id: 'external-files.permissions-card.add-files-to-group',
defaultMessage: 'Add files...',
},
removeGroup: {
id: 'external-files.permissions-card.remove-group',
defaultMessage: 'Remove group',
},
moderationReasonLabel: {
id: 'external-files.permissions-card.moderation-reason',
defaultMessage: 'Reason',
@@ -248,6 +253,26 @@ const splitFileMutation = useMutation({
},
})
const deleteGroupMutation = useMutation({
mutationFn: () => client.labrinth.attribution_internal.deleteGroup(props.group.id),
onSuccess: async () => {
await queryClient.invalidateQueries({ queryKey: ['project-attribution', props.projectId] })
emit('updated')
},
onError: (error: Error) => {
addNotification({
type: 'error',
title: formatMessage(
defineMessage({
id: 'external-files.permissions-card.remove-group-error.title',
defaultMessage: 'Could not remove group',
}),
),
text: error.message,
})
},
})
function startEditingAttribution() {
editingMode.value = 'attribution'
collapsed.value = false
@@ -280,6 +305,10 @@ function handleConfirmAddFiles(sha1s: string[]) {
assignFilesMutation.mutate(sha1s)
}
function handleDeleteGroup() {
deleteGroupMutation.mutate()
}
async function handleAddFilesToGroup(event: MouseEvent) {
try {
const groups = await queryClient.ensureQueryData({
@@ -782,6 +811,18 @@ const visibleQuickReplies = computed<OverflowMenuOption[]>(() => {
@cancel="stopEditing"
/>
</div>
<div v-if="isModerator" class="flex justify-end pt-2">
<ButtonStyled color="red" type="outlined">
<button :disabled="deleteGroupMutation.isPending.value" @click="handleDeleteGroup">
<SpinnerIcon
v-if="deleteGroupMutation.isPending.value"
class="size-4 shrink-0 animate-spin"
/>
<TrashIcon v-else class="size-4 shrink-0" />
{{ formatMessage(messages.removeGroup) }}
</button>
</ButtonStyled>
</div>
</div>
</Collapsible>
<AddFilesToAttributionGroupModal
+6
View File
@@ -1142,6 +1142,12 @@
"external-files.permissions-card.reason.special-permission.description": {
"defaultMessage": "You have obtained special permission to redistribute this work in your modpack."
},
"external-files.permissions-card.remove-group": {
"defaultMessage": "Remove group"
},
"external-files.permissions-card.remove-group-error.title": {
"defaultMessage": "Could not remove group"
},
"external-files.permissions-card.split-file": {
"defaultMessage": "Remove from group"
},