Integrate Member policies in LiveViews
- Add on_mount hook to ensure user role is loaded in all Member LiveViews - Pass actor parameter to all Ash operations (read, get, create, update, destroy, load)
This commit is contained in:
parent
dc3268cbf4
commit
bc87893134
7 changed files with 167 additions and 74 deletions
|
|
@ -21,6 +21,8 @@ defmodule MvWeb.MemberLive.Show do
|
|||
use MvWeb, :live_view
|
||||
import Ash.Query
|
||||
|
||||
on_mount {MvWeb.LiveHelpers, :ensure_user_role_loaded}
|
||||
|
||||
alias MvWeb.Helpers.MembershipFeeHelpers
|
||||
|
||||
@impl true
|
||||
|
|
@ -148,9 +150,9 @@ defmodule MvWeb.MemberLive.Show do
|
|||
</div>
|
||||
|
||||
<%!-- Custom Fields Section --%>
|
||||
<%= if is_list(@custom_fields) && Enum.any?(@custom_fields) do %>
|
||||
<%= if Enum.any?(@custom_fields) do %>
|
||||
<div>
|
||||
<.section_box title={gettext("Additional Data Fields")}>
|
||||
<.section_box title={gettext("Custom Fields")}>
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<%= for custom_field <- @custom_fields do %>
|
||||
<% cfv = find_custom_field_value(@member.custom_field_values, custom_field.id) %>
|
||||
|
|
@ -220,6 +222,7 @@ defmodule MvWeb.MemberLive.Show do
|
|||
module={MvWeb.MemberLive.Show.MembershipFeesComponent}
|
||||
id={"membership-fees-#{@member.id}"}
|
||||
member={@member}
|
||||
current_user={@current_user}
|
||||
/>
|
||||
<% end %>
|
||||
</Layouts.app>
|
||||
|
|
@ -233,15 +236,15 @@ defmodule MvWeb.MemberLive.Show do
|
|||
|
||||
@impl true
|
||||
def handle_params(%{"id" => id}, _, socket) do
|
||||
# Load custom fields for display
|
||||
# Note: Each page load starts a new LiveView process, so caching with
|
||||
# assign_new is not necessary here (mount creates a fresh socket each time)
|
||||
custom_fields =
|
||||
Mv.Membership.CustomField
|
||||
|> Ash.Query.sort(name: :asc)
|
||||
|> Ash.read!()
|
||||
actor = socket.assigns[:current_user]
|
||||
|
||||
socket = assign(socket, :custom_fields, custom_fields)
|
||||
# Load custom fields once using assign_new to avoid repeated queries
|
||||
socket =
|
||||
assign_new(socket, :custom_fields, fn ->
|
||||
Mv.Membership.CustomField
|
||||
|> Ash.Query.sort(name: :asc)
|
||||
|> Ash.read!(actor: actor)
|
||||
end)
|
||||
|
||||
query =
|
||||
Mv.Membership.Member
|
||||
|
|
@ -253,7 +256,7 @@ defmodule MvWeb.MemberLive.Show do
|
|||
membership_fee_cycles: [:membership_fee_type]
|
||||
])
|
||||
|
||||
member = Ash.read_one!(query)
|
||||
member = Ash.read_one!(query, actor: actor)
|
||||
|
||||
# Calculate last and current cycle status from loaded cycles
|
||||
last_cycle_status = get_last_cycle_status(member)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue