diff --git a/assets/js/main.js b/assets/js/main.js
index 7c2f329..73d98c3 100644
--- a/assets/js/main.js
+++ b/assets/js/main.js
@@ -634,6 +634,7 @@ document.addEventListener('DOMContentLoaded', () => {
const userId = memberItem.dataset.userId;
const username = memberItem.dataset.username;
const avatar = memberItem.dataset.avatar;
+ const roleIds = (memberItem.dataset.roleIds || '').split(',').filter(id => id);
// Create or show member menu
document.querySelector('.member-context-menu')?.remove();
@@ -642,17 +643,42 @@ document.addEventListener('DOMContentLoaded', () => {
menu.style.position = 'fixed';
menu.style.zIndex = '1000';
menu.style.boxShadow = '0 4px 12px rgba(0,0,0,0.5)';
- menu.style.minWidth = '150px';
+ menu.style.minWidth = '180px';
const rect = memberItem.getBoundingClientRect();
menu.style.top = `${rect.top}px`;
- menu.style.left = `${rect.left - 160}px`;
+ menu.style.left = `${rect.left - 190}px`;
+
+ let rolesHtml = '';
+ if (roleIds.length > 0) {
+ // Deduplicate and filter valid roles from serverRoles
+ const uniqueRoleIds = [...new Set(roleIds)];
+ const roles = uniqueRoleIds.map(id => serverRoles.find(r => r.id == id)).filter(r => r);
+ if (roles.length > 0) {
+ rolesHtml = `
+
+
Rôles
+
+ ${roles.map(r => `
+
+ ${r.icon_url ? `
` : ''}
+ ${escapeHTML(r.name)}
+
+ `).join('')}
+
+
+
+ `;
+ }
+ }
menu.innerHTML = `
-
+
+
+ ${rolesHtml}
${(window.isServerOwner || window.canManageServer) ? `` : ''}
`;
@@ -1213,6 +1239,7 @@ document.addEventListener('DOMContentLoaded', () => {
item.dataset.userId = m.id;
item.dataset.username = m.username;
item.dataset.avatar = m.avatar_url || '';
+ item.dataset.roleIds = m.role_ids || '';
item.style.color = 'var(--text-primary)';
item.style.marginBottom = '8px';
item.style.cursor = 'pointer';
@@ -2103,4 +2130,7 @@ document.addEventListener('DOMContentLoaded', () => {
el.addEventListener('load', () => scrollToBottom(isMe));
});
}
+
+ // Initial load of roles for the server
+ loadRoles();
});
diff --git a/index.php b/index.php
index 7d67ea3..2e82db5 100644
--- a/index.php
+++ b/index.php
@@ -190,13 +190,14 @@ if ($is_dm_view) {
// Fetch members
$stmt = db()->prepare("
SELECT u.id, u.username, u.avatar_url, u.status,
+ (SELECT GROUP_CONCAT(r.id) FROM roles r JOIN user_roles ur ON r.id = ur.role_id WHERE ur.user_id = u.id AND r.server_id = ?) as role_ids,
(SELECT r.color FROM roles r JOIN user_roles ur ON r.id = ur.role_id WHERE ur.user_id = u.id AND r.server_id = ? ORDER BY r.position DESC LIMIT 1) as role_color,
(SELECT r.icon_url FROM roles r JOIN user_roles ur ON r.id = ur.role_id WHERE ur.user_id = u.id AND r.server_id = ? ORDER BY r.position DESC LIMIT 1) as role_icon
FROM users u
JOIN server_members sm ON u.id = sm.user_id
WHERE sm.server_id = ?
");
- $stmt->execute([$active_server_id, $active_server_id, $active_server_id]);
+ $stmt->execute([$active_server_id, $active_server_id, $active_server_id, $active_server_id]);
$members = $stmt->fetchAll();
}
@@ -789,7 +790,7 @@ $projectImageUrl = $_SERVER['PROJECT_IMAGE_URL'] ?? '';
Members —
-