Apply UI Authorization to Existing LiveViews closes #400 #403

Merged
moritz merged 13 commits from feature/400_ui_authorization into main 2026-02-03 17:30:16 +01:00
Showing only changes of commit 2ddd22078d - Show all commits

View file

@ -4,6 +4,8 @@ defmodule MvWeb.Layouts.Sidebar do
""" """
use MvWeb, :html use MvWeb, :html
alias MvWeb.PagePaths
attr :current_user, :map, default: nil, doc: "The current user" attr :current_user, :map, default: nil, doc: "The current user"
attr :club_name, :string, required: true, doc: "The name of the club" attr :club_name, :string, required: true, doc: "The name of the club"
attr :mobile, :boolean, default: false, doc: "Whether this is mobile view" attr :mobile, :boolean, default: false, doc: "Whether this is mobile view"
@ -70,7 +72,7 @@ defmodule MvWeb.Layouts.Sidebar do
defp sidebar_menu(assigns) do defp sidebar_menu(assigns) do
~H""" ~H"""
<ul class="menu flex-1 w-full p-2" role="menubar"> <ul class="menu flex-1 w-full p-2" role="menubar">
<%= if can_access_page?(@current_user, "/members") do %> <%= if can_access_page?(@current_user, PagePaths.members()) do %>
<.menu_item <.menu_item
href={~p"/members"} href={~p"/members"}
icon="hero-users" icon="hero-users"
@ -78,7 +80,7 @@ defmodule MvWeb.Layouts.Sidebar do
/> />
<% end %> <% end %>
<%= if can_access_page?(@current_user, "/membership_fee_types") do %> <%= if can_access_page?(@current_user, PagePaths.membership_fee_types()) do %>
<.menu_item <.menu_item
href={~p"/membership_fee_types"} href={~p"/membership_fee_types"}
icon="hero-currency-euro" icon="hero-currency-euro"
@ -87,23 +89,27 @@ defmodule MvWeb.Layouts.Sidebar do
<% end %> <% end %>
<%= if admin_menu_visible?(@current_user) do %> <%= if admin_menu_visible?(@current_user) do %>
<.menu_group icon="hero-cog-6-tooth" label={gettext("Administration")}> <.menu_group
<%= if can_access_page?(@current_user, "/users") do %> icon="hero-cog-6-tooth"
label={gettext("Administration")}
testid="sidebar-administration"
>
<%= if can_access_page?(@current_user, PagePaths.users()) do %>
<.menu_subitem href={~p"/users"} label={gettext("Users")} /> <.menu_subitem href={~p"/users"} label={gettext("Users")} />
<% end %> <% end %>
<%= if can_access_page?(@current_user, "/groups") do %> <%= if can_access_page?(@current_user, PagePaths.groups()) do %>
<.menu_subitem href={~p"/groups"} label={gettext("Groups")} /> <.menu_subitem href={~p"/groups"} label={gettext("Groups")} />
<% end %> <% end %>
<%= if can_access_page?(@current_user, "/admin/roles") do %> <%= if can_access_page?(@current_user, PagePaths.admin_roles()) do %>
<.menu_subitem href={~p"/admin/roles"} label={gettext("Roles")} /> <.menu_subitem href={~p"/admin/roles"} label={gettext("Roles")} />
<% end %> <% end %>
<%= if can_access_page?(@current_user, "/membership_fee_settings") do %> <%= if can_access_page?(@current_user, PagePaths.membership_fee_settings()) do %>
<.menu_subitem <.menu_subitem
href={~p"/membership_fee_settings"} href={~p"/membership_fee_settings"}
label={gettext("Fee Settings")} label={gettext("Fee Settings")}
/> />
<% end %> <% end %>
<%= if can_access_page?(@current_user, "/settings") do %> <%= if can_access_page?(@current_user, PagePaths.settings()) do %>
<.menu_subitem href={~p"/settings"} label={gettext("Settings")} /> <.menu_subitem href={~p"/settings"} label={gettext("Settings")} />
<% end %> <% end %>
</.menu_group> </.menu_group>
@ -113,11 +119,7 @@ defmodule MvWeb.Layouts.Sidebar do
end end
defp admin_menu_visible?(user) do defp admin_menu_visible?(user) do
Enum.any?(admin_page_paths(), &can_access_page?(user, &1)) Enum.any?(PagePaths.admin_menu_paths(), &can_access_page?(user, &1))
end
defp admin_page_paths do
["/users", "/groups", "/admin/roles", "/membership_fee_settings", "/settings"]
end end
attr :href, :string, required: true, doc: "Navigation path" attr :href, :string, required: true, doc: "Navigation path"
@ -142,12 +144,13 @@ defmodule MvWeb.Layouts.Sidebar do
attr :icon, :string, required: true, doc: "Heroicon name for the menu group" attr :icon, :string, required: true, doc: "Heroicon name for the menu group"
attr :label, :string, required: true, doc: "Menu group label" attr :label, :string, required: true, doc: "Menu group label"
attr :testid, :string, default: nil, doc: "data-testid for stable test selectors"
slot :inner_block, required: true, doc: "Submenu items" slot :inner_block, required: true, doc: "Submenu items"
defp menu_group(assigns) do defp menu_group(assigns) do
~H""" ~H"""
<!-- Expanded Mode: Always open div structure --> <!-- Expanded Mode: Always open div structure -->
<li role="none" class="expanded-menu-group"> <li role="none" class="expanded-menu-group" data-testid={@testid}>
<div <div
class="flex items-center gap-3" class="flex items-center gap-3"
role="group" role="group"
@ -161,7 +164,7 @@ defmodule MvWeb.Layouts.Sidebar do
</ul> </ul>
</li> </li>
<!-- Collapsed Mode: Dropdown --> <!-- Collapsed Mode: Dropdown -->
<div class="collapsed-menu-group dropdown dropdown-right"> <div class="collapsed-menu-group dropdown dropdown-right" data-testid={@testid}>
<button <button
type="button" type="button"
tabindex="0" tabindex="0"