diff --git a/src/modules/data/room/roomMembers/RoomMembers.store.ts b/src/modules/data/room/roomMembers/RoomMembers.store.ts index 835868998a..a14cfc3ac5 100644 --- a/src/modules/data/room/roomMembers/RoomMembers.store.ts +++ b/src/modules/data/room/roomMembers/RoomMembers.store.ts @@ -389,6 +389,7 @@ export const useRoomMembersStore = defineStore("roomMembersStore", () => { addMembers, isRoomOwner, changeRoomOwner, + currentUserId, confirmInvitations, fetchMembers, resetPotentialMembers, diff --git a/src/modules/feature/room/manageRoom/tables/RoomAdminMembersTable.vue b/src/modules/feature/room/manageRoom/tables/RoomAdminMembersTable.vue index 357415aee4..da35a3b1b7 100644 --- a/src/modules/feature/room/manageRoom/tables/RoomAdminMembersTable.vue +++ b/src/modules/feature/room/manageRoom/tables/RoomAdminMembersTable.vue @@ -78,7 +78,7 @@ withDefaults(defineProps(), { const { t } = useI18n(); const roomMembersStore = useRoomMembersStore(); -const { roomMembersWithoutApplicants, roomMembersForAdmins, selectedIds, baseTableHeaders } = +const { currentUserId, roomMembersWithoutApplicants, roomMembersForAdmins, selectedIds, baseTableHeaders } = storeToRefs(roomMembersStore); const { isRoomOwner, removeMembers, fetchMembers } = roomMembersStore; const { askConfirmation } = useConfirmationDialog(); @@ -150,11 +150,30 @@ const belongsToOwnSchool = (userId: string) => { const membersByIds = (ids: string[]) => roomMembersWithoutApplicants.value.filter((member) => ids.includes(member.userId)); +// If the current user (as an admin) is the room owner, they can change the role of any member except themselves, other room owners, and students +const canRoomOwnerAsAdminChangeRole = (item: RoomMember) => { + if (!currentUserId.value) return false; + + return isRoomOwner(currentUserId?.value) && !isRoomOwner(item.userId) && !checkIsStudent(item); +}; + +// If the current user (as an admin) is the room owner, they can remove any member except themselves and other room owners +const canRoomOwnerAsAdminRemoveMember = (item: RoomMember) => { + if (!currentUserId.value) return false; + + return isRoomOwner(currentUserId.value) && !isRoomOwner(item.userId); +}; + const canChangeRole = (item: RoomMember | string[]) => { if (Array.isArray(item)) { const members = membersByIds(item); return members.every(canChangeRole); } + + if (canRoomOwnerAsAdminChangeRole(item)) { + return true; + } + return isOwnSchool.value && !checkIsStudent(item) && !isRoomOwner(item.userId) && belongsToOwnSchool(item.userId); }; @@ -163,6 +182,11 @@ const canRemoveMember = (item: RoomMember | string[]) => { const members = membersByIds(item); return members.every(canRemoveMember); } + + if (canRoomOwnerAsAdminRemoveMember(item)) { + return true; + } + return !isRoomOwner(item.userId) && belongsToOwnSchool(item.userId); };