feat(templates/users): adopt role objects for branding and selection

Replace role name comparisons with slug checks and display role.name to support dynamic role definitions.
This commit is contained in:
sankalp committed 2026-06-29 06:56:55 +05:45
1 parent 128866bda2
commit b7d43b57f4
3 files changed
+13 -15

No files matched your search

+2 -3
View File
@@ -39,10 +39,9 @@
<p class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">Role</p>
<p class="mt-1">
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium
{% if role == 'superadmin' %}bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400
{% elif role == 'manager' %}bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400
{% if role.slug in admin_roles %}bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400
{% else %}bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400{% endif %}">
{% for r, label in roles_label.items %}{% if r == role %}{{ label }}{% endif %}{% endfor %}
{{ role.name|default:"Unassigned" }}
</span>
</p>
</div>
+2 -2
View File
@@ -96,8 +96,8 @@
<label class="block text-sm font-semibold text-gray-900 dark:text-gray-100 mb-1.5">Roles</label>
{% if can_change_role %}
<select name="role" class="w-full rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-950 px-3 py-2 text-sm focus:border-blue-500 focus:ring-1 focus:ring-blue-500 outline-none transition-colors">
{% for r, label in roles_label.items %}
<option value="{{ r }}" {% if editing and current_role == r or not editing and r == 'backend_developer' %}selected{% endif %}>{{ label }}</option>
{% for role in roles %}
<option value="{{ role.slug }}" {% if editing and current_role == role or not editing and role.slug == 'backend_developer' %}selected{% endif %}>{{ role.name }}</option>
{% endfor %}
</select>
{% else %}
+9 -10
View File
@@ -17,7 +17,7 @@
<p class="text-gray-500 dark:text-gray-400 text-sm mt-1">{{ page_obj.paginator.count }} active users</p>
</div>
<div class="flex items-center gap-2">
<button type="button" @click="editUser = { username: '', email: '', first_name: '', last_name: '', role: 'backend_developer', is_active: true }; userModalMode = 'create'; editModal = true" class="dk-btn dk-btn-primary text-sm"><i class="fas fa-plus"></i> New User</button>
<button type="button" @click="editUser = { username: '', email: '', first_name: '', last_name: '', role: '', is_active: true }; userModalMode = 'create'; editModal = true" class="dk-btn dk-btn-primary text-sm"><i class="fas fa-plus"></i> New User</button>
<form class="flex gap-2" method="get">
<input type="text" name="search" value="{{ search }}" placeholder="Search by name or email..."
class="text-sm border border-gray-200 dark:border-gray-600 rounded-lg px-3 py-2 bg-white dark:bg-gray-950 focus:outline-none focus:ring-2 focus:ring-blue-500 w-64">
@@ -64,8 +64,8 @@
</label>
<select name="role" onchange="this.form.submit()" class="text-xs border border-gray-200 dark:border-gray-600 rounded-lg px-2 py-1.5 bg-white dark:bg-gray-950 text-gray-700 dark:text-gray-300">
<option value="">All roles</option>
{% for r, label in roles_label.items %}
<option value="{{ r }}" {% if role == r %}selected{% endif %}>{{ label }}</option>
{% for r in roles %}
<option value="{{ r.slug }}" {% if role == r.slug %}selected{% endif %}>{{ r.name }}</option>
{% endfor %}
</select>
{% if has_projects or has_assigned or has_created or role %}
@@ -145,10 +145,9 @@
<td class="px-6 py-3">
{% if u.role %}
<span class="inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium
{% if u.role == 'superadmin' %}bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400
{% elif u.role == 'manager' %}bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-400
{% if u.role.slug in admin_roles %}bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-400
{% else %}bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400{% endif %}">
{{ u.get_role_display|default:u.role }}
{{ u.role.name }}
</span>
{% else %}
-
@@ -372,8 +371,8 @@
<label class="block text-sm font-semibold text-gray-900 dark:text-gray-300 mb-1">Role</label>
<select name="role" x-model="editUser.role"
class="w-full px-3 py-2 text-sm border border-gray-200 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500">
{% for r, label in roles_label.items %}
<option value="{{ r }}">{{ label }}</option>
{% for role in roles %}
<option value="{{ role.slug }}">{{ role.name }}</option>
{% endfor %}
</select>
</div>
@@ -429,8 +428,8 @@ const usersData = {
email: "{{ u.email|escapejs }}",
first_name: "{{ u.first_name|escapejs }}",
last_name: "{{ u.last_name|escapejs }}",
role: "{{ u.role|default:'' }}",
role_label: "{{ u.get_role_display|default:u.role }}",
role: "{{ u.role.slug|default:'' }}",
role_label: "{{ u.role.name|default:'' }}",
is_active: {{ u.is_active|yesno:'true,false' }},
date_joined: "{{ u.date_joined|date:'M d, Y' }}",
last_login: "{{ u.last_login|date:'M d, Y'|default:'Never' }}",