Polish team role and login UI

This commit is contained in:
AzuTear
2026-06-25 20:14:47 +02:00
parent 3bf8b00a83
commit b7804e10ea
4 changed files with 18 additions and 4 deletions
+10
View File
@@ -105,6 +105,11 @@ public static class AdminTeamEndpoints
return validationError; return validationError;
} }
if (normalizedRole == AdminRoles.Creator)
{
return Results.Json(new { message = "Creator-Konten werden fest vorkonfiguriert und können nicht manuell angelegt werden." }, statusCode: StatusCodes.Status403Forbidden);
}
if (AdminRoles.IsPrivilegedFullControlRole(normalizedRole) && !AdminRoles.CanResetTeamPasswords(session.Role)) if (AdminRoles.IsPrivilegedFullControlRole(normalizedRole) && !AdminRoles.CanResetTeamPasswords(session.Role))
{ {
return Results.Json(new { message = "Owner- und Creator-Konten können nur von Owner oder Creator angelegt werden." }, statusCode: StatusCodes.Status403Forbidden); return Results.Json(new { message = "Owner- und Creator-Konten können nur von Owner oder Creator angelegt werden." }, statusCode: StatusCodes.Status403Forbidden);
@@ -185,6 +190,11 @@ public static class AdminTeamEndpoints
return Results.Conflict(new { message = "Dieser Login existiert bereits." }); return Results.Conflict(new { message = "Dieser Login existiert bereits." });
} }
if (normalizedRole == AdminRoles.Creator && member.Role != AdminRoles.Creator)
{
return Results.Json(new { message = "Creator-Konten werden fest vorkonfiguriert und können nicht manuell zugewiesen werden." }, statusCode: StatusCodes.Status403Forbidden);
}
if ((AdminRoles.IsPrivilegedFullControlRole(member.Role) || AdminRoles.IsPrivilegedFullControlRole(normalizedRole)) && !AdminRoles.CanResetTeamPasswords(session.Role)) if ((AdminRoles.IsPrivilegedFullControlRole(member.Role) || AdminRoles.IsPrivilegedFullControlRole(normalizedRole)) && !AdminRoles.CanResetTeamPasswords(session.Role))
{ {
return Results.Json(new { message = "Owner- und Creator-Konten können nur von Owner oder Creator bearbeitet werden." }, statusCode: StatusCodes.Status403Forbidden); return Results.Json(new { message = "Owner- und Creator-Konten können nur von Owner oder Creator bearbeitet werden." }, statusCode: StatusCodes.Status403Forbidden);
@@ -38,6 +38,9 @@ export function useAdminTeamManager() {
const pendingPasswordChanges = computed(() => members.value.filter((member) => member.mustChangePassword).length) const pendingPasswordChanges = computed(() => members.value.filter((member) => member.mustChangePassword).length)
const roleOptions = computed(() => roles.value.map((role) => ({ value: role.key, label: role.label }))) const roleOptions = computed(() => roles.value.map((role) => ({ value: role.key, label: role.label })))
const selectedMember = computed(() => members.value.find((member) => member.id === editingMemberId.value) ?? null) const selectedMember = computed(() => members.value.find((member) => member.id === editingMemberId.value) ?? null)
const assignableRoleOptions = computed(() => roleOptions.value.filter((role) =>
role.value !== 'creator' || selectedMember.value?.role === 'creator',
))
const hasRoleChanges = computed(() => const hasRoleChanges = computed(() =>
Boolean(savedRoleSnapshot.value) && JSON.stringify(rolePermissionDrafts.value) !== savedRoleSnapshot.value, Boolean(savedRoleSnapshot.value) && JSON.stringify(rolePermissionDrafts.value) !== savedRoleSnapshot.value,
) )
@@ -260,6 +263,7 @@ export function useAdminTeamManager() {
activeMembers, activeMembers,
pendingPasswordChanges, pendingPasswordChanges,
roleOptions, roleOptions,
assignableRoleOptions,
hasRoleChanges, hasRoleChanges,
loadTeam, loadTeam,
startCreateMember, startCreateMember,
+1 -1
View File
@@ -11,7 +11,7 @@ const route = useRoute()
const router = useRouter() const router = useRouter()
const form = reactive({ const form = reactive({
login: 'jayuhime_admin', login: '',
password: '', password: '',
}) })
+3 -3
View File
@@ -41,7 +41,7 @@ const {
selectedMember, selectedMember,
activeMembers, activeMembers,
pendingPasswordChanges, pendingPasswordChanges,
roleOptions, assignableRoleOptions,
hasRoleChanges, hasRoleChanges,
startCreateMember, startCreateMember,
startEditMember, startEditMember,
@@ -343,7 +343,7 @@ async function changeOwnPassword() {
</div> </div>
<Button type="button" :disabled="saving || !hasRoleChanges" @click="saveRolePermissions"> <Button type="button" :disabled="saving || !hasRoleChanges" @click="saveRolePermissions">
<Save class="mr-2 h-4 w-4" /> <Save class="mr-2 h-4 w-4" />
Speicherbutton Speichern
</Button> </Button>
</div> </div>
@@ -433,7 +433,7 @@ async function changeOwnPassword() {
v-model="memberForm.role" v-model="memberForm.role"
class="h-12 rounded-2xl border border-violet-100 bg-white px-4 text-base font-bold text-slate-900 outline-none transition focus:border-violet-300 focus:ring-4 focus:ring-violet-100" class="h-12 rounded-2xl border border-violet-100 bg-white px-4 text-base font-bold text-slate-900 outline-none transition focus:border-violet-300 focus:ring-4 focus:ring-violet-100"
> >
<option v-for="role in roleOptions" :key="role.value" :value="role.value"> <option v-for="role in assignableRoleOptions" :key="role.value" :value="role.value">
{{ role.label }} {{ role.label }}
</option> </option>
</select> </select>