+
+ <%!-- Default setting: one row, clear section title and split hints --%>
+ <.form
+ for={@form}
+ phx-change="validate"
+ phx-submit="save"
+ class="space-y-2"
+ >
+
+ {gettext("Default settings")}
-
- <.form
- for={@form}
- phx-change="validate"
- phx-submit="save"
- class="space-y-6"
- >
- <%!-- Default Membership Fee Type --%>
-
-
+
+
+
{gettext("Default Membership Fee Type")}
@@ -177,7 +175,7 @@ defmodule MvWeb.MembershipFeeSettingsLive do
id="default_membership_fee_type_id"
name="settings[default_membership_fee_type_id]"
class={[
- "select select-bordered",
+ "select select-bordered w-full",
if(@form.errors[:default_membership_fee_type_id], do: "select-error", else: "")
]}
phx-debounce="blur"
@@ -200,16 +198,10 @@ defmodule MvWeb.MembershipFeeSettingsLive do
{msg}
<% end %>
<% end %>
-
- {gettext(
- "This membership fee type is automatically assigned to all new members. Can be changed individually per member."
- )}
-
- <%!-- Include Joining Cycle --%>
-
-
+
+
<%= for error <- List.wrap(@form.errors[:include_joining_cycle]) do %>
<% {msg, _opts} = if is_tuple(error), do: error, else: {error, []} %>
- {msg}
+ {msg}
<% end %>
<% end %>
-
-
- {gettext("When active: Members pay from the cycle of their joining.")}
-
-
- {gettext("When inactive: Members pay from the next full cycle after joining.")}
-
-
-
-
- <.button type="submit" variant="primary" class="w-full">
- <.icon name="hero-check" class="size-5" />
- {gettext("Save Settings")}
-
-
-
-
-
- <%!-- Examples Card (collapsible) --%>
-
-
-
-
- <.icon name="hero-chevron-right" class="size-5 transition group-open:rotate-90" />
- <.icon name="hero-light-bulb" class="size-5" />
- {gettext("Examples")}
-
-
-
- <.example_section
- title={gettext("Yearly Interval - Joining Cycle Included")}
- joining_date="15.03.2023"
- include_joining={true}
- start_date="01.01.2023"
- periods={["2023", "2024", "2025"]}
- note={gettext("Member pays for the year they joined")}
- />
-
-
-
- <.example_section
- title={gettext("Yearly Interval - Joining Cycle Excluded")}
- joining_date="15.03.2023"
- include_joining={false}
- start_date="01.01.2024"
- periods={["2024", "2025"]}
- note={gettext("Member pays from the next full year")}
- />
-
-
-
- <.example_section
- title={gettext("Quarterly Interval - Joining Cycle Excluded")}
- joining_date="15.05.2024"
- include_joining={false}
- start_date="01.07.2024"
- periods={["Q3/2024", "Q4/2024", "Q1/2025"]}
- note={gettext("Member pays from the next full quarter")}
- />
-
-
-
- <.example_section
- title={gettext("Monthly Interval - Joining Cycle Included")}
- joining_date="15.03.2024"
- include_joining={true}
- start_date="01.03.2024"
- periods={["03/2024", "04/2024", "05/2024", "..."]}
- note={gettext("Member pays from the joining month")}
- />
+
+ <.button type="submit" variant="primary">
+ <.icon name="hero-check" class="size-5" />
+ {gettext("Save Settings")}
+
-
-
-
-
+
- <%!-- Fee Types Table --%>
-
-
{gettext("Membership Fee Types")}
- <.table
- id="membership_fee_types"
- rows={@membership_fee_types}
- row_id={fn mft -> "mft-#{mft.id}" end}
- >
- <:col :let={mft} label={gettext("Name")}>
-
{mft.name}
-
{mft.description}
-
+
+ {gettext("Default type: Assigned to new members; can be changed per member.")}
+
+ {gettext(
+ "Include joining cycle: When active, members pay from their joining cycle; when inactive, from the next full cycle."
+ )}
+
+
+
- <:col :let={mft} label={gettext("Amount")}>
-
{MembershipFeeHelpers.format_currency(mft.amount)}
-
+
- <:col :let={mft} label={gettext("Interval")}>
- <.badge variant="neutral" style="outline">
- {MembershipFeeHelpers.format_interval(mft.interval)}
-
-
+ <%!-- Fee types table: row click opens edit --%>
+
{gettext("Membership Fee Types")}
+ <.table
+ id="membership_fee_types"
+ rows={@membership_fee_types}
+ row_id={fn mft -> "mft-#{mft.id}" end}
+ row_click={
+ fn mft ->
+ Phoenix.LiveView.JS.navigate(~p"/membership_fee_settings/#{mft.id}/edit_fee_type")
+ end
+ }
+ row_tooltip={gettext("Click to edit membership fee type")}
+ >
+ <:col :let={mft} label={gettext("Name")}>
+
{mft.name}
+
{mft.description}
+
- <:col :let={mft} label={gettext("Members")}>
-
{get_member_count(mft, @member_counts)}
-
+ <:col :let={mft} label={gettext("Amount")}>
+
{MembershipFeeHelpers.format_currency(mft.amount)}
+
- <:action :let={mft}>
- <.tooltip content={gettext("Edit membership fee type")} position="left">
- <.button
- variant="ghost"
- size="sm"
- navigate={~p"/membership_fee_settings/#{mft.id}/edit_fee_type"}
- aria-label={gettext("Edit membership fee type")}
- >
- <.icon name="hero-pencil" class="size-4" />
-
-
-
+ <:col :let={mft} label={gettext("Interval")}>
+ <.badge variant="neutral" style="outline">
+ {MembershipFeeHelpers.format_interval(mft.interval)}
+
+
- <:action :let={mft}>
- <.tooltip
- :if={get_member_count(mft, @member_counts) > 0}
- content={
- gettext("Cannot delete - %{count} member(s) assigned",
- count: get_member_count(mft, @member_counts)
- )
- }
- position="left"
- >
-
+ {get_member_count(mft, @member_counts)}
+
+
+ <:action :let={mft}>
+ <.tooltip
+ :if={get_member_count(mft, @member_counts) > 0}
+ content={
gettext("Cannot delete - %{count} member(s) assigned",
count: get_member_count(mft, @member_counts)
)
}
- disabled={true}
+ position="left"
+ >
+
+ <.icon name="hero-trash" class="size-4" />
+
+
+ <.button
+ :if={get_member_count(mft, @member_counts) == 0}
+ variant="danger"
+ size="sm"
+ phx-click="delete"
+ phx-value-id={mft.id}
+ data-confirm={gettext("Are you sure?")}
+ aria-label={gettext("Delete Membership Fee Type")}
>
<.icon name="hero-trash" class="size-4" />
-
-
- <.button
- :if={get_member_count(mft, @member_counts) == 0}
- variant="danger"
- size="sm"
- phx-click="delete"
- phx-value-id={mft.id}
- data-confirm={gettext("Are you sure?")}
- aria-label={gettext("Delete Membership Fee Type")}
- >
- <.icon name="hero-trash" class="size-4" />
-
-
-
+
+
+
+
+