diff --git a/frappe/core/page/permission_manager/permission_manager.js b/frappe/core/page/permission_manager/permission_manager.js index 129f1aea4a..09b400ae9b 100644 --- a/frappe/core/page/permission_manager/permission_manager.js +++ b/frappe/core/page/permission_manager/permission_manager.js @@ -344,23 +344,68 @@ frappe.PermissionEngine = class PermissionEngine { .find("a") .attr("data-role", role) .click(function () { - let role = $(this).attr("data-role"); + const role = $(this).attr("data-role"); frappe.call({ module: "frappe.core", page: "permission_manager", method: "get_users_with_role", - args: { - role: role, - }, + args: { role }, callback: function (r) { - r.message = $.map(r.message, function (p) { - return $.format('{1}', [p, p]); + let message_html = ""; + + const role_label = __(role); + const users = (r.message || []).filter(Boolean); + const user_count = users.length; + const display_count = Math.min(user_count, 5); + + if (user_count === 0) { + message_html = __("No user has the role {0}", [ + role_label, + ]); + } else { + const user_text = user_count === 1 ? __("User") : __("Users"); + const display_users = users.slice(0, display_count); + + const user_list = display_users + .map( + (user) => + `
  • + ${frappe.utils.get_form_link("User", user, true)} +
  • ` + ) + .join(""); + + message_html = __("{0} with the role {1}", [ + user_text, + role_label, + ]); + + message_html += ``; + + // show compact "View All" link if more users + if (user_count > display_count) { + const route = frappe.utils.generate_route({ + type: "Doctype", + doctype: "User", + name: "User", + doc_view: "List", + route_options: { role }, + }); + + message_html += `
    + + ${frappe.utils.icon("external-link", "sm", "mr-1")} + ${__("View all {0} users", [user_count])} + +
    `; + } + } + + frappe.msgprint({ + title: __("Users"), + message: message_html, + indicator: user_count === 0 ? "orange" : "blue", }); - frappe.msgprint( - __("Users with role {0}:", [__(role)]) + - "
    " + - r.message.join("
    ") - ); }, }); return false;