diff --git a/front/lib/front_web/views/people_view.ex b/front/lib/front_web/views/people_view.ex
index f03552d30..8790ac7af 100644
--- a/front/lib/front_web/views/people_view.ex
+++ b/front/lib/front_web/views/people_view.ex
@@ -45,6 +45,38 @@ defmodule FrontWeb.PeopleView do
}
end
+ def service_accounts_config(conn) do
+ org_id = conn.assigns.organization_id
+ permissions = conn.assigns.permissions
+
+ {:ok, all_roles} = Front.RBAC.RoleManagement.list_possible_roles(org_id, "org_scope")
+
+ # Filter roles - exclude Owner unless user has change_owner permission
+ filtered_roles =
+ all_roles
+ |> Enum.filter(fn
+ %{name: "Owner"} -> permissions["organization.change_owner"] || false
+ _role -> true
+ end)
+ |> Enum.map(fn role ->
+ %{
+ id: role.id,
+ name: role.name,
+ description: role.description
+ }
+ end)
+
+ %{
+ organization_id: org_id,
+ project_id: conn.assigns[:project_id],
+ permissions: %{
+ view: permissions["organization.service_accounts.view"] || false,
+ manage: permissions["organization.service_accounts.manage"] || false
+ },
+ roles: filtered_roles
+ }
+ end
+
@spec available_user_providers(org_id :: String.t()) :: [String.t()]
defp available_user_providers(org_id) do
[
@@ -65,7 +97,7 @@ defmodule FrontWeb.PeopleView do
|> Enum.filter(& &1)
end
- def edit_person_config(conn, member, roles, permissions) do
+ def edit_person_config(conn, member, member_type, roles, permissions) do
filtered_roles =
roles
|> Enum.filter(fn
@@ -79,6 +111,7 @@ defmodule FrontWeb.PeopleView do
avatar: member.avatar,
name: member.name,
email: member.email,
+ member_type: member_type,
roles: build_roles(member, filtered_roles),
reset_password_url:
url(:post, people_path(conn, :reset_password, member.id, format: "json")),
@@ -194,28 +227,40 @@ defmodule FrontWeb.PeopleView do
|> raw()
end
- defp map_role_to_colour("Admin"), do: "blue"
- defp map_role_to_colour("Contributor"), do: "green"
- defp map_role_to_colour("Reader"), do: "yellow"
- defp map_role_to_colour("Owner"), do: "red"
- defp map_role_to_colour("Member"), do: "green"
- defp map_role_to_colour("Viewer"), do: "orange"
- defp map_role_to_colour("Billing Admin"), do: "purple"
- defp map_role_to_colour(_), do: "cyan"
+ def map_role_to_colour("Admin"), do: "blue"
+ def map_role_to_colour("Contributor"), do: "green"
+ def map_role_to_colour("Reader"), do: "yellow"
+ def map_role_to_colour("Owner"), do: "red"
+ def map_role_to_colour("Member"), do: "green"
+ def map_role_to_colour("Viewer"), do: "orange"
+ def map_role_to_colour("Billing Admin"), do: "purple"
+ def map_role_to_colour(_), do: "cyan"
def construct_member_avatar(member) do
- avatar_url =
- if member.has_avatar do
- member.avatar
- else
- first_letter = member.name |> String.first() |> String.downcase()
- "#{assets_path()}/images/org-#{first_letter}.svg"
- end
-
- """
-

- """
- |> raw()
+ # Check if this is a service account
+ is_service_account = member.subject_type == "service_account"
+
+ if is_service_account do
+ """
+
+ smart_toy
+
+ """
+ |> raw()
+ else
+ avatar_url =
+ if member.has_avatar do
+ member.avatar
+ else
+ first_letter = member.name |> String.first() |> String.downcase()
+ "#{assets_path()}/images/org-#{first_letter}.svg"
+ end
+
+ """
+

+ """
+ |> raw()
+ end
end
def build_roles(member, roles) do
@@ -232,7 +277,7 @@ defmodule FrontWeb.PeopleView do
end)
end
- def construct_role_dropdown_option(role, member) do
+ def construct_role_dropdown_option(role, member, member_type) do
role_selected? = role.name in Enum.map(member.subject_role_bindings, & &1.role.name)
binding_source =
@@ -245,7 +290,7 @@ defmodule FrontWeb.PeopleView do
end
"""
-