Membership Fee 6 - UI Components & LiveViews closes #280 #304

Open
moritz wants to merge 65 commits from feature/280_membership_fee_ui into main
3 changed files with 71 additions and 19 deletions
Showing only changes of commit f25e198b0e - Show all commits

View file

@ -42,23 +42,34 @@
cycle_status_filter={@cycle_status_filter} cycle_status_filter={@cycle_status_filter}
member_count={length(@members)} member_count={length(@members)}
/> />
<div class="flex gap-2 items-center"> <button
<button type="button"
type="button" phx-click="toggle_cycle_view"
phx-click="toggle_cycle_view" class={[
class={[ "btn gap-2",
"btn btn-sm btn-outline gap-2", @show_current_cycle && "btn-active"
@cycle_status_filter && "btn-active" ]}
]} aria-label={
aria-label={gettext("Show Last/Current Cycle Payment Status")} if(@show_current_cycle,
title={gettext("Show Last/Current Cycle Payment Status")} do: gettext("Current Cycle Payment Status"),
> else: gettext("Last Cycle Payment Status")
<.icon name="hero-arrow-path" class="size-4" /> )
<span class="hidden sm:inline"> }
{gettext("Show Last/Current Cycle Payment Status")} title={
</span> if(@show_current_cycle,
</button> do: gettext("Current Cycle Payment Status"),
</div> else: gettext("Last Cycle Payment Status")
)
}
>
<.icon name="hero-arrow-path" class="h-5 w-5" />
<span class="hidden sm:inline">
{if(@show_current_cycle,
do: gettext("Current Cycle Payment Status"),
else: gettext("Last Cycle Payment Status")
)}
</span>
</button>
<.live_component <.live_component
module={MvWeb.Components.FieldVisibilityDropdownComponent} module={MvWeb.Components.FieldVisibilityDropdownComponent}
id="field-visibility-dropdown" id="field-visibility-dropdown"

View file

@ -186,7 +186,10 @@ Enum.with_index(member_attrs_list)
member_attrs_with_fee_type = Map.put(member_attrs, :membership_fee_type_id, fee_type.id) member_attrs_with_fee_type = Map.put(member_attrs, :membership_fee_type_id, fee_type.id)
# Use upsert to prevent duplicates based on email # Use upsert to prevent duplicates based on email
Membership.create_member!(member_attrs_with_fee_type, upsert?: true, upsert_identity: :unique_email) Membership.create_member!(member_attrs_with_fee_type,
upsert?: true,
upsert_identity: :unique_email
)
end) end)
# Create additional users for user-member linking examples # Create additional users for user-member linking examples
@ -249,7 +252,9 @@ Enum.with_index(linked_members)
# Start from where previous members ended # Start from where previous members ended
fee_type_index = rem(length(member_attrs_list) + index, length(all_fee_types)) fee_type_index = rem(length(member_attrs_list) + index, length(all_fee_types))
fee_type = Enum.at(all_fee_types, fee_type_index) fee_type = Enum.at(all_fee_types, fee_type_index)
member_attrs_with_fee_type = Map.put(member_attrs_without_user, :membership_fee_type_id, fee_type.id)
member_attrs_with_fee_type =
Map.put(member_attrs_without_user, :membership_fee_type_id, fee_type.id)
# Check if user already has a member # Check if user already has a member
if user.member_id == nil do if user.member_id == nil do

View file

@ -42,5 +42,41 @@ defmodule Mv.SeedsTest do
assert length(custom_fields_count_1) == length(custom_fields_count_2), assert length(custom_fields_count_1) == length(custom_fields_count_2),
"CustomFields count should remain same after re-running seeds" "CustomFields count should remain same after re-running seeds"
end end
test "all members have membership fee type assigned" do
# Run the seeds script
assert Code.eval_file("priv/repo/seeds.exs")
# Get all members
{:ok, members} = Ash.read(Mv.Membership.Member)
# All members should have a membership_fee_type_id
Enum.each(members, fn member ->
assert member.membership_fee_type_id != nil,
"Member #{member.first_name} #{member.last_name} should have a membership fee type assigned"
end)
end
test "each membership fee type has at least one member" do
# Run the seeds script
assert Code.eval_file("priv/repo/seeds.exs")
# Get all fee types and members
{:ok, fee_types} = Ash.read(Mv.MembershipFees.MembershipFeeType)
{:ok, members} = Ash.read(Mv.Membership.Member)
# Group members by fee type
members_by_fee_type =
members
|> Enum.group_by(& &1.membership_fee_type_id)
# Each fee type should have at least one member
Enum.each(fee_types, fn fee_type ->
members_for_type = Map.get(members_by_fee_type, fee_type.id, [])
assert length(members_for_type) > 0,
"Membership fee type #{fee_type.name} should have at least one member assigned"
end)
end
end end
end end