Sidebar: use PagePaths, add testid for Administration
Gate menu items via PagePaths; add data-testid=sidebar-administration for stable tests. menu_group accepts optional testid attr.
This commit is contained in:
parent
9e8910344e
commit
2ddd22078d
1 changed files with 18 additions and 15 deletions
|
|
@ -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"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue