Membership Fee 6 - UI Components & LiveViews closes #280 #304
3 changed files with 71 additions and 19 deletions
|
|
@ -42,23 +42,34 @@
|
|||
cycle_status_filter={@cycle_status_filter}
|
||||
member_count={length(@members)}
|
||||
/>
|
||||
<div class="flex gap-2 items-center">
|
||||
<button
|
||||
type="button"
|
||||
phx-click="toggle_cycle_view"
|
||||
class={[
|
||||
"btn btn-sm btn-outline gap-2",
|
||||
@cycle_status_filter && "btn-active"
|
||||
]}
|
||||
aria-label={gettext("Show Last/Current Cycle Payment Status")}
|
||||
title={gettext("Show Last/Current Cycle Payment Status")}
|
||||
>
|
||||
<.icon name="hero-arrow-path" class="size-4" />
|
||||
<span class="hidden sm:inline">
|
||||
{gettext("Show Last/Current Cycle Payment Status")}
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
phx-click="toggle_cycle_view"
|
||||
class={[
|
||||
"btn gap-2",
|
||||
@show_current_cycle && "btn-active"
|
||||
]}
|
||||
aria-label={
|
||||
if(@show_current_cycle,
|
||||
do: gettext("Current Cycle Payment Status"),
|
||||
else: gettext("Last Cycle Payment Status")
|
||||
)
|
||||
}
|
||||
title={
|
||||
if(@show_current_cycle,
|
||||
do: gettext("Current Cycle Payment Status"),
|
||||
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
|
||||
module={MvWeb.Components.FieldVisibilityDropdownComponent}
|
||||
id="field-visibility-dropdown"
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
# 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)
|
||||
|
||||
# Create additional users for user-member linking examples
|
||||
|
|
@ -249,7 +252,9 @@ Enum.with_index(linked_members)
|
|||
# Start from where previous members ended
|
||||
fee_type_index = rem(length(member_attrs_list) + index, length(all_fee_types))
|
||||
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
|
||||
if user.member_id == nil do
|
||||
|
|
|
|||
|
|
@ -42,5 +42,41 @@ defmodule Mv.SeedsTest do
|
|||
assert length(custom_fields_count_1) == length(custom_fields_count_2),
|
||||
"CustomFields count should remain same after re-running seeds"
|
||||
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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue