fix: renamed & added role with filter

This commit is contained in:
Shariq Ansari 2025-06-17 12:04:44 +05:30
parent 463d60b650
commit 6d3e4406ae
4 changed files with 81 additions and 23 deletions

View File

@ -23,13 +23,16 @@ def get_users():
if frappe.session.user == user.name: if frappe.session.user == user.name:
user.session_user = True user.session_user = True
user.is_manager = "Sales Manager" in frappe.get_roles(user.name) or user.name == "Administrator" user.is_manager = "Sales Manager" in frappe.get_roles(user.name)
user.is_admin = user.name == "Administrator"
user.roles = frappe.get_roles(user.name) user.roles = frappe.get_roles(user.name)
user.role = "" user.role = ""
if "Sales Manager" in user.roles: if "System Manager" in user.roles:
user.role = "System Manager"
elif "Sales Manager" in user.roles:
user.role = "Sales Manager" user.role = "Sales Manager"
elif "Sales User" in user.roles: elif "Sales User" in user.roles:
user.role = "Sales User" user.role = "Sales User"

View File

@ -29,19 +29,21 @@ def update_agent_role(user, new_role):
:param new_role: The new role to assign (Sales Manager or Sales User) :param new_role: The new role to assign (Sales Manager or Sales User)
""" """
frappe.only_for("Sales Manager") frappe.only_for(["System Manager", "System Manager"])
if new_role not in ["Sales Manager", "Sales User"]: if new_role not in ["System Manager", "Sales Manager", "Sales User"]:
frappe.throw("Cannot assign this role") frappe.throw("Cannot assign this role")
user_doc = frappe.get_doc("User", user) user_doc = frappe.get_doc("User", user)
if new_role == "System Manager":
user_doc.append_roles("System Manager")
if new_role == "Sales Manager": if new_role == "Sales Manager":
user_doc.append_roles("Sales Manager", "System Manager") user_doc.append_roles("Sales Manager")
user_doc.remove_roles("System Manager")
if new_role == "Sales User": if new_role == "Sales User":
user_doc.append_roles("Sales User") user_doc.append_roles("Sales User")
if "Sales Manager" in frappe.get_roles(user_doc.name): user_doc.remove_roles("Sales Manager", "System Manager")
user_doc.remove_roles("Sales Manager", "System Manager")
user_doc.save() user_doc.save()

@ -1 +1 @@
Subproject commit 8b615c0e899d75b99c7d36ec6df97b5d0386b2ca Subproject commit 883bb643d1e662d6467925927e347dd28376960f

View File

@ -5,7 +5,7 @@
<h2 class="flex gap-2 text-xl font-semibold leading-none h-5"> <h2 class="flex gap-2 text-xl font-semibold leading-none h-5">
{{ __('Users') }} {{ __('Users') }}
</h2> </h2>
<div class="flex item-center space-x-2 mr-2"> <div class="flex item-center space-x-2">
<FormControl <FormControl
v-model="search" v-model="search"
:placeholder="'Search'" :placeholder="'Search'"
@ -16,6 +16,23 @@
<LucideSearch class="h-4 w-4 text-ink-gray-4" /> <LucideSearch class="h-4 w-4 text-ink-gray-4" />
</template> </template>
</FormControl> </FormControl>
<FormControl
type="select"
:value="currentStatus"
:options="[
{ label: __('All'), value: 'All' },
{ label: __('Active'), value: 'Active' },
{ label: __('Inactive'), value: 'Inactive' },
]"
@change="(e) => changeStatus(e.target.value)"
>
</FormControl>
<Button
:label="__('Add User')"
icon-left="plus"
variant="solid"
@click="$emit('add-agent')"
/>
</div> </div>
</div> </div>
@ -43,7 +60,7 @@
class="divide-y overflow-auto" class="divide-y overflow-auto"
> >
<li <li
class="flex items-center justify-between p-2" class="flex items-center justify-between py-2"
v-for="agent in agents.data" v-for="agent in agents.data"
:key="agent.name" :key="agent.name"
> >
@ -65,12 +82,11 @@
</div> </div>
</div> </div>
</div> </div>
<div class="flex gap-1 items-center flex-row-reverse"> <div class="flex gap-2 items-center flex-row-reverse">
<Dropdown <Dropdown
:options="getMoreOptions(agent)" :options="getMoreOptions(agent)"
:button="{ :button="{
icon: 'more-horizontal', icon: 'more-horizontal',
variant: 'ghost',
}" }"
placement="right" placement="right"
/> />
@ -79,16 +95,17 @@
:button="{ :button="{
label: roleMap[getUserRole(agent.name)], label: roleMap[getUserRole(agent.name)],
iconRight: 'chevron-down', iconRight: 'chevron-down',
variant: 'ghost',
}" }"
placement="right" placement="right"
/> />
</div> </div>
</li> </li>
<!-- Load More Button --> <!-- Load More Button -->
<div class="flex justify-center"> <div
v-if="!agents.loading && agents.hasNextPage"
class="flex justify-center"
>
<Button <Button
v-if="!agents.loading && agents.hasNextPage"
class="mt-3.5 p-2" class="mt-3.5 p-2"
@click="() => agents.next()" @click="() => agents.next()"
:loading="agents.loading" :loading="agents.loading"
@ -111,7 +128,7 @@ import {
toast, toast,
call, call,
} from 'frappe-ui' } from 'frappe-ui'
import { ref, h, watch } from 'vue' import { ref, h, watch, onMounted } from 'vue'
const { users, getUserRole } = usersStore() const { users, getUserRole } = usersStore()
@ -119,6 +136,7 @@ const agents = createListResource({
doctype: 'CRM Agent', doctype: 'CRM Agent',
cache: 'CRM Agents', cache: 'CRM Agents',
fields: ['name', 'image', 'is_active', 'agent_name'], fields: ['name', 'image', 'is_active', 'agent_name'],
filters: { is_active: ['=', 1] },
auto: true, auto: true,
start: 0, start: 0,
pageLength: 20, pageLength: 20,
@ -126,8 +144,9 @@ const agents = createListResource({
}) })
const roleMap = { const roleMap = {
'Sales Manager': __('Manager Access'), 'System Manager': __('Admin'),
'Sales User': __('Regular Access'), 'Sales Manager': __('Manager'),
'Sales User': __('Sales User'),
} }
function getMoreOptions(agent) { function getMoreOptions(agent) {
@ -153,20 +172,30 @@ function getDropdownOptions(agent) {
const agentRole = getUserRole(agent.name) const agentRole = getUserRole(agent.name)
return [ return [
{ {
label: __('Manager Access'), label: __('Admin'),
component: (props) => component: (props) =>
RoleOption({ RoleOption({
role: __('Manager Access'), role: __('Admin'),
active: props.active,
selected: agentRole === 'System Manager',
onClick: () => updateRole(agent, 'System Manager'),
}),
},
{
label: __('Manager'),
component: (props) =>
RoleOption({
role: __('Manager'),
active: props.active, active: props.active,
selected: agentRole === 'Sales Manager', selected: agentRole === 'Sales Manager',
onClick: () => updateRole(agent, 'Sales Manager'), onClick: () => updateRole(agent, 'Sales Manager'),
}), }),
}, },
{ {
label: __('Regular Access'), label: __('Sales User'),
component: (props) => component: (props) =>
RoleOption({ RoleOption({
role: __('Regular Access'), role: __('Sales User'),
active: props.active, active: props.active,
selected: agentRole === 'Sales User', selected: agentRole === 'Sales User',
onClick: () => updateRole(agent, 'Sales User'), onClick: () => updateRole(agent, 'Sales User'),
@ -206,7 +235,10 @@ function updateRole(agent, newRole) {
new_role: newRole, new_role: newRole,
}).then(() => { }).then(() => {
toast.success( toast.success(
__('{0} has been granted {1}', [agent.agent_name, roleMap[newRole]]), __('{0} has been granted {1} access', [
agent.agent_name,
roleMap[newRole],
]),
) )
users.reload() users.reload()
agents.reload() agents.reload()
@ -231,6 +263,27 @@ function updateStatus(agent, status) {
}) })
} }
const currentStatus = ref('Active')
function changeStatus(status) {
currentStatus.value = status
updateFilters()
}
function updateFilters() {
const status = currentStatus.value || 'Active'
agents.filters = {}
if (status === 'Active') {
agents.filters.is_active = ['=', 1]
} else if (status === 'Inactive') {
agents.filters.is_active = ['=', 0]
}
agents.reload()
}
onMounted(() => updateFilters())
const search = ref('') const search = ref('')
watch(search, (newValue) => { watch(search, (newValue) => {
agents.filters = { agents.filters = {