mirror of
https://github.com/modrinth/code.git
synced 2026-08-27 18:14:49 +00:00
change admin edit role modal to edit user (#7035)
change edit role modal to edit user
This commit is contained in:
@@ -52,6 +52,8 @@ import { onBeforeRouteUpdate, useRoute, useRouter } from 'vue-router'
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
block_user,
|
block_user,
|
||||||
|
change_user_avatar,
|
||||||
|
delete_user_avatar,
|
||||||
get_blocked_users,
|
get_blocked_users,
|
||||||
get_user_collections,
|
get_user_collections,
|
||||||
get_user_organizations,
|
get_user_organizations,
|
||||||
@@ -119,6 +121,10 @@ const userProfile = provideUserProfile({
|
|||||||
getOrganizations: get_user_organizations,
|
getOrganizations: get_user_organizations,
|
||||||
getCollections: get_user_collections,
|
getCollections: get_user_collections,
|
||||||
patchUser: patch_user,
|
patchUser: patch_user,
|
||||||
|
changeAvatar: async (userId, file, extension) => {
|
||||||
|
await change_user_avatar(userId, new Uint8Array(await file.arrayBuffer()), extension)
|
||||||
|
},
|
||||||
|
deleteAvatar: delete_user_avatar,
|
||||||
getBlockedUsers: get_blocked_users,
|
getBlockedUsers: get_blocked_users,
|
||||||
blockUser: block_user,
|
blockUser: block_user,
|
||||||
unblockUser: unblock_user,
|
unblockUser: unblock_user,
|
||||||
|
|||||||
@@ -34,6 +34,9 @@ const userProfile = provideUserProfile({
|
|||||||
getOrganizations: (userId) => client.labrinth.users_v2.getOrganizations(userId),
|
getOrganizations: (userId) => client.labrinth.users_v2.getOrganizations(userId),
|
||||||
getCollections: (userId) => client.labrinth.users_v2.getCollections(userId),
|
getCollections: (userId) => client.labrinth.users_v2.getCollections(userId),
|
||||||
patchUser: (userId, patch) => client.labrinth.users_v2.patch(userId, patch),
|
patchUser: (userId, patch) => client.labrinth.users_v2.patch(userId, patch),
|
||||||
|
changeAvatar: (userId, file, extension) =>
|
||||||
|
client.labrinth.users_v2.changeIcon(userId, file, extension),
|
||||||
|
deleteAvatar: (userId) => client.labrinth.users_v2.deleteIcon(userId),
|
||||||
getBlockedUsers: () => client.labrinth.blocked_users_v3.list(),
|
getBlockedUsers: () => client.labrinth.blocked_users_v3.list(),
|
||||||
blockUser: (userId) => client.labrinth.blocked_users_v3.block(userId),
|
blockUser: (userId) => client.labrinth.blocked_users_v3.block(userId),
|
||||||
unblockUser: (userId) => client.labrinth.blocked_users_v3.unblock(userId),
|
unblockUser: (userId) => client.labrinth.blocked_users_v3.unblock(userId),
|
||||||
|
|||||||
@@ -136,10 +136,6 @@ const messages = defineMessages({
|
|||||||
id: 'profile.button.unblock',
|
id: 'profile.button.unblock',
|
||||||
defaultMessage: 'Unblock',
|
defaultMessage: 'Unblock',
|
||||||
},
|
},
|
||||||
editRoleButton: {
|
|
||||||
id: 'profile.button.edit-role',
|
|
||||||
defaultMessage: 'Edit role',
|
|
||||||
},
|
|
||||||
infoButton: {
|
infoButton: {
|
||||||
id: 'profile.button.info',
|
id: 'profile.button.info',
|
||||||
defaultMessage: 'View user details',
|
defaultMessage: 'View user details',
|
||||||
@@ -220,7 +216,7 @@ const emit = defineEmits<{
|
|||||||
toggleAffiliate: []
|
toggleAffiliate: []
|
||||||
openInfo: []
|
openInfo: []
|
||||||
openAnalytics: []
|
openAnalytics: []
|
||||||
editRole: []
|
editUser: []
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
const { formatMessage } = useVIntl()
|
const { formatMessage } = useVIntl()
|
||||||
@@ -306,10 +302,10 @@ const moreActions = computed<OverflowMenuOption[]>(() => [
|
|||||||
shown: props.showStaffActions && props.isAdmin,
|
shown: props.showStaffActions && props.isAdmin,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'edit-role',
|
id: 'edit-user',
|
||||||
label: formatMessage(messages.editRoleButton),
|
label: 'Edit user',
|
||||||
icon: EditIcon,
|
icon: EditIcon,
|
||||||
action: () => emit('editRole'),
|
action: () => emit('editUser'),
|
||||||
tone: 'orange',
|
tone: 'orange',
|
||||||
shown: props.showStaffActions && props.isAdmin,
|
shown: props.showStaffActions && props.isAdmin,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,310 @@
|
|||||||
|
<template>
|
||||||
|
<NewModal ref="modal" header="Edit user" :closable="!isSaving">
|
||||||
|
<div class="flex w-[28rem] flex-col gap-4">
|
||||||
|
<div class="flex flex-col gap-2.5">
|
||||||
|
<span class="text-lg font-semibold text-contrast">Profile picture</span>
|
||||||
|
<div class="flex items-center gap-4">
|
||||||
|
<Avatar
|
||||||
|
:src="displayedAvatarUrl"
|
||||||
|
size="md"
|
||||||
|
circle
|
||||||
|
:alt="form.username || user.username"
|
||||||
|
/>
|
||||||
|
<div class="flex flex-col gap-2">
|
||||||
|
<FileButton
|
||||||
|
:max-size="262144"
|
||||||
|
:prompt="formatMessage(commonMessages.uploadImageButton)"
|
||||||
|
accept="image/png,image/jpeg,image/gif,image/webp"
|
||||||
|
size="md"
|
||||||
|
:disabled="isSaving"
|
||||||
|
@change="showAvatarPreview"
|
||||||
|
>
|
||||||
|
<UploadIcon aria-hidden="true" />
|
||||||
|
</FileButton>
|
||||||
|
<Button
|
||||||
|
v-if="avatarUrl && !pendingAvatarDeletion"
|
||||||
|
native-type="button"
|
||||||
|
size="md"
|
||||||
|
:disabled="isSaving"
|
||||||
|
@click="removeAvatar"
|
||||||
|
>
|
||||||
|
<TrashIcon aria-hidden="true" />
|
||||||
|
{{ formatMessage(commonMessages.removeImageButton) }}
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
v-if="avatarFile || pendingAvatarDeletion"
|
||||||
|
native-type="button"
|
||||||
|
size="md"
|
||||||
|
:disabled="isSaving"
|
||||||
|
@click="resetAvatar"
|
||||||
|
>
|
||||||
|
<UndoIcon aria-hidden="true" />
|
||||||
|
{{ formatMessage(commonMessages.resetButton) }}
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col gap-2.5">
|
||||||
|
<label class="text-lg font-semibold text-contrast" for="admin-edit-username">
|
||||||
|
{{ formatMessage(commonMessages.usernameLabel) }}
|
||||||
|
</label>
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<StyledInput
|
||||||
|
id="admin-edit-username"
|
||||||
|
v-model="form.username"
|
||||||
|
class="w-full"
|
||||||
|
:error="form.username.length > 39"
|
||||||
|
:disabled="isSaving"
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
v-if="form.username.length >= 30"
|
||||||
|
class="shrink-0 text-secondary"
|
||||||
|
:class="{ 'text-red': form.username.length > 39 }"
|
||||||
|
>
|
||||||
|
{{ form.username.length }}/39
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col gap-2.5">
|
||||||
|
<label class="text-lg font-semibold text-contrast" for="admin-edit-bio">Bio</label>
|
||||||
|
<StyledInput
|
||||||
|
id="admin-edit-bio"
|
||||||
|
v-model="form.bio"
|
||||||
|
multiline
|
||||||
|
:error="form.bio.length > 160"
|
||||||
|
:disabled="isSaving"
|
||||||
|
/>
|
||||||
|
<div class="text-secondary" :class="{ 'text-red': form.bio.length > 160 }">
|
||||||
|
{{ form.bio.length }}/160
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col gap-2.5">
|
||||||
|
<span class="text-lg font-semibold text-contrast">Role</span>
|
||||||
|
<Combobox
|
||||||
|
v-model="form.role"
|
||||||
|
:options="roleOptions"
|
||||||
|
placeholder="Select a role"
|
||||||
|
:disabled="isSaving"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-end gap-2">
|
||||||
|
<Button native-type="button" :disabled="isSaving" @click="cancel">
|
||||||
|
<XIcon />
|
||||||
|
{{ formatMessage(commonMessages.cancelButton) }}
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
type="colored"
|
||||||
|
color="brand"
|
||||||
|
native-type="button"
|
||||||
|
:disabled="!canSave || isSaving"
|
||||||
|
@click="save"
|
||||||
|
>
|
||||||
|
<template v-if="isSaving">
|
||||||
|
<SpinnerIcon class="animate-spin" />
|
||||||
|
{{ formatMessage(commonMessages.savingButton) }}
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<SaveIcon />
|
||||||
|
{{ formatMessage(commonMessages.saveChangesButton) }}
|
||||||
|
</template>
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</NewModal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import type { Labrinth } from '@modrinth/api-client'
|
||||||
|
import { SaveIcon, SpinnerIcon, TrashIcon, UndoIcon, UploadIcon, XIcon } from '@modrinth/assets'
|
||||||
|
import { useQueryClient } from '@tanstack/vue-query'
|
||||||
|
import { computed, onBeforeUnmount, ref, shallowRef } from 'vue'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
|
|
||||||
|
import Avatar from '#ui/components/base/Avatar.vue'
|
||||||
|
import { Button, FileButton } from '#ui/components/base/buttons'
|
||||||
|
import Combobox from '#ui/components/base/Combobox.vue'
|
||||||
|
import StyledInput from '#ui/components/base/StyledInput.vue'
|
||||||
|
import NewModal from '#ui/components/modal/NewModal.vue'
|
||||||
|
import { useVIntl } from '#ui/composables'
|
||||||
|
import { injectNotificationManager } from '#ui/providers'
|
||||||
|
import { commonMessages } from '#ui/utils'
|
||||||
|
|
||||||
|
import { injectUserProfile } from '../providers'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
user: Labrinth.Users.v3.User
|
||||||
|
userId: string
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const userProfile = injectUserProfile()
|
||||||
|
const notificationManager = injectNotificationManager()
|
||||||
|
const queryClient = useQueryClient()
|
||||||
|
const router = useRouter()
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
|
||||||
|
const modal = ref<InstanceType<typeof NewModal> | null>(null)
|
||||||
|
const isSaving = ref(false)
|
||||||
|
const form = ref<{
|
||||||
|
username: string
|
||||||
|
bio: string
|
||||||
|
role: Labrinth.Users.v3.Role | null
|
||||||
|
}>({
|
||||||
|
username: '',
|
||||||
|
bio: '',
|
||||||
|
role: null,
|
||||||
|
})
|
||||||
|
const avatarUrl = ref<string | null>(null)
|
||||||
|
const avatarFile = shallowRef<File | null>(null)
|
||||||
|
const avatarPreviewUrl = ref<string | null>(null)
|
||||||
|
const pendingAvatarDeletion = ref(false)
|
||||||
|
|
||||||
|
const roleOptions = [
|
||||||
|
{ value: 'developer', label: 'None' },
|
||||||
|
{ value: 'moderator', label: 'Content Moderator' },
|
||||||
|
{ value: 'admin', label: 'Admin' },
|
||||||
|
] satisfies { value: Labrinth.Users.v3.Role; label: string }[]
|
||||||
|
|
||||||
|
const displayedAvatarUrl = computed(() => {
|
||||||
|
if (avatarPreviewUrl.value) {
|
||||||
|
return avatarPreviewUrl.value
|
||||||
|
}
|
||||||
|
if (pendingAvatarDeletion.value) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return avatarUrl.value
|
||||||
|
})
|
||||||
|
|
||||||
|
const hasChanges = computed(() => {
|
||||||
|
return (
|
||||||
|
form.value.username !== props.user.username ||
|
||||||
|
form.value.bio !== (props.user.bio ?? '') ||
|
||||||
|
form.value.role !== props.user.role ||
|
||||||
|
Boolean(avatarFile.value || pendingAvatarDeletion.value)
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
const canSave = computed(() => {
|
||||||
|
return (
|
||||||
|
hasChanges.value &&
|
||||||
|
form.value.username.length > 0 &&
|
||||||
|
form.value.username.length <= 39 &&
|
||||||
|
form.value.bio.length <= 160 &&
|
||||||
|
form.value.role !== null
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
function revokeAvatarPreview(): void {
|
||||||
|
if (avatarPreviewUrl.value) {
|
||||||
|
URL.revokeObjectURL(avatarPreviewUrl.value)
|
||||||
|
avatarPreviewUrl.value = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function syncFromUser(): void {
|
||||||
|
revokeAvatarPreview()
|
||||||
|
form.value = {
|
||||||
|
username: props.user.username,
|
||||||
|
bio: props.user.bio ?? '',
|
||||||
|
role: props.user.role,
|
||||||
|
}
|
||||||
|
avatarUrl.value = props.user.avatar_url ?? null
|
||||||
|
avatarFile.value = null
|
||||||
|
pendingAvatarDeletion.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
function showAvatarPreview(files: File[]): void {
|
||||||
|
const file = files[0]
|
||||||
|
if (!file) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
revokeAvatarPreview()
|
||||||
|
avatarFile.value = file
|
||||||
|
avatarPreviewUrl.value = URL.createObjectURL(file)
|
||||||
|
pendingAvatarDeletion.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeAvatar(): void {
|
||||||
|
revokeAvatarPreview()
|
||||||
|
avatarFile.value = null
|
||||||
|
pendingAvatarDeletion.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
function resetAvatar(): void {
|
||||||
|
revokeAvatarPreview()
|
||||||
|
avatarFile.value = null
|
||||||
|
pendingAvatarDeletion.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
function show(): void {
|
||||||
|
syncFromUser()
|
||||||
|
modal.value?.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
function hide(): void {
|
||||||
|
modal.value?.hide()
|
||||||
|
}
|
||||||
|
|
||||||
|
function cancel(): void {
|
||||||
|
syncFromUser()
|
||||||
|
hide()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function save(): Promise<void> {
|
||||||
|
if (!form.value.role || !canSave.value || isSaving.value) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const nextUsername = form.value.username
|
||||||
|
const usernameChanged = nextUsername !== props.user.username
|
||||||
|
isSaving.value = true
|
||||||
|
try {
|
||||||
|
const patch: Partial<Pick<Labrinth.Users.v3.User, 'bio' | 'role' | 'username'>> = {}
|
||||||
|
if (usernameChanged) {
|
||||||
|
patch.username = nextUsername
|
||||||
|
}
|
||||||
|
if (form.value.bio !== (props.user.bio ?? '')) {
|
||||||
|
patch.bio = form.value.bio
|
||||||
|
}
|
||||||
|
if (form.value.role !== props.user.role) {
|
||||||
|
patch.role = form.value.role
|
||||||
|
}
|
||||||
|
if (Object.keys(patch).length > 0) {
|
||||||
|
await userProfile.patchUser(props.user.id, patch)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pendingAvatarDeletion.value) {
|
||||||
|
await userProfile.deleteAvatar(props.user.id)
|
||||||
|
} else if (avatarFile.value) {
|
||||||
|
const extension = avatarFile.value.type.split('/').at(-1)
|
||||||
|
if (!extension) throw new Error('The selected image does not have a valid file type.')
|
||||||
|
await userProfile.changeAvatar(props.user.id, avatarFile.value, extension)
|
||||||
|
}
|
||||||
|
|
||||||
|
await queryClient.invalidateQueries({ queryKey: ['user', props.userId] })
|
||||||
|
hide()
|
||||||
|
|
||||||
|
if (usernameChanged) {
|
||||||
|
await router.replace(`/user/${encodeURIComponent(nextUsername)}`)
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
notificationManager.addNotification({
|
||||||
|
type: 'error',
|
||||||
|
title: 'Failed to update user',
|
||||||
|
text: 'An error occurred while updating this user. Please try again.',
|
||||||
|
})
|
||||||
|
} finally {
|
||||||
|
isSaving.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onBeforeUnmount(revokeAvatarPreview)
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
show,
|
||||||
|
hide,
|
||||||
|
})
|
||||||
|
</script>
|
||||||
@@ -37,41 +37,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</NewModal>
|
</NewModal>
|
||||||
|
|
||||||
<NewModal
|
<EditUserModal v-if="variant === 'web'" ref="editUserModal" :user="user" :user-id="userId" />
|
||||||
v-if="variant === 'web'"
|
|
||||||
ref="editRoleModal"
|
|
||||||
:header="formatMessage(messages.editRoleButton)"
|
|
||||||
>
|
|
||||||
<div class="flex w-80 flex-col gap-4">
|
|
||||||
<Combobox
|
|
||||||
v-model="selectedRole"
|
|
||||||
:options="roleOptions"
|
|
||||||
:placeholder="formatMessage(messages.selectRolePlaceholder)"
|
|
||||||
/>
|
|
||||||
<div class="flex justify-end gap-2">
|
|
||||||
<Button native-type="button" @click="cancelRoleEdit">
|
|
||||||
<XIcon />
|
|
||||||
{{ formatMessage(commonMessages.cancelButton) }}
|
|
||||||
</Button>
|
|
||||||
<Button
|
|
||||||
type="colored"
|
|
||||||
color="brand"
|
|
||||||
native-type="button"
|
|
||||||
:disabled="!selectedRole || selectedRole === user.role || isSavingRole"
|
|
||||||
@click="saveRoleEdit"
|
|
||||||
>
|
|
||||||
<template v-if="isSavingRole">
|
|
||||||
<SpinnerIcon class="animate-spin" />
|
|
||||||
{{ formatMessage(messages.savingLabel) }}
|
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
<SaveIcon />
|
|
||||||
{{ formatMessage(commonMessages.saveChangesButton) }}
|
|
||||||
</template>
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</NewModal>
|
|
||||||
|
|
||||||
<NewModal
|
<NewModal
|
||||||
v-if="variant === 'web' && isStaffViewing"
|
v-if="variant === 'web' && isStaffViewing"
|
||||||
@@ -226,7 +192,7 @@
|
|||||||
@open-analytics="
|
@open-analytics="
|
||||||
openPath(`/dashboard/analytics?user=${encodeURIComponent(user.username)}`)
|
openPath(`/dashboard/analytics?user=${encodeURIComponent(user.username)}`)
|
||||||
"
|
"
|
||||||
@edit-role="openRoleEditModal"
|
@edit-user="editUserModal?.show()"
|
||||||
>
|
>
|
||||||
<template v-if="isModrinthUser" #summary>
|
<template v-if="isModrinthUser" #summary>
|
||||||
<IntlFormatted :message-id="messages.officialAccountBio">
|
<IntlFormatted :message-id="messages.officialAccountBio">
|
||||||
@@ -460,7 +426,6 @@ import {
|
|||||||
LibraryIcon,
|
LibraryIcon,
|
||||||
LinkIcon,
|
LinkIcon,
|
||||||
LockIcon,
|
LockIcon,
|
||||||
SaveIcon,
|
|
||||||
SpinnerIcon,
|
SpinnerIcon,
|
||||||
XIcon,
|
XIcon,
|
||||||
} from '@modrinth/assets'
|
} from '@modrinth/assets'
|
||||||
@@ -477,7 +442,6 @@ import Admonition from '#ui/components/base/Admonition.vue'
|
|||||||
import AutoLink from '#ui/components/base/AutoLink.vue'
|
import AutoLink from '#ui/components/base/AutoLink.vue'
|
||||||
import Avatar from '#ui/components/base/Avatar.vue'
|
import Avatar from '#ui/components/base/Avatar.vue'
|
||||||
import { Button } from '#ui/components/base/buttons'
|
import { Button } from '#ui/components/base/buttons'
|
||||||
import Combobox from '#ui/components/base/Combobox.vue'
|
|
||||||
import EmptyState from '#ui/components/base/EmptyState.vue'
|
import EmptyState from '#ui/components/base/EmptyState.vue'
|
||||||
import IntlFormatted from '#ui/components/base/IntlFormatted.vue'
|
import IntlFormatted from '#ui/components/base/IntlFormatted.vue'
|
||||||
import NavTabs from '#ui/components/base/NavTabs.vue'
|
import NavTabs from '#ui/components/base/NavTabs.vue'
|
||||||
@@ -498,6 +462,7 @@ import {
|
|||||||
} from '#ui/providers'
|
} from '#ui/providers'
|
||||||
import { commonMessages, getProjectTypeTitleMessage, sortProjectTypes } from '#ui/utils'
|
import { commonMessages, getProjectTypeTitleMessage, sortProjectTypes } from '#ui/utils'
|
||||||
|
|
||||||
|
import EditUserModal from './components/edit-user-modal.vue'
|
||||||
import { blockedUsersQueryKey, injectUserProfile } from './providers'
|
import { blockedUsersQueryKey, injectUserProfile } from './providers'
|
||||||
import {
|
import {
|
||||||
hasActivePride26Midas,
|
hasActivePride26Midas,
|
||||||
@@ -571,18 +536,6 @@ const messages = defineMessages({
|
|||||||
id: 'profile.collection.projects-count',
|
id: 'profile.collection.projects-count',
|
||||||
defaultMessage: '{count, plural, one {# project} other {# projects}}',
|
defaultMessage: '{count, plural, one {# project} other {# projects}}',
|
||||||
},
|
},
|
||||||
savingLabel: {
|
|
||||||
id: 'profile.label.saving',
|
|
||||||
defaultMessage: 'Saving...',
|
|
||||||
},
|
|
||||||
editRoleButton: {
|
|
||||||
id: 'profile.button.edit-role',
|
|
||||||
defaultMessage: 'Edit role',
|
|
||||||
},
|
|
||||||
selectRolePlaceholder: {
|
|
||||||
id: 'profile.role.select-placeholder',
|
|
||||||
defaultMessage: 'Select a role',
|
|
||||||
},
|
|
||||||
userDetailsTitle: {
|
userDetailsTitle: {
|
||||||
id: 'profile.details.title',
|
id: 'profile.details.title',
|
||||||
defaultMessage: 'User details',
|
defaultMessage: 'User details',
|
||||||
@@ -692,14 +645,6 @@ const messages = defineMessages({
|
|||||||
defaultMessage:
|
defaultMessage:
|
||||||
'The official user account of Modrinth. Get support at <support-link></support-link> or via email at <email></email>',
|
'The official user account of Modrinth. Get support at <support-link></support-link> or via email at <email></email>',
|
||||||
},
|
},
|
||||||
roleUpdateErrorTitle: {
|
|
||||||
id: 'profile.role.update-error-title',
|
|
||||||
defaultMessage: 'Failed to update role',
|
|
||||||
},
|
|
||||||
roleUpdateErrorDescription: {
|
|
||||||
id: 'profile.role.update-error-description',
|
|
||||||
defaultMessage: 'An error occurred while updating the user role. Please try again.',
|
|
||||||
},
|
|
||||||
blockButton: {
|
blockButton: {
|
||||||
id: 'profile.button.block',
|
id: 'profile.button.block',
|
||||||
defaultMessage: 'Block',
|
defaultMessage: 'Block',
|
||||||
@@ -1043,35 +988,15 @@ async function retryQueries(): Promise<void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const userDetailsModal = ref<ModalRef | null>(null)
|
const userDetailsModal = ref<ModalRef | null>(null)
|
||||||
const editRoleModal = ref<ModalRef | null>(null)
|
const editUserModal = ref<InstanceType<typeof EditUserModal> | null>(null)
|
||||||
const blockUserModal = ref<ModalRef | null>(null)
|
const blockUserModal = ref<ModalRef | null>(null)
|
||||||
const selectedRole = ref<Labrinth.Users.v3.Role | null>(null)
|
|
||||||
const isSavingRole = ref(false)
|
|
||||||
const isBlockingUser = ref(false)
|
const isBlockingUser = ref(false)
|
||||||
const isUnblockingUser = ref(false)
|
const isUnblockingUser = ref(false)
|
||||||
const roleOptions = [
|
|
||||||
{ value: 'developer', label: 'Developer' },
|
|
||||||
{ value: 'moderator', label: 'Moderator' },
|
|
||||||
{ value: 'admin', label: 'Admin' },
|
|
||||||
] satisfies { value: Labrinth.Users.v3.Role; label: string }[]
|
|
||||||
|
|
||||||
watch(
|
|
||||||
user,
|
|
||||||
(currentUser) => {
|
|
||||||
selectedRole.value = currentUser?.role ?? null
|
|
||||||
},
|
|
||||||
{ immediate: true },
|
|
||||||
)
|
|
||||||
|
|
||||||
function openUserDetails(): void {
|
function openUserDetails(): void {
|
||||||
userDetailsModal.value?.show()
|
userDetailsModal.value?.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
function openRoleEditModal(): void {
|
|
||||||
selectedRole.value = user.value?.role ?? null
|
|
||||||
editRoleModal.value?.show()
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleBlockAction(): Promise<void> {
|
async function handleBlockAction(): Promise<void> {
|
||||||
if (!auth.user.value) {
|
if (!auth.user.value) {
|
||||||
await auth.requestSignIn(route.fullPath)
|
await auth.requestSignIn(route.fullPath)
|
||||||
@@ -1148,11 +1073,6 @@ async function unblockCurrentUser(): Promise<void> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function cancelRoleEdit(): void {
|
|
||||||
selectedRole.value = user.value?.role ?? null
|
|
||||||
editRoleModal.value?.hide()
|
|
||||||
}
|
|
||||||
|
|
||||||
async function toggleAffiliate(): Promise<void> {
|
async function toggleAffiliate(): Promise<void> {
|
||||||
if (!user.value) return
|
if (!user.value) return
|
||||||
await userProfile.patchUser(user.value.id, {
|
await userProfile.patchUser(user.value.id, {
|
||||||
@@ -1160,23 +1080,4 @@ async function toggleAffiliate(): Promise<void> {
|
|||||||
})
|
})
|
||||||
await queryClient.invalidateQueries({ queryKey: ['user', props.userId] })
|
await queryClient.invalidateQueries({ queryKey: ['user', props.userId] })
|
||||||
}
|
}
|
||||||
|
|
||||||
async function saveRoleEdit(): Promise<void> {
|
|
||||||
if (!user.value || !selectedRole.value || selectedRole.value === user.value.role) return
|
|
||||||
|
|
||||||
isSavingRole.value = true
|
|
||||||
try {
|
|
||||||
await userProfile.patchUser(user.value.id, { role: selectedRole.value })
|
|
||||||
await queryClient.invalidateQueries({ queryKey: ['user', props.userId] })
|
|
||||||
editRoleModal.value?.hide()
|
|
||||||
} catch {
|
|
||||||
notificationManager.addNotification({
|
|
||||||
type: 'error',
|
|
||||||
title: formatMessage(messages.roleUpdateErrorTitle),
|
|
||||||
text: formatMessage(messages.roleUpdateErrorDescription),
|
|
||||||
})
|
|
||||||
} finally {
|
|
||||||
isSavingRole.value = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -9,8 +9,10 @@ export interface UserProfileContext {
|
|||||||
getCollections: (userId: string) => Promise<Labrinth.Collections.Collection[]>
|
getCollections: (userId: string) => Promise<Labrinth.Collections.Collection[]>
|
||||||
patchUser: (
|
patchUser: (
|
||||||
userId: string,
|
userId: string,
|
||||||
patch: Partial<Pick<Labrinth.Users.v3.User, 'badges' | 'role'>>,
|
patch: Partial<Pick<Labrinth.Users.v3.User, 'badges' | 'bio' | 'role' | 'username'>>,
|
||||||
) => Promise<void>
|
) => Promise<void>
|
||||||
|
changeAvatar: (userId: string, file: Blob, extension: string) => Promise<void>
|
||||||
|
deleteAvatar: (userId: string) => Promise<void>
|
||||||
getBlockedUsers: () => Promise<Labrinth.BlockedUsers.v3.BlockedUserId[]>
|
getBlockedUsers: () => Promise<Labrinth.BlockedUsers.v3.BlockedUserId[]>
|
||||||
blockUser: (userId: string) => Promise<void>
|
blockUser: (userId: string) => Promise<void>
|
||||||
unblockUser: (userId: string) => Promise<void>
|
unblockUser: (userId: string) => Promise<void>
|
||||||
|
|||||||
@@ -2897,9 +2897,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "Projekt erstellen"
|
"defaultMessage": "Projekt erstellen"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "Rolle bearbeiten"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "Nutzerdetails anzeigen"
|
"defaultMessage": "Nutzerdetails anzeigen"
|
||||||
},
|
},
|
||||||
@@ -2981,24 +2978,12 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "{count, plural, one {Projekt} other {Projekte}}"
|
"defaultMessage": "{count, plural, one {Projekt} other {Projekte}}"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "Speichert..."
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "Offizielles Modrinth-Konto"
|
"defaultMessage": "Offizielles Modrinth-Konto"
|
||||||
},
|
},
|
||||||
"profile.official-account.bio": {
|
"profile.official-account.bio": {
|
||||||
"defaultMessage": "Das offizielle Benutzerkonto von Modrinth. Erhalte Hilfe unter <support-link></support-link> oder per E-Mail unter <email></email>"
|
"defaultMessage": "Das offizielle Benutzerkonto von Modrinth. Erhalte Hilfe unter <support-link></support-link> oder per E-Mail unter <email></email>"
|
||||||
},
|
},
|
||||||
"profile.role.select-placeholder": {
|
|
||||||
"defaultMessage": "Eine Rolle auswählen"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-description": {
|
|
||||||
"defaultMessage": "Beim Aktualisieren dieser Nutzerrolle ist ein Fehler aufgetreten. Bitte versuche es erneut."
|
|
||||||
},
|
|
||||||
"profile.role.update-error-title": {
|
|
||||||
"defaultMessage": "Rolle konnte nicht aktualisiert werden"
|
|
||||||
},
|
|
||||||
"profile.unblock-user.error-description": {
|
"profile.unblock-user.error-description": {
|
||||||
"defaultMessage": "Beim Freigeben dieses Nutzers ist ein Fehler aufgetreten. Bitte versuche es erneut."
|
"defaultMessage": "Beim Freigeben dieses Nutzers ist ein Fehler aufgetreten. Bitte versuche es erneut."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2897,9 +2897,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "Projekt erstellen"
|
"defaultMessage": "Projekt erstellen"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "Rolle bearbeiten"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "Nutzerdetails anzeigen"
|
"defaultMessage": "Nutzerdetails anzeigen"
|
||||||
},
|
},
|
||||||
@@ -2981,24 +2978,12 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "{count, plural, one {Projekt} other {Projekte}}"
|
"defaultMessage": "{count, plural, one {Projekt} other {Projekte}}"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "Speichert..."
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "Offizielles Modrinth-Konto"
|
"defaultMessage": "Offizielles Modrinth-Konto"
|
||||||
},
|
},
|
||||||
"profile.official-account.bio": {
|
"profile.official-account.bio": {
|
||||||
"defaultMessage": "Das offizielle Benutzerkonto von Modrinth. Erhalte Hilfe unter <support-link></support-link> oder per E-Mail unter <email></email>"
|
"defaultMessage": "Das offizielle Benutzerkonto von Modrinth. Erhalte Hilfe unter <support-link></support-link> oder per E-Mail unter <email></email>"
|
||||||
},
|
},
|
||||||
"profile.role.select-placeholder": {
|
|
||||||
"defaultMessage": "Eine Rolle auswählen"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-description": {
|
|
||||||
"defaultMessage": "Beim Aktualisieren dieser Nutzerrolle ist ein Fehler aufgetreten. Bitte versuche es erneut."
|
|
||||||
},
|
|
||||||
"profile.role.update-error-title": {
|
|
||||||
"defaultMessage": "Rolle konnte nicht aktualisiert werden"
|
|
||||||
},
|
|
||||||
"profile.unblock-user.error-description": {
|
"profile.unblock-user.error-description": {
|
||||||
"defaultMessage": "Beim Freigeben dieses Nutzers ist ein Fehler aufgetreten. Bitte versuche es erneut."
|
"defaultMessage": "Beim Freigeben dieses Nutzers ist ein Fehler aufgetreten. Bitte versuche es erneut."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2897,9 +2897,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "Create a project"
|
"defaultMessage": "Create a project"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "Edit role"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "View user details"
|
"defaultMessage": "View user details"
|
||||||
},
|
},
|
||||||
@@ -2996,24 +2993,12 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "{count, plural, one {project} other {projects}}"
|
"defaultMessage": "{count, plural, one {project} other {projects}}"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "Saving..."
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "Official Modrinth account"
|
"defaultMessage": "Official Modrinth account"
|
||||||
},
|
},
|
||||||
"profile.official-account.bio": {
|
"profile.official-account.bio": {
|
||||||
"defaultMessage": "The official user account of Modrinth. Get support at <support-link></support-link> or via email at <email></email>"
|
"defaultMessage": "The official user account of Modrinth. Get support at <support-link></support-link> or via email at <email></email>"
|
||||||
},
|
},
|
||||||
"profile.role.select-placeholder": {
|
|
||||||
"defaultMessage": "Select a role"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-description": {
|
|
||||||
"defaultMessage": "An error occurred while updating the user role. Please try again."
|
|
||||||
},
|
|
||||||
"profile.role.update-error-title": {
|
|
||||||
"defaultMessage": "Failed to update role"
|
|
||||||
},
|
|
||||||
"profile.unblock-user.error-description": {
|
"profile.unblock-user.error-description": {
|
||||||
"defaultMessage": "An error occurred while unblocking this user. Please try again."
|
"defaultMessage": "An error occurred while unblocking this user. Please try again."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2897,9 +2897,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "Crear un proyecto"
|
"defaultMessage": "Crear un proyecto"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "Editar rol"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "Ver detalles del usuario"
|
"defaultMessage": "Ver detalles del usuario"
|
||||||
},
|
},
|
||||||
@@ -2996,24 +2993,12 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "{count, plural, one {proyecto} other {proyectos}}"
|
"defaultMessage": "{count, plural, one {proyecto} other {proyectos}}"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "Guardando..."
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "Cuenta oficial de Modrinth"
|
"defaultMessage": "Cuenta oficial de Modrinth"
|
||||||
},
|
},
|
||||||
"profile.official-account.bio": {
|
"profile.official-account.bio": {
|
||||||
"defaultMessage": "La cuenta oficial de Modrinth. Consigue ayuda en <support-link></support-link> o escríbenos a través de email: <email></email>"
|
"defaultMessage": "La cuenta oficial de Modrinth. Consigue ayuda en <support-link></support-link> o escríbenos a través de email: <email></email>"
|
||||||
},
|
},
|
||||||
"profile.role.select-placeholder": {
|
|
||||||
"defaultMessage": "Selecciona un rol"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-description": {
|
|
||||||
"defaultMessage": "Ocurrió un error al actualizar el rol del usuario. Por favor inténtalo otra vez."
|
|
||||||
},
|
|
||||||
"profile.role.update-error-title": {
|
|
||||||
"defaultMessage": "Error al actualizar el rol"
|
|
||||||
},
|
|
||||||
"profile.unblock-user.error-description": {
|
"profile.unblock-user.error-description": {
|
||||||
"defaultMessage": "Ocurrió un error al desbloquear a este usuario. Por favor inténtalo otra vez."
|
"defaultMessage": "Ocurrió un error al desbloquear a este usuario. Por favor inténtalo otra vez."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2891,9 +2891,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "Créer un projet"
|
"defaultMessage": "Créer un projet"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "Modifier le rôle"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "Voir les détails de l'utilisateur"
|
"defaultMessage": "Voir les détails de l'utilisateur"
|
||||||
},
|
},
|
||||||
@@ -2975,24 +2972,12 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "{count, plural,one {projet}other {projets}}"
|
"defaultMessage": "{count, plural,one {projet}other {projets}}"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "Enregistrement..."
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "Compte Modrinth officiel"
|
"defaultMessage": "Compte Modrinth officiel"
|
||||||
},
|
},
|
||||||
"profile.official-account.bio": {
|
"profile.official-account.bio": {
|
||||||
"defaultMessage": "Le compte utilisateur officiel de Modrinth. Obtenez de l’aide via <support-link></support-link> ou par e-mail à <email></email>"
|
"defaultMessage": "Le compte utilisateur officiel de Modrinth. Obtenez de l’aide via <support-link></support-link> ou par e-mail à <email></email>"
|
||||||
},
|
},
|
||||||
"profile.role.select-placeholder": {
|
|
||||||
"defaultMessage": "Sélectionner un rôle"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-description": {
|
|
||||||
"defaultMessage": "Une erreur s'est produite lors de la mise à jour du rôle utilisateur. Veuillez réessayer."
|
|
||||||
},
|
|
||||||
"profile.role.update-error-title": {
|
|
||||||
"defaultMessage": "Impossible de mettre à jour le rôle"
|
|
||||||
},
|
|
||||||
"profile.unblock-user.error-description": {
|
"profile.unblock-user.error-description": {
|
||||||
"defaultMessage": "Une erreur s'est produite pendant le déblocage de cet utilisateur. Veuillez réessayer."
|
"defaultMessage": "Une erreur s'est produite pendant le déblocage de cet utilisateur. Veuillez réessayer."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2534,9 +2534,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "Projekt létrehozása"
|
"defaultMessage": "Projekt létrehozása"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "Szerep szerkesztése"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "Felhasználói adatok megtekintése"
|
"defaultMessage": "Felhasználói adatok megtekintése"
|
||||||
},
|
},
|
||||||
@@ -2609,24 +2606,12 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "projekt"
|
"defaultMessage": "projekt"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "Mentés..."
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "Hivatalos Modrinth-fiók"
|
"defaultMessage": "Hivatalos Modrinth-fiók"
|
||||||
},
|
},
|
||||||
"profile.official-account.bio": {
|
"profile.official-account.bio": {
|
||||||
"defaultMessage": "A Modrinth hivatalos felhasználói fiókja. Támogatás a <support-link></support-link> oldalon kaphatsz vagy e-mailben a <email></email> címen."
|
"defaultMessage": "A Modrinth hivatalos felhasználói fiókja. Támogatás a <support-link></support-link> oldalon kaphatsz vagy e-mailben a <email></email> címen."
|
||||||
},
|
},
|
||||||
"profile.role.select-placeholder": {
|
|
||||||
"defaultMessage": "Válassz egy rangot"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-description": {
|
|
||||||
"defaultMessage": "Hiba történt a felhasználói szerepkör frissítése közben. Kérlek próbáld meg újra."
|
|
||||||
},
|
|
||||||
"profile.role.update-error-title": {
|
|
||||||
"defaultMessage": "A szerepkör frissítése nem sikerült"
|
|
||||||
},
|
|
||||||
"profile.unblock-user.error-description": {
|
"profile.unblock-user.error-description": {
|
||||||
"defaultMessage": "Hiba történt a felhasználó letiltásának feloldása közben. Kérlek próbáld meg újra."
|
"defaultMessage": "Hiba történt a felhasználó letiltásának feloldása közben. Kérlek próbáld meg újra."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2855,9 +2855,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "Crea un progetto"
|
"defaultMessage": "Crea un progetto"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "Modifica ruolo"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "Mostra info utente"
|
"defaultMessage": "Mostra info utente"
|
||||||
},
|
},
|
||||||
@@ -2954,24 +2951,12 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "{count, plural, one {progetto} other {progetti}}"
|
"defaultMessage": "{count, plural, one {progetto} other {progetti}}"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "Salvataggio..."
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "Account Modrinth ufficiale"
|
"defaultMessage": "Account Modrinth ufficiale"
|
||||||
},
|
},
|
||||||
"profile.official-account.bio": {
|
"profile.official-account.bio": {
|
||||||
"defaultMessage": "L'account ufficiale di Modrinth. Ricevi assistenza presso <support-link></support-link> o tramite mail presso <email></email>"
|
"defaultMessage": "L'account ufficiale di Modrinth. Ricevi assistenza presso <support-link></support-link> o tramite mail presso <email></email>"
|
||||||
},
|
},
|
||||||
"profile.role.select-placeholder": {
|
|
||||||
"defaultMessage": "Seleziona il ruolo"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-description": {
|
|
||||||
"defaultMessage": "Sì è verificato un errore nel salvataggio del ruolo utente. Riprova più tardi."
|
|
||||||
},
|
|
||||||
"profile.role.update-error-title": {
|
|
||||||
"defaultMessage": "Impossibile salvare il ruolo"
|
|
||||||
},
|
|
||||||
"profile.unblock-user.error-description": {
|
"profile.unblock-user.error-description": {
|
||||||
"defaultMessage": "Sì è verificato un errore nello sbloccare l'utente. Riprova più tardi."
|
"defaultMessage": "Sì è verificato un errore nello sbloccare l'utente. Riprova più tardi."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2897,9 +2897,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "프로젝트 만들기"
|
"defaultMessage": "프로젝트 만들기"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "역할 수정"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "사용자 상세 정보 보기"
|
"defaultMessage": "사용자 상세 정보 보기"
|
||||||
},
|
},
|
||||||
@@ -2981,24 +2978,12 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "{count, plural, other {프로젝트}}"
|
"defaultMessage": "{count, plural, other {프로젝트}}"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "저장 중..."
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "공식 Modrinth 계정"
|
"defaultMessage": "공식 Modrinth 계정"
|
||||||
},
|
},
|
||||||
"profile.official-account.bio": {
|
"profile.official-account.bio": {
|
||||||
"defaultMessage": "Modrinth의 공식 사용자 계정입니다. <support-link></support-link> 또는 <email></email> 을 통해 문의해 주세요"
|
"defaultMessage": "Modrinth의 공식 사용자 계정입니다. <support-link></support-link> 또는 <email></email> 을 통해 문의해 주세요"
|
||||||
},
|
},
|
||||||
"profile.role.select-placeholder": {
|
|
||||||
"defaultMessage": "역할 선택"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-description": {
|
|
||||||
"defaultMessage": "사용자 역할을 업데이트하는 동안 오류가 발생했습니다. 다시 시도해 주세요."
|
|
||||||
},
|
|
||||||
"profile.role.update-error-title": {
|
|
||||||
"defaultMessage": "역할 업데이트 실패"
|
|
||||||
},
|
|
||||||
"profile.unblock-user.error-description": {
|
"profile.unblock-user.error-description": {
|
||||||
"defaultMessage": "이 사용자의 차단을 해제하는 동안 오류가 발생했습니다. 다시 시도해 주세요."
|
"defaultMessage": "이 사용자의 차단을 해제하는 동안 오류가 발생했습니다. 다시 시도해 주세요."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2858,9 +2858,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "Een project aanmaken"
|
"defaultMessage": "Een project aanmaken"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "Rol bewerken"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "Gebruikersgegevens bekijken"
|
"defaultMessage": "Gebruikersgegevens bekijken"
|
||||||
},
|
},
|
||||||
@@ -2939,9 +2936,6 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "{count, plural, one {project} other {projecten}}"
|
"defaultMessage": "{count, plural, one {project} other {projecten}}"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "Opslaan..."
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "Officieel Modrinth-account"
|
"defaultMessage": "Officieel Modrinth-account"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2885,9 +2885,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "Utwórz projekt"
|
"defaultMessage": "Utwórz projekt"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "Edytuj rolę"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "Otwórz szczegóły użytkownika"
|
"defaultMessage": "Otwórz szczegóły użytkownika"
|
||||||
},
|
},
|
||||||
@@ -2960,24 +2957,12 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "{count, plural, one {projekt} few {projekty} other {projektów}}"
|
"defaultMessage": "{count, plural, one {projekt} few {projekty} other {projektów}}"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "Zapisywanie..."
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "Oficjalne konto Modrinth"
|
"defaultMessage": "Oficjalne konto Modrinth"
|
||||||
},
|
},
|
||||||
"profile.official-account.bio": {
|
"profile.official-account.bio": {
|
||||||
"defaultMessage": "Oficjalne konto Modrinth. Otrzymaj wsparcie na stronie <support-link></support-link> lub poprzez e-mail <email></email>"
|
"defaultMessage": "Oficjalne konto Modrinth. Otrzymaj wsparcie na stronie <support-link></support-link> lub poprzez e-mail <email></email>"
|
||||||
},
|
},
|
||||||
"profile.role.select-placeholder": {
|
|
||||||
"defaultMessage": "Wybierz rolę"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-description": {
|
|
||||||
"defaultMessage": "Wystąpił błąd podczas ustawiania roli tego użytkownika. Spróbuj ponownie później."
|
|
||||||
},
|
|
||||||
"profile.role.update-error-title": {
|
|
||||||
"defaultMessage": "Nie udało się zaktualizować roli"
|
|
||||||
},
|
|
||||||
"profile.unblock-user.error-description": {
|
"profile.unblock-user.error-description": {
|
||||||
"defaultMessage": "Wystąpił błąd podczas odblokowywania tego użytkownika. Spróbuj ponownie później."
|
"defaultMessage": "Wystąpił błąd podczas odblokowywania tego użytkownika. Spróbuj ponownie później."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2897,9 +2897,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "Criar projeto"
|
"defaultMessage": "Criar projeto"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "Editar cargo"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "Ver detalhes do usuário"
|
"defaultMessage": "Ver detalhes do usuário"
|
||||||
},
|
},
|
||||||
@@ -2996,24 +2993,12 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "{count, plural, one {projeto} other {projetos}}"
|
"defaultMessage": "{count, plural, one {projeto} other {projetos}}"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "Salvando..."
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "Conta oficial do Modrinth"
|
"defaultMessage": "Conta oficial do Modrinth"
|
||||||
},
|
},
|
||||||
"profile.official-account.bio": {
|
"profile.official-account.bio": {
|
||||||
"defaultMessage": "Conta oficial do Modrinth. Obtenha suporte em<support-link></support-link> ou por e-mail via <email></email>"
|
"defaultMessage": "Conta oficial do Modrinth. Obtenha suporte em<support-link></support-link> ou por e-mail via <email></email>"
|
||||||
},
|
},
|
||||||
"profile.role.select-placeholder": {
|
|
||||||
"defaultMessage": "Selecione um cargo"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-description": {
|
|
||||||
"defaultMessage": "Ocorreu um erro ao atualizar o cargo do usuário. Tente novamente."
|
|
||||||
},
|
|
||||||
"profile.role.update-error-title": {
|
|
||||||
"defaultMessage": "Falha ao atualizar cargo"
|
|
||||||
},
|
|
||||||
"profile.unblock-user.error-description": {
|
"profile.unblock-user.error-description": {
|
||||||
"defaultMessage": "Ocorreu um erro ao desbloquear este usuário. Tente novamente."
|
"defaultMessage": "Ocorreu um erro ao desbloquear este usuário. Tente novamente."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2810,9 +2810,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "Создать проект"
|
"defaultMessage": "Создать проект"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "Настройка роли"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "Посмотреть подробности"
|
"defaultMessage": "Посмотреть подробности"
|
||||||
},
|
},
|
||||||
@@ -2909,24 +2906,12 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "{count, plural, one {проект} few {проекта} other {проектов}}"
|
"defaultMessage": "{count, plural, one {проект} few {проекта} other {проектов}}"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "Сохранение..."
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "Официальный аккаунт Modrinth"
|
"defaultMessage": "Официальный аккаунт Modrinth"
|
||||||
},
|
},
|
||||||
"profile.official-account.bio": {
|
"profile.official-account.bio": {
|
||||||
"defaultMessage": "Официальный аккаунт Modrinth. Связь с поддержкой: <support-link></support-link> или по почте <email></email>"
|
"defaultMessage": "Официальный аккаунт Modrinth. Связь с поддержкой: <support-link></support-link> или по почте <email></email>"
|
||||||
},
|
},
|
||||||
"profile.role.select-placeholder": {
|
|
||||||
"defaultMessage": "Выберите роль"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-description": {
|
|
||||||
"defaultMessage": "Произошла ошибка при обновлении роли. Попробуйте снова."
|
|
||||||
},
|
|
||||||
"profile.role.update-error-title": {
|
|
||||||
"defaultMessage": "Не удалось обновить роль"
|
|
||||||
},
|
|
||||||
"profile.unblock-user.error-description": {
|
"profile.unblock-user.error-description": {
|
||||||
"defaultMessage": "Произошла ошибка при разблокировке пользователя. Попробуйте снова."
|
"defaultMessage": "Произошла ошибка при разблокировке пользователя. Попробуйте снова."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2558,9 +2558,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "Skapa ett projekt"
|
"defaultMessage": "Skapa ett projekt"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "Ändra roll"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "Visa användardetaljer"
|
"defaultMessage": "Visa användardetaljer"
|
||||||
},
|
},
|
||||||
@@ -2627,21 +2624,9 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "Projekt"
|
"defaultMessage": "Projekt"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "Sparar..."
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "Officiellt Modrinth-konto"
|
"defaultMessage": "Officiellt Modrinth-konto"
|
||||||
},
|
},
|
||||||
"profile.role.select-placeholder": {
|
|
||||||
"defaultMessage": "Välj en roll"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-description": {
|
|
||||||
"defaultMessage": "Ett fel inträffade medan användarrollen uppdaterades. Vänligen försök igen."
|
|
||||||
},
|
|
||||||
"profile.role.update-error-title": {
|
|
||||||
"defaultMessage": "Misslyckades att uppdatera rollen"
|
|
||||||
},
|
|
||||||
"profile.unblock-user.error-description": {
|
"profile.unblock-user.error-description": {
|
||||||
"defaultMessage": "Ett fel inträffade under avblockeringen av den här användaren. Vänligen försök igen."
|
"defaultMessage": "Ett fel inträffade under avblockeringen av den här användaren. Vänligen försök igen."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2852,9 +2852,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "Створити проєкт"
|
"defaultMessage": "Створити проєкт"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "Зміна ролі"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "Деталі про користувача"
|
"defaultMessage": "Деталі про користувача"
|
||||||
},
|
},
|
||||||
@@ -2945,24 +2942,12 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "{count, plural, one {проєкт} few {проєкти} many {проєктів} other {проєктів}}"
|
"defaultMessage": "{count, plural, one {проєкт} few {проєкти} many {проєктів} other {проєктів}}"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "Збереження..."
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "Офіційний обліковий запис Modrinth"
|
"defaultMessage": "Офіційний обліковий запис Modrinth"
|
||||||
},
|
},
|
||||||
"profile.official-account.bio": {
|
"profile.official-account.bio": {
|
||||||
"defaultMessage": "Офіційний обліковий запис Modrinth. Зв'язатися з підтримкою можна за <support-link></support-link> або через електронну пошту за <email></email>"
|
"defaultMessage": "Офіційний обліковий запис Modrinth. Зв'язатися з підтримкою можна за <support-link></support-link> або через електронну пошту за <email></email>"
|
||||||
},
|
},
|
||||||
"profile.role.select-placeholder": {
|
|
||||||
"defaultMessage": "Виберіть роль"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-description": {
|
|
||||||
"defaultMessage": "Виникла помилка під час оновлення ролі користувача. Спробуйте знову."
|
|
||||||
},
|
|
||||||
"profile.role.update-error-title": {
|
|
||||||
"defaultMessage": "Не вдалося оновити роль"
|
|
||||||
},
|
|
||||||
"profile.unblock-user.error-description": {
|
"profile.unblock-user.error-description": {
|
||||||
"defaultMessage": "Виникла помилка під час розблокування користувача. Спробуйте знову."
|
"defaultMessage": "Виникла помилка під час розблокування користувача. Спробуйте знову."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2897,9 +2897,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "创建项目"
|
"defaultMessage": "创建项目"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "编辑角色"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "查看用户详情"
|
"defaultMessage": "查看用户详情"
|
||||||
},
|
},
|
||||||
@@ -2996,24 +2993,12 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "{count, plural, other {项目}}"
|
"defaultMessage": "{count, plural, other {项目}}"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "正在保存……"
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "官方 Modrinth 账户"
|
"defaultMessage": "官方 Modrinth 账户"
|
||||||
},
|
},
|
||||||
"profile.official-account.bio": {
|
"profile.official-account.bio": {
|
||||||
"defaultMessage": "Modrinth 的官方用户账号。可通过 <support-link></support-link> 或电子邮件 <email></email> 获取支持"
|
"defaultMessage": "Modrinth 的官方用户账号。可通过 <support-link></support-link> 或电子邮件 <email></email> 获取支持"
|
||||||
},
|
},
|
||||||
"profile.role.select-placeholder": {
|
|
||||||
"defaultMessage": "选择角色"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-description": {
|
|
||||||
"defaultMessage": "更新用户角色时发生了错误。请重试。"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-title": {
|
|
||||||
"defaultMessage": "更新角色失败"
|
|
||||||
},
|
|
||||||
"profile.unblock-user.error-description": {
|
"profile.unblock-user.error-description": {
|
||||||
"defaultMessage": "解除屏蔽该用户时发生了错误。请重试。"
|
"defaultMessage": "解除屏蔽该用户时发生了错误。请重试。"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2897,9 +2897,6 @@
|
|||||||
"profile.button.create-project": {
|
"profile.button.create-project": {
|
||||||
"defaultMessage": "建立專案"
|
"defaultMessage": "建立專案"
|
||||||
},
|
},
|
||||||
"profile.button.edit-role": {
|
|
||||||
"defaultMessage": "編輯身分"
|
|
||||||
},
|
|
||||||
"profile.button.info": {
|
"profile.button.info": {
|
||||||
"defaultMessage": "檢視使用者詳細資訊"
|
"defaultMessage": "檢視使用者詳細資訊"
|
||||||
},
|
},
|
||||||
@@ -2996,24 +2993,12 @@
|
|||||||
"profile.label.project-count": {
|
"profile.label.project-count": {
|
||||||
"defaultMessage": "{count, plural, other {個專案}}"
|
"defaultMessage": "{count, plural, other {個專案}}"
|
||||||
},
|
},
|
||||||
"profile.label.saving": {
|
|
||||||
"defaultMessage": "正在儲存..."
|
|
||||||
},
|
|
||||||
"profile.official-account": {
|
"profile.official-account": {
|
||||||
"defaultMessage": "Modrinth 官方帳號"
|
"defaultMessage": "Modrinth 官方帳號"
|
||||||
},
|
},
|
||||||
"profile.official-account.bio": {
|
"profile.official-account.bio": {
|
||||||
"defaultMessage": "Modrinth 的官方使用者帳號。請至 <support-link></support-link> 取得支援,或透過電子郵件 <email></email> 聯絡客服團隊"
|
"defaultMessage": "Modrinth 的官方使用者帳號。請至 <support-link></support-link> 取得支援,或透過電子郵件 <email></email> 聯絡客服團隊"
|
||||||
},
|
},
|
||||||
"profile.role.select-placeholder": {
|
|
||||||
"defaultMessage": "選擇身分"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-description": {
|
|
||||||
"defaultMessage": "更新使用者身分時發生錯誤,請再試一次。"
|
|
||||||
},
|
|
||||||
"profile.role.update-error-title": {
|
|
||||||
"defaultMessage": "無法更新身分"
|
|
||||||
},
|
|
||||||
"profile.unblock-user.error-description": {
|
"profile.unblock-user.error-description": {
|
||||||
"defaultMessage": "解除封鎖使用者時發生錯誤,請再試一次。"
|
"defaultMessage": "解除封鎖使用者時發生錯誤,請再試一次。"
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user