fix: issue with roles on profile page

This commit is contained in:
Jannat Patel
2025-07-03 19:26:07 +05:30
parent 954d0a0637
commit ed0e2e4bb5
5 changed files with 37 additions and 15 deletions

View File

@@ -15,7 +15,11 @@
:placeholder="__('Search')" :placeholder="__('Search')"
type="text" type="text"
:debounce="300" :debounce="300"
/> >
<template #prefix>
<Search class="size-4 stroke-1.5 text-ink-gray-6" />
</template>
</FormControl>
<Button @click="() => (showForm = !showForm)"> <Button @click="() => (showForm = !showForm)">
<template #prefix> <template #prefix>
<Plus class="size-4 stroke-1.5" /> <Plus class="size-4 stroke-1.5" />
@@ -25,7 +29,7 @@
</div> </div>
</div> </div>
<div class="mt-2 pb-10 overflow-auto"> <div class="mt-5 pb-10 overflow-auto">
<!-- Member list --> <!-- Member list -->
<div class="overflow-y-scroll"> <div class="overflow-y-scroll">
<ul class="divide-y"> <ul class="divide-y">
@@ -58,7 +62,7 @@
v-if="member.role && member.role !== 'LMS Student'" v-if="member.role && member.role !== 'LMS Student'"
> >
<Shield class="size-4 stroke-1.5" /> <Shield class="size-4 stroke-1.5" />
<span> <span class="text-sm">
{{ getRole(member.role) }} {{ getRole(member.role) }}
</span> </span>
</div> </div>
@@ -123,7 +127,7 @@ import {
} from 'frappe-ui' } from 'frappe-ui'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { ref, watch, reactive, inject } from 'vue' import { ref, watch, reactive, inject } from 'vue'
import { RefreshCw, Plus, X, Shield } from 'lucide-vue-next' import { RefreshCw, Plus, Search, Shield } from 'lucide-vue-next'
import { useOnboarding } from 'frappe-ui/frappe' import { useOnboarding } from 'frappe-ui/frappe'
import type { User } from '@/components/Settings/types' import type { User } from '@/components/Settings/types'

View File

@@ -80,7 +80,7 @@
v-model="activeTab" v-model="activeTab"
/> />
</div> </div>
<router-view :profile="profile" /> <router-view :profile="profile" :key="profile.data?.name" />
</div> </div>
</div> </div>
<EditProfile <EditProfile

View File

@@ -45,7 +45,7 @@
</template> </template>
<script setup> <script setup>
import { FormControl, createResource, toast } from 'frappe-ui' import { FormControl, createResource, toast } from 'frappe-ui'
import { ref } from 'vue' import { ref, watch } from 'vue'
import { convertToTitleCase } from '@/utils' import { convertToTitleCase } from '@/utils'
import { CircleAlert } from 'lucide-vue-next' import { CircleAlert } from 'lucide-vue-next'
@@ -66,10 +66,9 @@ const roles = createResource({
url: 'lms.lms.utils.get_roles', url: 'lms.lms.utils.get_roles',
makeParams(values) { makeParams(values) {
return { return {
name: props.profile.data?.name, name: values.member,
} }
}, },
auto: true,
onSuccess(data) { onSuccess(data) {
let roles = [ let roles = [
'moderator', 'moderator',
@@ -83,6 +82,16 @@ const roles = createResource({
}, },
}) })
watch(
() => props.profile,
(newValue) => {
roles.reload({
member: newValue.data?.name,
})
},
{ immediate: true }
)
const updateRole = createResource({ const updateRole = createResource({
url: 'lms.lms.api.save_role', url: 'lms.lms.api.save_role',
makeParams(values) { makeParams(values) {
@@ -97,7 +106,10 @@ const updateRole = createResource({
const changeRole = (role) => { const changeRole = (role) => {
updateRole.submit( updateRole.submit(
{ {
role: convertToTitleCase(role.split('_').join(' ')), role:
role == 'lms_student'
? 'LMS Student'
: convertToTitleCase(role.split('_').join(' ')),
value: eval(role).value, value: eval(role).value,
}, },
{ {

View File

@@ -714,7 +714,14 @@ def get_members(start=0, search=""):
) )
for member in members: for member in members:
roles = frappe.get_roles(member.name) roles = frappe.get_all(
"Has Role",
{
"parent": member.name,
"parenttype": "User",
},
pluck="role",
)
if "Moderator" in roles: if "Moderator" in roles:
member.role = "Moderator" member.role = "Moderator"
elif "Course Creator" in roles: elif "Course Creator" in roles:

View File

@@ -537,11 +537,10 @@ def has_course_evaluator_role(member=None):
def has_student_role(member=None): def has_student_role(member=None):
roles = frappe.get_roles(member or frappe.session.user) return frappe.db.get_value(
return ( "Has Role",
"Moderator" not in roles {"parent": member or frappe.session.user, "role": "LMS Student"},
and "Course Creator" not in roles "name",
and "Batch Evaluator" not in roles
) )