Visual hierarchy for fields in member view and edit form - closes #231 #247
5 changed files with 922 additions and 1642 deletions
|
|
@ -5,80 +5,212 @@ defmodule MvWeb.MemberLive.Form do
|
||||||
## Features
|
## Features
|
||||||
- Create new members with personal information
|
- Create new members with personal information
|
||||||
- Edit existing member details
|
- Edit existing member details
|
||||||
- Manage custom properties (dynamic fields)
|
- Grouped sections for better organization
|
||||||
|
- Tab navigation (Payments tab disabled, coming soon)
|
||||||
|
- Manage custom properties (dynamic fields, displayed sorted by name)
|
||||||
- Real-time validation with visual feedback
|
- Real-time validation with visual feedback
|
||||||
- Link/unlink user accounts
|
|
||||||
|
|
||||||
## Form Fields
|
## Form Sections
|
||||||
**Required:**
|
- Personal Data: Name, address, contact information, membership dates, notes
|
||||||
- first_name, last_name, email
|
- Custom Fields: Dynamic fields in uniform grid layout (displayed sorted by name)
|
||||||
|
- Payment Data: Mockup section (not editable)
|
||||||
**Optional:**
|
|
||||||
- phone_number, address fields (city, street, house_number, postal_code)
|
|
||||||
- join_date, exit_date
|
|
||||||
- paid status
|
|
||||||
- notes
|
|
||||||
|
|
||||||
## Custom Field Values
|
|
||||||
Members can have dynamic custom field values defined by CustomFields.
|
|
||||||
The form dynamically renders inputs based on available CustomFields.
|
|
||||||
|
|
||||||
## Events
|
## Events
|
||||||
- `validate` - Real-time form validation
|
- `validate` - Real-time form validation
|
||||||
- `save` - Submit form (create or update member)
|
- `save` - Submit form (create or update member)
|
||||||
- Custom field value management events for adding/removing custom fields
|
|
||||||
"""
|
"""
|
||||||
use MvWeb, :live_view
|
use MvWeb, :live_view
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def render(assigns) do
|
def render(assigns) do
|
||||||
|
# Sort custom fields by name for display only
|
||||||
|
sorted_custom_fields = Enum.sort_by(assigns.custom_fields, & &1.name)
|
||||||
|
assigns = assign(assigns, :sorted_custom_fields, sorted_custom_fields)
|
||||||
|
|
||||||
~H"""
|
~H"""
|
||||||
<Layouts.app flash={@flash} current_user={@current_user}>
|
<Layouts.app flash={@flash} current_user={@current_user}>
|
||||||
<.header>
|
|
||||||
{@page_title}
|
|
||||||
<:subtitle>
|
|
||||||
{gettext("Fields marked with an asterisk (*) cannot be empty.")}
|
|
||||||
</:subtitle>
|
|
||||||
</.header>
|
|
||||||
|
|
||||||
<.form for={@form} id="member-form" phx-change="validate" phx-submit="save">
|
<.form for={@form} id="member-form" phx-change="validate" phx-submit="save">
|
||||||
<.input field={@form[:first_name]} label={gettext("First Name")} required />
|
<%!-- Header with Back button, Name display, and Save button --%>
|
||||||
<.input field={@form[:last_name]} label={gettext("Last Name")} required />
|
<div class="flex items-center justify-between gap-4 pb-4">
|
||||||
<.input field={@form[:email]} label={gettext("Email")} required type="email" />
|
<.button navigate={return_path(@return_to, @member)} type="button">
|
||||||
<.input field={@form[:paid]} label={gettext("Paid")} type="checkbox" />
|
<.icon name="hero-arrow-left" class="size-4" />
|
||||||
<.input field={@form[:phone_number]} label={gettext("Phone Number")} />
|
{gettext("Back")}
|
||||||
<.input field={@form[:join_date]} label={gettext("Join Date")} type="date" />
|
</.button>
|
||||||
<.input field={@form[:exit_date]} label={gettext("Exit Date")} type="date" />
|
|
||||||
<.input field={@form[:notes]} label={gettext("Notes")} />
|
|
||||||
<.input field={@form[:city]} label={gettext("City")} />
|
|
||||||
<.input field={@form[:street]} label={gettext("Street")} />
|
|
||||||
<.input field={@form[:house_number]} label={gettext("House Number")} />
|
|
||||||
<.input field={@form[:postal_code]} label={gettext("Postal Code")} />
|
|
||||||
|
|
||||||
<h3 class="mt-8 mb-2 text-lg font-semibold">{gettext("Custom Field Values")}</h3>
|
<h1 class="text-2xl font-bold text-center flex-1">
|
||||||
<.inputs_for :let={f_custom_field_value} field={@form[:custom_field_values]}>
|
<%= if @member do %>
|
||||||
<% type =
|
{@member.first_name} {@member.last_name}
|
||||||
Enum.find(@custom_fields, &(&1.id == f_custom_field_value[:custom_field_id].value)) %>
|
<% else %>
|
||||||
<.inputs_for :let={value_form} field={f_custom_field_value[:value]}>
|
{gettext("New Member")}
|
||||||
<% input_type =
|
<% end %>
|
||||||
cond do
|
</h1>
|
||||||
type && type.value_type == :boolean -> "checkbox"
|
|
||||||
type && type.value_type == :date -> :date
|
|
||||||
true -> :text
|
|
||||||
end %>
|
|
||||||
<.input field={value_form[:value]} label={type && type.name} type={input_type} />
|
|
||||||
</.inputs_for>
|
|
||||||
<input
|
|
||||||
type="hidden"
|
|
||||||
name={f_custom_field_value[:custom_field_id].name}
|
|
||||||
value={f_custom_field_value[:custom_field_id].value}
|
|
||||||
/>
|
|
||||||
</.inputs_for>
|
|
||||||
|
|
||||||
<.button phx-disable-with={gettext("Saving...")} variant="primary">
|
<.button phx-disable-with={gettext("Saving...")} variant="primary" type="submit">
|
||||||
{gettext("Save Member")}
|
{gettext("Save")}
|
||||||
</.button>
|
</.button>
|
||||||
<.button navigate={return_path(@return_to, @member)}>{gettext("Cancel")}</.button>
|
</div>
|
||||||
|
|
||||||
|
<%!-- Tab Navigation --%>
|
||||||
|
|
|||||||
|
<div role="tablist" class="tabs tabs-bordered mb-6">
|
||||||
|
<button type="button" role="tab" class="tab tab-active" aria-selected="true">
|
||||||
|
<.icon name="hero-identification" class="size-4 mr-2" />
|
||||||
|
{gettext("Contact Data")}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
role="tab"
|
||||||
|
class="tab"
|
||||||
|
disabled
|
||||||
|
aria-disabled="true"
|
||||||
|
title={gettext("Coming soon")}
|
||||||
|
>
|
||||||
|
<.icon name="hero-credit-card" class="size-4 mr-2" />
|
||||||
|
{gettext("Payments")}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Personal Data and Custom Fields Row --%>
|
||||||
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6">
|
||||||
|
<%!-- Personal Data Section --%>
|
||||||
|
<div>
|
||||||
|
<.form_section title={gettext("Personal Data")}>
|
||||||
|
<div class="space-y-4">
|
||||||
|
<%!-- Name Row --%>
|
||||||
|
<div class="flex gap-4">
|
||||||
|
<div class="w-48">
|
||||||
|
<.input field={@form[:first_name]} label={gettext("First Name")} required />
|
||||||
|
</div>
|
||||||
|
<div class="w-48">
|
||||||
|
<.input field={@form[:last_name]} label={gettext("Last Name")} required />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Address Row --%>
|
||||||
|
<div class="flex gap-4">
|
||||||
|
<div class="flex-1">
|
||||||
|
<.input field={@form[:street]} label={gettext("Street")} />
|
||||||
|
</div>
|
||||||
|
<div class="w-16">
|
||||||
|
<.input field={@form[:house_number]} label={gettext("Nr.")} />
|
||||||
|
</div>
|
||||||
|
<div class="w-24">
|
||||||
|
<.input field={@form[:postal_code]} label={gettext("Postal Code")} />
|
||||||
|
</div>
|
||||||
|
<div class="w-32">
|
||||||
|
<.input field={@form[:city]} label={gettext("City")} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Email --%>
|
||||||
|
<div>
|
||||||
|
<.input field={@form[:email]} label={gettext("Email")} required type="email" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Phone --%>
|
||||||
|
<div>
|
||||||
|
<.input field={@form[:phone_number]} label={gettext("Phone")} type="tel" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Membership Dates Row --%>
|
||||||
|
<div class="flex gap-4">
|
||||||
|
<div class="w-36">
|
||||||
|
<.input field={@form[:join_date]} label={gettext("Join Date")} type="date" />
|
||||||
|
</div>
|
||||||
|
<div class="w-36">
|
||||||
|
<.input field={@form[:exit_date]} label={gettext("Exit Date")} type="date" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Notes --%>
|
||||||
|
<div>
|
||||||
|
<.input field={@form[:notes]} label={gettext("Notes")} type="textarea" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</.form_section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Custom Fields Section --%>
|
||||||
|
<%= if Enum.any?(@custom_fields) do %>
|
||||||
|
<div>
|
||||||
|
<.form_section title={gettext("Custom Fields")}>
|
||||||
|
<div class="grid grid-cols-2 gap-4">
|
||||||
|
<%!-- Render in sorted order by finding the form for each sorted custom field --%>
|
||||||
|
<%= for cf <- @sorted_custom_fields do %>
|
||||||
|
<.inputs_for :let={f_cfv} field={@form[:custom_field_values]}>
|
||||||
|
<%= if f_cfv[:custom_field_id].value == cf.id do %>
|
||||||
|
<div class={if cf.value_type == :boolean, do: "flex items-end", else: ""}>
|
||||||
|
<.inputs_for :let={value_form} field={f_cfv[:value]}>
|
||||||
|
<.input
|
||||||
|
field={value_form[:value]}
|
||||||
|
label={cf.name}
|
||||||
|
type={custom_field_input_type(cf.value_type)}
|
||||||
|
/>
|
||||||
|
</.inputs_for>
|
||||||
|
<input
|
||||||
|
type="hidden"
|
||||||
|
name={f_cfv[:custom_field_id].name}
|
||||||
|
value={f_cfv[:custom_field_id].value}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</.inputs_for>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</.form_section>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Payment Data Section (Mockup) --%>
|
||||||
|
<div class="max-w-xl">
|
||||||
|
<.form_section title={gettext("Payment Data")}>
|
||||||
|
<div role="alert" class="alert alert-info mb-4">
|
||||||
|
<.icon name="hero-information-circle" class="size-5" />
|
||||||
|
<span>{gettext("This data is for demonstration purposes only (mockup).")}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex gap-8">
|
||||||
|
<div class="w-24">
|
||||||
|
<label for="mock-contribution" class="label text-sm font-medium">
|
||||||
|
{gettext("Contribution")}
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
id="mock-contribution"
|
||||||
|
value="72 €"
|
||||||
|
disabled
|
||||||
|
class="input input-bordered w-full bg-base-200"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="w-40">
|
||||||
|
<label class="label text-sm font-medium">{gettext("Payment Cycle")}</label>
|
||||||
|
<div class="flex gap-3 mt-2">
|
||||||
|
<label class="flex items-center gap-1 cursor-not-allowed opacity-60">
|
||||||
|
<input type="radio" name="mock_cycle" checked disabled class="radio radio-sm" />
|
||||||
|
<span class="text-sm">{gettext("monthly")}</span>
|
||||||
|
</label>
|
||||||
|
<label class="flex items-center gap-1 cursor-not-allowed opacity-60">
|
||||||
|
<input type="radio" name="mock_cycle" disabled class="radio radio-sm" />
|
||||||
|
<span class="text-sm">{gettext("yearly")}</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="w-24 flex items-end">
|
||||||
|
<.input field={@form[:paid]} label={gettext("Paid")} type="checkbox" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</.form_section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Bottom Action Buttons --%>
|
||||||
|
<div class="flex justify-end gap-4 mt-6">
|
||||||
|
<.button navigate={return_path(@return_to, @member)} type="button">
|
||||||
|
{gettext("Cancel")}
|
||||||
|
</.button>
|
||||||
|
<.button phx-disable-with={gettext("Saving...")} variant="primary" type="submit">
|
||||||
|
{gettext("Save Member")}
|
||||||
|
</.button>
|
||||||
|
</div>
|
||||||
</.form>
|
</.form>
|
||||||
</Layouts.app>
|
</Layouts.app>
|
||||||
"""
|
"""
|
||||||
|
|
@ -106,8 +238,8 @@ defmodule MvWeb.MemberLive.Form do
|
||||||
id -> Ash.get!(Mv.Membership.Member, id)
|
id -> Ash.get!(Mv.Membership.Member, id)
|
||||||
end
|
end
|
||||||
|
|
||||||
action = if is_nil(member), do: "New", else: "Edit"
|
action = if is_nil(member), do: gettext("New"), else: gettext("Edit")
|
||||||
page_title = action <> " " <> "Member"
|
page_title = "#{action} #{gettext("Member")}"
|
||||||
|
moritz marked this conversation as resolved
Outdated
rafael
commented
This won't work in german, I think This won't work in german, I think
|
|||||||
|
|
||||||
{:ok,
|
{:ok,
|
||||||
socket
|
socket
|
||||||
|
|
@ -213,5 +345,37 @@ defmodule MvWeb.MemberLive.Form do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp return_path("index", _member), do: ~p"/members"
|
defp return_path("index", _member), do: ~p"/members"
|
||||||
|
defp return_path("show", nil), do: ~p"/members"
|
||||||
defp return_path("show", member), do: ~p"/members/#{member.id}"
|
defp return_path("show", member), do: ~p"/members/#{member.id}"
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------
|
||||||
|
# Helper Components
|
||||||
|
# -----------------------------------------------------------------
|
||||||
|
|
||||||
|
# Renders a form section box with border and title.
|
||||||
|
attr :title, :string, required: true
|
||||||
|
slot :inner_block, required: true
|
||||||
|
|
||||||
|
defp form_section(assigns) do
|
||||||
|
~H"""
|
||||||
|
<section class="mb-6">
|
||||||
|
<h2 class="text-lg font-semibold mb-3">{@title}</h2>
|
||||||
|
<div class="border border-base-300 rounded-lg p-4 bg-base-100">
|
||||||
|
{render_slot(@inner_block)}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------
|
||||||
|
# Helper Functions for Custom Fields
|
||||||
|
# -----------------------------------------------------------------
|
||||||
|
|
||||||
|
# Returns input type for custom field based on value type
|
||||||
|
defp custom_field_input_type(:string), do: "text"
|
||||||
|
moritz marked this conversation as resolved
Outdated
rafael
commented
These functions should use gettext These functions should use gettext
moritz
commented
the return values are HTML input types. So a translation doesn't make any sense here. the return values are HTML input types. So a translation doesn't make any sense here.
|
|||||||
|
defp custom_field_input_type(:integer), do: "number"
|
||||||
|
defp custom_field_input_type(:boolean), do: "checkbox"
|
||||||
|
defp custom_field_input_type(:date), do: "date"
|
||||||
|
defp custom_field_input_type(:email), do: "email"
|
||||||
|
defp custom_field_input_type(_), do: "text"
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -3,19 +3,16 @@ defmodule MvWeb.MemberLive.Show do
|
||||||
LiveView for displaying a single member's details.
|
LiveView for displaying a single member's details.
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
- Display all member information (personal, contact, address)
|
- Display all member information in grouped sections
|
||||||
- Show linked user account (if exists)
|
- Tab navigation for future features (Payments)
|
||||||
- Display custom field values
|
- Show custom field values with type-based formatting
|
||||||
- Navigate to edit form
|
- Navigate to edit form
|
||||||
- Return to member list
|
- Return to member list
|
||||||
|
|
||||||
## Displayed Information
|
## Sections
|
||||||
- Basic: name, email, dates (join, exit)
|
- Personal Data: Name, address, contact information, membership dates, notes
|
||||||
- Contact: phone number
|
- Custom Fields: Dynamic fields in uniform grid layout (sorted by name)
|
||||||
- Address: street, house number, postal code, city
|
- Payment Data: Mockup section with placeholder data
|
||||||
- Status: paid flag
|
|
||||||
- Relationships: linked user account
|
|
||||||
- Custom: dynamic custom field values from CustomFields
|
|
||||||
|
|
||||||
## Navigation
|
## Navigation
|
||||||
- Back to member list
|
- Back to member list
|
||||||
|
|
@ -23,69 +20,155 @@ defmodule MvWeb.MemberLive.Show do
|
||||||
"""
|
"""
|
||||||
use MvWeb, :live_view
|
use MvWeb, :live_view
|
||||||
import Ash.Query
|
import Ash.Query
|
||||||
alias MvWeb.Helpers.DateFormatter
|
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def render(assigns) do
|
def render(assigns) do
|
||||||
~H"""
|
~H"""
|
||||||
<Layouts.app flash={@flash} current_user={@current_user}>
|
<Layouts.app flash={@flash} current_user={@current_user}>
|
||||||
<.header>
|
<%!-- Header with Back button, Name, and Edit button --%>
|
||||||
{@member.first_name} {@member.last_name}
|
<div class="flex items-center justify-between gap-4 pb-4">
|
||||||
<:subtitle>{gettext("This is a member record from your database.")}</:subtitle>
|
<.button navigate={~p"/members"} aria-label={gettext("Back to members list")}>
|
||||||
|
<.icon name="hero-arrow-left" class="size-4" />
|
||||||
|
{gettext("Back")}
|
||||||
|
</.button>
|
||||||
|
|
||||||
<:actions>
|
<h1 class="text-2xl font-bold text-center flex-1">
|
||||||
<.button navigate={~p"/members"} aria-label={gettext("Back to members list")}>
|
{@member.first_name} {@member.last_name}
|
||||||
<.icon name="hero-arrow-left" />
|
</h1>
|
||||||
<span class="sr-only">{gettext("Back to members list")}</span>
|
|
||||||
</.button>
|
|
||||||
<.button variant="primary" navigate={~p"/members/#{@member}/edit?return_to=show"}>
|
|
||||||
<.icon name="hero-pencil-square" /> {gettext("Edit Member")}
|
|
||||||
</.button>
|
|
||||||
</:actions>
|
|
||||||
</.header>
|
|
||||||
|
|
||||||
<.list>
|
<.button variant="primary" navigate={~p"/members/#{@member}/edit?return_to=show"}>
|
||||||
<:item title={gettext("Id")}>{@member.id}</:item>
|
{gettext("Edit Member")}
|
||||||
<:item title={gettext("First Name")}>{@member.first_name}</:item>
|
</.button>
|
||||||
<:item title={gettext("Last Name")}>{@member.last_name}</:item>
|
</div>
|
||||||
<:item title={gettext("Email")}>{@member.email}</:item>
|
|
||||||
<:item title={gettext("Paid")}>
|
|
||||||
{if @member.paid, do: gettext("Yes"), else: gettext("No")}
|
|
||||||
</:item>
|
|
||||||
<:item title={gettext("Phone Number")}>{@member.phone_number}</:item>
|
|
||||||
<:item title={gettext("Join Date")}>{DateFormatter.format_date(@member.join_date)}</:item>
|
|
||||||
<:item title={gettext("Exit Date")}>{DateFormatter.format_date(@member.exit_date)}</:item>
|
|
||||||
<:item title={gettext("Notes")}>{@member.notes}</:item>
|
|
||||||
<:item title={gettext("City")}>{@member.city}</:item>
|
|
||||||
<:item title={gettext("Street")}>{@member.street}</:item>
|
|
||||||
<:item title={gettext("House Number")}>{@member.house_number}</:item>
|
|
||||||
<:item title={gettext("Postal Code")}>{@member.postal_code}</:item>
|
|
||||||
<:item title={gettext("Linked User")}>
|
|
||||||
<%= if @member.user do %>
|
|
||||||
<.link
|
|
||||||
navigate={~p"/users/#{@member.user}"}
|
|
||||||
class="text-blue-600 hover:text-blue-800 underline"
|
|
||||||
>
|
|
||||||
<.icon name="hero-user" class="h-4 w-4 inline mr-1" />
|
|
||||||
{@member.user.email}
|
|
||||||
</.link>
|
|
||||||
<% else %>
|
|
||||||
<span class="text-gray-500 italic">{gettext("No user linked")}</span>
|
|
||||||
<% end %>
|
|
||||||
</:item>
|
|
||||||
</.list>
|
|
||||||
|
|
||||||
<h3 class="mt-8 mb-2 text-lg font-semibold">{gettext("Custom Field Values")}</h3>
|
<%!-- Tab Navigation --%>
|
||||||
<.generic_list items={
|
<div role="tablist" class="tabs tabs-bordered mb-6">
|
||||||
Enum.map(@member.custom_field_values, fn cfv ->
|
<button role="tab" class="tab tab-active" aria-selected="true">
|
||||||
{
|
<.icon name="hero-identification" class="size-4 mr-2" />
|
||||||
# name
|
{gettext("Contact Data")}
|
||||||
cfv.custom_field && cfv.custom_field.name,
|
</button>
|
||||||
# value
|
<button role="tab" class="tab" disabled aria-disabled="true" title={gettext("Coming soon")}>
|
||||||
format_custom_field_value(cfv)
|
<.icon name="hero-credit-card" class="size-4 mr-2" />
|
||||||
}
|
{gettext("Payments")}
|
||||||
end)
|
</button>
|
||||||
} />
|
</div>
|
||||||
|
|
||||||
|
<%!-- Personal Data and Custom Fields Row --%>
|
||||||
|
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6">
|
||||||
|
<%!-- Personal Data Section --%>
|
||||||
|
<div>
|
||||||
|
<.section_box title={gettext("Personal Data")}>
|
||||||
|
<div class="space-y-4">
|
||||||
|
<%!-- Name Row --%>
|
||||||
|
<div class="flex gap-6">
|
||||||
|
<.data_field label={gettext("First Name")} value={@member.first_name} class="w-48" />
|
||||||
|
<.data_field label={gettext("Last Name")} value={@member.last_name} class="w-48" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Address --%>
|
||||||
|
<div>
|
||||||
|
<.data_field label={gettext("Address")} value={format_address(@member)} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Email --%>
|
||||||
|
<div>
|
||||||
|
<.data_field label={gettext("Email")}>
|
||||||
|
<a
|
||||||
|
href={"mailto:#{format_email_mailto(@member.first_name, @member.last_name, @member.email)}"}
|
||||||
|
class="text-blue-700 hover:text-blue-800 underline"
|
||||||
|
>
|
||||||
|
{@member.email}
|
||||||
|
</a>
|
||||||
|
</.data_field>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Phone --%>
|
||||||
|
<div>
|
||||||
|
<.data_field label={gettext("Phone")} value={@member.phone_number} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Membership Dates Row --%>
|
||||||
|
<div class="flex gap-6">
|
||||||
|
<.data_field
|
||||||
|
label={gettext("Join Date")}
|
||||||
|
value={format_date(@member.join_date)}
|
||||||
|
class="w-28"
|
||||||
|
/>
|
||||||
|
<.data_field
|
||||||
|
label={gettext("Exit Date")}
|
||||||
|
value={format_date(@member.exit_date)}
|
||||||
|
class="w-28"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Linked User --%>
|
||||||
|
<div>
|
||||||
|
<.data_field label={gettext("Linked User")}>
|
||||||
|
<%= if @member.user do %>
|
||||||
|
<.link
|
||||||
|
navigate={~p"/users/#{@member.user}"}
|
||||||
|
class="text-blue-700 hover:text-blue-800 underline inline-flex items-center gap-1"
|
||||||
|
>
|
||||||
|
<.icon name="hero-user" class="size-4" />
|
||||||
|
{@member.user.email}
|
||||||
|
</.link>
|
||||||
|
<% else %>
|
||||||
|
<span class="text-base-content/70 italic">{gettext("No user linked")}</span>
|
||||||
|
<% end %>
|
||||||
|
</.data_field>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Notes --%>
|
||||||
|
<%= if @member.notes && String.trim(@member.notes) != "" do %>
|
||||||
|
<div>
|
||||||
|
<.data_field label={gettext("Notes")}>
|
||||||
|
<p class="whitespace-pre-wrap text-base-content/80">{@member.notes}</p>
|
||||||
|
</.data_field>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</.section_box>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Custom Fields Section --%>
|
||||||
|
<%= if Enum.any?(@member.custom_field_values) do %>
|
||||||
|
<div>
|
||||||
|
<.section_box title={gettext("Custom Fields")}>
|
||||||
|
<div class="grid grid-cols-2 gap-4">
|
||||||
|
<%= for cfv <- sort_custom_field_values(@member.custom_field_values) do %>
|
||||||
|
<% custom_field = cfv.custom_field %>
|
||||||
|
<% value_type = custom_field && custom_field.value_type %>
|
||||||
|
<.data_field label={custom_field && custom_field.name}>
|
||||||
|
{format_custom_field_value(cfv.value, value_type)}
|
||||||
|
</.data_field>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</.section_box>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<%!-- Payment Data Section (Mockup) --%>
|
||||||
|
<div class="max-w-xl">
|
||||||
|
<.section_box title={gettext("Payment Data")}>
|
||||||
|
<div role="alert" class="alert alert-info mb-4">
|
||||||
|
<.icon name="hero-information-circle" class="size-5" />
|
||||||
|
<span>{gettext("This data is for demonstration purposes only (mockup).")}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex gap-6">
|
||||||
|
<.data_field label={gettext("Contribution")} value="72 €" class="w-24" />
|
||||||
|
<.data_field label={gettext("Payment Cycle")} value={gettext("monthly")} class="w-28" />
|
||||||
|
<.data_field label={gettext("Paid")} class="w-24">
|
||||||
|
<%= if @member.paid do %>
|
||||||
|
<span class="badge badge-success">{gettext("Paid")}</span>
|
||||||
|
<% else %>
|
||||||
|
<span class="badge badge-warning">{gettext("Pending")}</span>
|
||||||
|
<% end %>
|
||||||
|
</.data_field>
|
||||||
|
</div>
|
||||||
|
</.section_box>
|
||||||
|
</div>
|
||||||
</Layouts.app>
|
</Layouts.app>
|
||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|
@ -113,16 +196,132 @@ defmodule MvWeb.MemberLive.Show do
|
||||||
defp page_title(:show), do: gettext("Show Member")
|
defp page_title(:show), do: gettext("Show Member")
|
||||||
defp page_title(:edit), do: gettext("Edit Member")
|
defp page_title(:edit), do: gettext("Edit Member")
|
||||||
|
|
||||||
defp format_custom_field_value(cfv) do
|
# -----------------------------------------------------------------
|
||||||
value =
|
# Helper Components
|
||||||
case cfv.value do
|
# -----------------------------------------------------------------
|
||||||
%{value: v} -> v
|
|
||||||
v -> v
|
|
||||||
end
|
|
||||||
|
|
||||||
case value do
|
# Renders a section box with border and title.
|
||||||
%Date{} = date -> DateFormatter.format_date(date)
|
attr :title, :string, required: true
|
||||||
other -> other
|
slot :inner_block, required: true
|
||||||
|
|
||||||
|
defp section_box(assigns) do
|
||||||
|
~H"""
|
||||||
|
<section class="mb-6">
|
||||||
|
<h2 class="text-lg font-semibold mb-3">{@title}</h2>
|
||||||
|
<div class="border border-base-300 rounded-lg p-4 bg-base-100">
|
||||||
|
{render_slot(@inner_block)}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
# Renders a labeled data field.
|
||||||
|
attr :label, :string, required: true
|
||||||
|
attr :value, :string, default: nil
|
||||||
|
attr :class, :string, default: ""
|
||||||
|
slot :inner_block
|
||||||
|
|
||||||
|
defp data_field(assigns) do
|
||||||
|
~H"""
|
||||||
|
<dl class={@class}>
|
||||||
|
<dt class="text-sm font-medium text-base-content/70">{@label}</dt>
|
||||||
|
<dd class="mt-1 text-base-content">
|
||||||
|
<%= if @inner_block != [] do %>
|
||||||
|
{render_slot(@inner_block)}
|
||||||
|
<% else %>
|
||||||
|
{display_value(@value)}
|
||||||
|
<% end %>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------
|
||||||
|
# Helper Functions
|
||||||
|
# -----------------------------------------------------------------
|
||||||
|
|
||||||
|
defp display_value(nil), do: "—"
|
||||||
|
moritz marked this conversation as resolved
Outdated
rafael
commented
For nil, this should be an empty string (this is how we do it in other parts of the UI) For nil, this should be an empty string (this is how we do it in other parts of the UI)
|
|||||||
|
defp display_value(""), do: "—"
|
||||||
|
defp display_value(value), do: value
|
||||||
|
|
||||||
|
defp format_email_mailto(first_name, last_name, email) do
|
||||||
|
moritz marked this conversation as resolved
Outdated
rafael
commented
can we move this somewhere else so we can reuse it in the member overview? can we move this somewhere else so we can reuse it in the member overview?
|
|||||||
|
name =
|
||||||
|
[first_name, last_name]
|
||||||
|
|> Enum.filter(&(&1 && &1 != ""))
|
||||||
|
|> Enum.join(" ")
|
||||||
|
|
||||||
|
if name != "" do
|
||||||
|
"#{name} <#{email}>"
|
||||||
|
else
|
||||||
|
email
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp format_address(member) do
|
||||||
|
street_part =
|
||||||
|
[member.street, member.house_number]
|
||||||
|
|> Enum.filter(&(&1 && &1 != ""))
|
||||||
|
|> Enum.join(" ")
|
||||||
|
|
||||||
|
city_part =
|
||||||
|
[member.postal_code, member.city]
|
||||||
|
|> Enum.filter(&(&1 && &1 != ""))
|
||||||
|
|> Enum.join(" ")
|
||||||
|
|
||||||
|
[street_part, city_part]
|
||||||
|
|> Enum.filter(&(&1 != ""))
|
||||||
|
|> Enum.join(", ")
|
||||||
|
|> case do
|
||||||
|
"" -> nil
|
||||||
|
address -> address
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp format_date(nil), do: nil
|
||||||
|
|
||||||
|
defp format_date(%Date{} = date) do
|
||||||
|
Calendar.strftime(date, "%d.%m.%Y")
|
||||||
|
end
|
||||||
|
|
||||||
|
defp format_date(date), do: to_string(date)
|
||||||
|
|
||||||
|
# Sorts custom field values by custom field name
|
||||||
|
defp sort_custom_field_values(custom_field_values) do
|
||||||
|
Enum.sort_by(custom_field_values, fn cfv ->
|
||||||
|
(cfv.custom_field && cfv.custom_field.name) || ""
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Formats custom field value based on type
|
||||||
|
defp format_custom_field_value(%Ash.Union{value: value, type: type}, _expected_type) do
|
||||||
|
format_custom_field_value(value, type)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp format_custom_field_value(nil, _type), do: "—"
|
||||||
|
|
||||||
|
defp format_custom_field_value(value, :boolean) when is_boolean(value) do
|
||||||
|
if value, do: gettext("Yes"), else: gettext("No")
|
||||||
|
end
|
||||||
|
|
||||||
|
defp format_custom_field_value(%Date{} = date, :date) do
|
||||||
|
Calendar.strftime(date, "%d.%m.%Y")
|
||||||
|
end
|
||||||
|
|
||||||
|
defp format_custom_field_value(value, :email) when is_binary(value) do
|
||||||
|
assigns = %{email: value}
|
||||||
|
|
||||||
|
~H"""
|
||||||
|
<a href={"mailto:#{@email}"} class="text-blue-700 hover:text-blue-800 underline">{@email}</a>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
defp format_custom_field_value(value, :integer) when is_integer(value) do
|
||||||
|
Integer.to_string(value)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp format_custom_field_value(value, _type) when is_binary(value) do
|
||||||
|
if String.trim(value) == "", do: "—", else: value
|
||||||
|
end
|
||||||
|
|
||||||
|
defp format_custom_field_value(value, _type), do: to_string(value)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -11,14 +11,13 @@
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/components/core_components.ex:387
|
#: lib/mv_web/components/core_components.ex:386
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:141
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Actions"
|
msgid "Actions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:248
|
#: lib/mv_web/live/member_live/index.html.heex:248
|
||||||
#: lib/mv_web/live/user_live/index.html.heex:71
|
#: lib/mv_web/live/user_live/index.html.heex:72
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Are you sure?"
|
msgid "Are you sure?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -29,71 +28,69 @@ msgstr ""
|
||||||
msgid "Attempting to reconnect"
|
msgid "Attempting to reconnect"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/form.ex:53
|
#: lib/mv_web/live/member_live/form.ex:100
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:184
|
#: lib/mv_web/live/member_live/index.html.heex:184
|
||||||
#: lib/mv_web/live/member_live/show.ex:59
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "City"
|
msgid "City"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:78
|
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:250
|
#: lib/mv_web/live/member_live/index.html.heex:250
|
||||||
#: lib/mv_web/live/user_live/index.html.heex:73
|
#: lib/mv_web/live/user_live/index.html.heex:74
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Delete"
|
msgid "Delete"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:66
|
#: lib/mv_web/live/member_live/form.ex:241
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:242
|
#: lib/mv_web/live/member_live/index.html.heex:242
|
||||||
#: lib/mv_web/live/user_live/form.ex:267
|
#: lib/mv_web/live/user_live/form.ex:265
|
||||||
#: lib/mv_web/live/user_live/index.html.heex:65
|
#: lib/mv_web/live/user_live/index.html.heex:66
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Edit"
|
msgid "Edit"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/show.ex:42
|
#: lib/mv_web/live/member_live/show.ex:40
|
||||||
#: lib/mv_web/live/member_live/show.ex:114
|
#: lib/mv_web/live/member_live/show.ex:197
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Edit Member"
|
msgid "Edit Member"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:58
|
#: lib/mv_web/live/member_live/form.ex:106
|
||||||
#: lib/mv_web/live/member_live/form.ex:47
|
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:112
|
#: lib/mv_web/live/member_live/index.html.heex:112
|
||||||
#: lib/mv_web/live/member_live/show.ex:51
|
#: lib/mv_web/live/member_live/show.ex:75
|
||||||
#: lib/mv_web/live/user_live/form.ex:46
|
#: lib/mv_web/live/user_live/form.ex:46
|
||||||
#: lib/mv_web/live/user_live/index.html.heex:44
|
#: lib/mv_web/live/user_live/index.html.heex:44
|
||||||
#: lib/mv_web/live/user_live/show.ex:49
|
#: lib/mv_web/live/user_live/show.ex:50
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Email"
|
msgid "Email"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/form.ex:45
|
#: lib/mv_web/live/member_live/form.ex:81
|
||||||
#: lib/mv_web/live/member_live/show.ex:49
|
#: lib/mv_web/live/member_live/show.ex:64
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "First Name"
|
msgid "First Name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/form.ex:50
|
#: lib/mv_web/live/member_live/form.ex:117
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:220
|
#: lib/mv_web/live/member_live/index.html.heex:220
|
||||||
#: lib/mv_web/live/member_live/show.ex:56
|
#: lib/mv_web/live/member_live/show.ex:93
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Join Date"
|
msgid "Join Date"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/form.ex:46
|
#: lib/mv_web/live/member_live/form.ex:84
|
||||||
#: lib/mv_web/live/member_live/show.ex:50
|
#: lib/mv_web/live/member_live/show.ex:65
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Last Name"
|
msgid "Last Name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/mv_web/live/member_live/form.ex:44
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:29
|
#: lib/mv_web/live/member_live/index.html.heex:29
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "New Member"
|
msgid "New Member"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:239
|
#: lib/mv_web/live/member_live/index.html.heex:239
|
||||||
#: lib/mv_web/live/user_live/index.html.heex:62
|
#: lib/mv_web/live/user_live/index.html.heex:63
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Show"
|
msgid "Show"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -113,52 +110,45 @@ msgstr ""
|
||||||
msgid "close"
|
msgid "close"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/form.ex:51
|
#: lib/mv_web/live/member_live/form.ex:120
|
||||||
#: lib/mv_web/live/member_live/show.ex:57
|
#: lib/mv_web/live/member_live/show.ex:98
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Exit Date"
|
msgid "Exit Date"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/form.ex:55
|
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:148
|
#: lib/mv_web/live/member_live/index.html.heex:148
|
||||||
#: lib/mv_web/live/member_live/show.ex:61
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "House Number"
|
msgid "House Number"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:140
|
#: lib/mv_web/live/member_live/form.ex:126
|
||||||
#: lib/mv_web/live/member_live/form.ex:52
|
#: lib/mv_web/live/member_live/show.ex:124
|
||||||
#: lib/mv_web/live/member_live/show.ex:58
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Notes"
|
msgid "Notes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/components/payment_filter_component.ex:94
|
#: lib/mv_web/live/components/payment_filter_component.ex:94
|
||||||
#: lib/mv_web/live/components/payment_filter_component.ex:144
|
#: lib/mv_web/live/components/payment_filter_component.ex:144
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:186
|
#: lib/mv_web/live/member_live/form.ex:199
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:241
|
|
||||||
#: lib/mv_web/live/member_live/form.ex:48
|
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:229
|
#: lib/mv_web/live/member_live/index.html.heex:229
|
||||||
#: lib/mv_web/live/member_live/show.ex:52
|
#: lib/mv_web/live/member_live/show.ex:162
|
||||||
|
#: lib/mv_web/live/member_live/show.ex:164
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Paid"
|
msgid "Paid"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/form.ex:49
|
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:202
|
#: lib/mv_web/live/member_live/index.html.heex:202
|
||||||
#: lib/mv_web/live/member_live/show.ex:55
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Phone Number"
|
msgid "Phone Number"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/form.ex:56
|
#: lib/mv_web/live/member_live/form.ex:97
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:166
|
#: lib/mv_web/live/member_live/index.html.heex:166
|
||||||
#: lib/mv_web/live/member_live/show.ex:62
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Postal Code"
|
msgid "Postal Code"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/form.ex:79
|
#: lib/mv_web/live/member_live/form.ex:211
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Save Member"
|
msgid "Save Member"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -166,58 +156,48 @@ msgstr ""
|
||||||
#: lib/mv_web/live/custom_field_live/form.ex:66
|
#: lib/mv_web/live/custom_field_live/form.ex:66
|
||||||
#: lib/mv_web/live/custom_field_value_live/form.ex:74
|
#: lib/mv_web/live/custom_field_value_live/form.ex:74
|
||||||
#: lib/mv_web/live/global_settings_live.ex:55
|
#: lib/mv_web/live/global_settings_live.ex:55
|
||||||
#: lib/mv_web/live/member_live/form.ex:78
|
#: lib/mv_web/live/member_live/form.ex:48
|
||||||
#: lib/mv_web/live/user_live/form.ex:249
|
#: lib/mv_web/live/member_live/form.ex:210
|
||||||
|
#: lib/mv_web/live/user_live/form.ex:248
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Saving..."
|
msgid "Saving..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/form.ex:54
|
#: lib/mv_web/live/member_live/form.ex:91
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:130
|
#: lib/mv_web/live/member_live/index.html.heex:130
|
||||||
#: lib/mv_web/live/member_live/show.ex:60
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Street"
|
msgid "Street"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/show.ex:48
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Id"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:234
|
#: lib/mv_web/live/member_live/index.html.heex:234
|
||||||
#: lib/mv_web/live/member_live/index/formatter.ex:62
|
#: lib/mv_web/live/member_live/index/formatter.ex:61
|
||||||
#: lib/mv_web/live/member_live/show.ex:53
|
#: lib/mv_web/live/member_live/show.ex:303
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/show.ex:113
|
#: lib/mv_web/live/member_live/show.ex:196
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Show Member"
|
msgid "Show Member"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/show.ex:34
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "This is a member record from your database."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:234
|
#: lib/mv_web/live/member_live/index.html.heex:234
|
||||||
#: lib/mv_web/live/member_live/index/formatter.ex:61
|
#: lib/mv_web/live/member_live/index/formatter.ex:60
|
||||||
#: lib/mv_web/live/member_live/show.ex:53
|
#: lib/mv_web/live/member_live/show.ex:303
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Yes"
|
msgid "Yes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/custom_field_live/form.ex:110
|
#: lib/mv_web/live/custom_field_live/form.ex:110
|
||||||
#: lib/mv_web/live/custom_field_value_live/form.ex:233
|
#: lib/mv_web/live/custom_field_value_live/form.ex:233
|
||||||
#: lib/mv_web/live/member_live/form.ex:137
|
#: lib/mv_web/live/member_live/form.ex:269
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "create"
|
msgid "create"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/custom_field_live/form.ex:111
|
#: lib/mv_web/live/custom_field_live/form.ex:111
|
||||||
#: lib/mv_web/live/custom_field_value_live/form.ex:234
|
#: lib/mv_web/live/custom_field_value_live/form.ex:234
|
||||||
#: lib/mv_web/live/member_live/form.ex:138
|
#: lib/mv_web/live/member_live/form.ex:270
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "update"
|
msgid "update"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -227,7 +207,7 @@ msgstr ""
|
||||||
msgid "Incorrect email or password"
|
msgid "Incorrect email or password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/form.ex:144
|
#: lib/mv_web/live/member_live/form.ex:276
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Member %{action} successfully"
|
msgid "Member %{action} successfully"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -260,8 +240,8 @@ msgstr ""
|
||||||
#: lib/mv_web/live/custom_field_live/form.ex:69
|
#: lib/mv_web/live/custom_field_live/form.ex:69
|
||||||
#: lib/mv_web/live/custom_field_live/index.ex:120
|
#: lib/mv_web/live/custom_field_live/index.ex:120
|
||||||
#: lib/mv_web/live/custom_field_value_live/form.ex:77
|
#: lib/mv_web/live/custom_field_value_live/form.ex:77
|
||||||
#: lib/mv_web/live/member_live/form.ex:81
|
#: lib/mv_web/live/member_live/form.ex:208
|
||||||
#: lib/mv_web/live/user_live/form.ex:252
|
#: lib/mv_web/live/user_live/form.ex:251
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -281,17 +261,22 @@ msgstr ""
|
||||||
msgid "Edit User"
|
msgid "Edit User"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/user_live/show.ex:51
|
#: lib/mv_web/live/user_live/show.ex:53
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/mv_web/live/user_live/show.ex:49
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/custom_field_live/form.ex:62
|
#: lib/mv_web/live/custom_field_live/form.ex:62
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Immutable"
|
msgid "Immutable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/components/layouts/navbar.ex:113
|
#: lib/mv_web/components/layouts/navbar.ex:102
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Logout"
|
msgid "Logout"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -303,19 +288,18 @@ msgid "Listing Users"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/custom_field_value_live/form.ex:60
|
#: lib/mv_web/live/custom_field_value_live/form.ex:60
|
||||||
|
#: lib/mv_web/live/member_live/form.ex:242
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Member"
|
msgid "Member"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/components/layouts/navbar.ex:25
|
#: lib/mv_web/components/layouts/navbar.ex:25
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:61
|
#: lib/mv_web/live/member_live/index.ex:73
|
||||||
#: lib/mv_web/live/member_live/index.ex:74
|
|
||||||
#: lib/mv_web/live/member_live/index.html.heex:3
|
#: lib/mv_web/live/member_live/index.html.heex:3
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Members"
|
msgid "Members"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:48
|
|
||||||
#: lib/mv_web/live/custom_field_live/form.ex:51
|
#: lib/mv_web/live/custom_field_live/form.ex:51
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Name"
|
msgid "Name"
|
||||||
|
|
@ -326,12 +310,16 @@ msgstr ""
|
||||||
msgid "New User"
|
msgid "New User"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/user_live/show.ex:51
|
#: lib/mv_web/live/user_live/show.ex:53
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Not enabled"
|
msgid "Not enabled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:207
|
#: lib/mv_web/live/user_live/show.ex:51
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Not set"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/user_live/form.ex:107
|
#: lib/mv_web/live/user_live/form.ex:107
|
||||||
#: lib/mv_web/live/user_live/form.ex:115
|
#: lib/mv_web/live/user_live/form.ex:115
|
||||||
#: lib/mv_web/live/user_live/form.ex:224
|
#: lib/mv_web/live/user_live/form.ex:224
|
||||||
|
|
@ -339,12 +327,18 @@ msgstr ""
|
||||||
msgid "Note"
|
msgid "Note"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/user_live/show.ex:50
|
#: lib/mv_web/live/user_live/index.html.heex:52
|
||||||
|
#: lib/mv_web/live/user_live/show.ex:51
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "OIDC ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/mv_web/live/user_live/show.ex:52
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Password Authentication"
|
msgid "Password Authentication"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/components/layouts/navbar.ex:106
|
#: lib/mv_web/components/layouts/navbar.ex:95
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Profil"
|
msgid "Profil"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -364,17 +358,17 @@ msgstr ""
|
||||||
msgid "Select member"
|
msgid "Select member"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/components/layouts/navbar.ex:110
|
#: lib/mv_web/components/layouts/navbar.ex:99
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/user_live/form.ex:250
|
#: lib/mv_web/live/user_live/form.ex:249
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Save User"
|
msgid "Save User"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/user_live/show.ex:77
|
#: lib/mv_web/live/user_live/show.ex:79
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Show User"
|
msgid "Show User"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -394,7 +388,7 @@ msgstr ""
|
||||||
msgid "Use this form to manage user records in your database."
|
msgid "Use this form to manage user records in your database."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/user_live/form.ex:268
|
#: lib/mv_web/live/user_live/form.ex:266
|
||||||
#: lib/mv_web/live/user_live/show.ex:34
|
#: lib/mv_web/live/user_live/show.ex:34
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "User"
|
msgid "User"
|
||||||
|
|
@ -422,7 +416,8 @@ msgstr ""
|
||||||
msgid "descending"
|
msgid "descending"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/user_live/form.ex:267
|
#: lib/mv_web/live/member_live/form.ex:241
|
||||||
|
#: lib/mv_web/live/user_live/form.ex:265
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "New"
|
msgid "New"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -498,30 +493,29 @@ msgid "User will be created without a password. Check 'Set Password' to add one.
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/user_live/form.ex:126
|
#: lib/mv_web/live/user_live/form.ex:126
|
||||||
#: lib/mv_web/live/user_live/index.html.heex:52
|
#: lib/mv_web/live/user_live/index.html.heex:53
|
||||||
#: lib/mv_web/live/user_live/show.ex:53
|
#: lib/mv_web/live/user_live/show.ex:55
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Linked Member"
|
msgid "Linked Member"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/show.ex:63
|
#: lib/mv_web/live/member_live/show.ex:106
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Linked User"
|
msgid "Linked User"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/user_live/index.html.heex:56
|
#: lib/mv_web/live/user_live/index.html.heex:57
|
||||||
#: lib/mv_web/live/user_live/show.ex:63
|
#: lib/mv_web/live/user_live/show.ex:65
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No member linked"
|
msgid "No member linked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/show.ex:73
|
#: lib/mv_web/live/member_live/show.ex:116
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No user linked"
|
msgid "No user linked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/show.ex:37
|
#: lib/mv_web/live/member_live/show.ex:30
|
||||||
#: lib/mv_web/live/member_live/show.ex:39
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Back to members list"
|
msgid "Back to members list"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -532,14 +526,14 @@ msgstr ""
|
||||||
msgid "Back to users list"
|
msgid "Back to users list"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/components/layouts/navbar.ex:44
|
#: lib/mv_web/components/layouts/navbar.ex:33
|
||||||
#: lib/mv_web/components/layouts/navbar.ex:50
|
#: lib/mv_web/components/layouts/navbar.ex:39
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Select language"
|
msgid "Select language"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/components/layouts/navbar.ex:57
|
#: lib/mv_web/components/layouts/navbar.ex:46
|
||||||
#: lib/mv_web/components/layouts/navbar.ex:77
|
#: lib/mv_web/components/layouts/navbar.ex:66
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Toggle dark mode"
|
msgid "Toggle dark mode"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -602,12 +596,6 @@ msgstr ""
|
||||||
msgid "Choose a custom field"
|
msgid "Choose a custom field"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/form.ex:58
|
|
||||||
#: lib/mv_web/live/member_live/show.ex:78
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Custom Field Values"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/custom_field_value_live/form.ex:51
|
#: lib/mv_web/live/custom_field_value_live/form.ex:51
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Custom field"
|
msgid "Custom field"
|
||||||
|
|
@ -644,6 +632,8 @@ msgid "Use this form to manage custom_field records in your database."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/components/layouts/navbar.ex:26
|
#: lib/mv_web/components/layouts/navbar.ex:26
|
||||||
|
#: lib/mv_web/live/member_live/form.ex:135
|
||||||
|
#: lib/mv_web/live/member_live/show.ex:136
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Custom Fields"
|
msgid "Custom Fields"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -711,7 +701,6 @@ msgstr ""
|
||||||
msgid "Manage global settings for the association."
|
msgid "Manage global settings for the association."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:102
|
|
||||||
#: lib/mv_web/live/global_settings_live.ex:56
|
#: lib/mv_web/live/global_settings_live.ex:56
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Save Settings"
|
msgid "Save Settings"
|
||||||
|
|
@ -732,7 +721,7 @@ msgstr ""
|
||||||
msgid "Available members"
|
msgid "Available members"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/user_live/form.ex:359
|
#: lib/mv_web/live/user_live/form.ex:357
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Failed to link member: %{error}"
|
msgid "Failed to link member: %{error}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -772,7 +761,7 @@ msgstr ""
|
||||||
msgid "Unlinking scheduled"
|
msgid "Unlinking scheduled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/index.ex:160
|
#: lib/mv_web/live/member_live/index.ex:159
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Copied %{count} email address to clipboard"
|
msgid "Copied %{count} email address to clipboard"
|
||||||
msgid_plural "Copied %{count} email addresses to clipboard"
|
msgid_plural "Copied %{count} email addresses to clipboard"
|
||||||
|
|
@ -789,12 +778,12 @@ msgstr ""
|
||||||
msgid "Copy emails"
|
msgid "Copy emails"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/index.ex:149
|
#: lib/mv_web/live/member_live/index.ex:148
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No email addresses found"
|
msgid "No email addresses found"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/index.ex:146
|
#: lib/mv_web/live/member_live/index.ex:145
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No members selected"
|
msgid "No members selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -809,16 +798,11 @@ msgstr ""
|
||||||
msgid "Open in email program"
|
msgid "Open in email program"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/index.ex:169
|
#: lib/mv_web/live/member_live/index.ex:168
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Tip: Paste email addresses into the BCC field for privacy compliance"
|
msgid "Tip: Paste email addresses into the BCC field for privacy compliance"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/member_live/form.ex:40
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Fields marked with an asterisk (*) cannot be empty."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/components/core_components.ex:206
|
#: lib/mv_web/components/core_components.ex:206
|
||||||
#: lib/mv_web/components/core_components.ex:223
|
#: lib/mv_web/components/core_components.ex:223
|
||||||
#: lib/mv_web/components/core_components.ex:250
|
#: lib/mv_web/components/core_components.ex:250
|
||||||
|
|
@ -849,428 +833,93 @@ msgstr ""
|
||||||
msgid "Payment filter"
|
msgid "Payment filter"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:107
|
#: lib/mv_web/live/member_live/show.ex:70
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{count} period selected"
|
msgid "Address"
|
||||||
msgid_plural "%{count} periods selected"
|
|
||||||
msgstr[0] ""
|
|
||||||
msgstr[1] ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:113
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "About Contribution Types"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:138
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:53
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Amount"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:48
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Back to Settings"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:124
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Can be changed at any time. Amount changes affect future periods only."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:77
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Cannot delete - members assigned"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:83
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Change Contribution Type"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:42
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Configure global settings for membership contributions."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/components/layouts/navbar.ex:34
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:27
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:40
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Contribution Settings"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:62
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Contribution Start"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/components/layouts/navbar.ex:32
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:25
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:36
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Contribution Types"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:224
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Contribution start"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:41
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Contribution type"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:117
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Contribution types define different membership fee structures. Each type has a fixed interval (monthly, quarterly, half-yearly, yearly) that cannot be changed after creation."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/components/layouts/navbar.ex:30
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Contributions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:39
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Contributions for %{name}"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:159
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Current"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:60
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Default Contribution Type"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:133
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Deletion"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:173
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Example: Member Contribution View"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:113
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Examples"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:262
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:172
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Family"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:128
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Fixed after creation. Members can only switch between types with the same interval."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:228
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Generated periods"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:52
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Global Settings"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:343
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:275
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:203
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Half-yearly"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:181
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Half-yearly contribution for supporting members"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:87
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:188
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Honorary"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:85
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Include joining period"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:137
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:57
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:127
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Interval"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:220
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Joining date"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:331
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Joining year - reduced to 0"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:38
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Manage contribution types for membership fees."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:116
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Mark as Paid"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:120
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Mark as Suspended"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:124
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Mark as Unpaid"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:26
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Member Contributions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:122
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Member pays for the year they joined"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:155
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Member pays from the joining month"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:144
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Member pays from the next full quarter"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:133
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Member pays from the next full year"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:43
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Member since"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:92
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Members can only switch between contribution types with the same payment interval (e.g., yearly to yearly). This prevents complex period overlaps."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:341
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:273
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:201
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Monthly"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:150
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Monthly Interval - Joining Period Included"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:165
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Monthly fee for students and trainees"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:123
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Name & Amount"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:42
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "New Contribution Type"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:189
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "No fee for honorary members"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:134
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Only possible if no members are assigned to this type."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:70
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Open Contributions"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:301
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Paid via bank transfer"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:225
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:197
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:97
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Preview Mockup"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:342
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:274
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:202
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Quarterly"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:139
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Quarterly Interval - Joining Period Excluded"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:173
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Quarterly fee for family memberships"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:86
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:250
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:156
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Reduced"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:157
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Reduced fee for unemployed, pensioners, or low income"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:275
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:244
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:148
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Regular"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:204
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Reopen"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:176
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "See how the contribution periods will be displayed for an individual member. This example shows Maria Weber with multiple contribution periods."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:149
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Standard membership fee for regular members"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:139
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Status"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:256
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:164
|
|
||||||
#, elixir-autogen, elixir-format
|
|
||||||
msgid "Student"
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:180
|
#: lib/mv_web/live/member_live/form.ex:37
|
||||||
|
#: lib/mv_web/live/member_live/show.ex:32
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Supporting Member"
|
msgid "Back"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:195
|
#: lib/mv_web/live/member_live/form.ex:65
|
||||||
|
#: lib/mv_web/live/member_live/show.ex:50
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Suspend"
|
msgid "Coming soon"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:259
|
#: lib/mv_web/live/member_live/form.ex:57
|
||||||
|
#: lib/mv_web/live/member_live/show.ex:48
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Suspended"
|
msgid "Contact Data"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:69
|
#: lib/mv_web/live/member_live/form.ex:175
|
||||||
|
#: lib/mv_web/live/member_live/show.ex:160
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "This contribution type is automatically assigned to all new members. Can be changed individually per member."
|
msgid "Contribution"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:227
|
#: lib/mv_web/live/member_live/form.ex:94
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:199
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:99
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "This page is not functional and only displays the planned features."
|
msgid "Nr."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:136
|
#: lib/mv_web/live/member_live/form.ex:186
|
||||||
|
#: lib/mv_web/live/member_live/show.ex:161
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Time Period"
|
msgid "Payment Cycle"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:66
|
#: lib/mv_web/live/member_live/form.ex:166
|
||||||
|
#: lib/mv_web/live/member_live/show.ex:153
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Total Contributions"
|
msgid "Payment Data"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:250
|
#: lib/mv_web/live/member_live/form.ex:68
|
||||||
|
#: lib/mv_web/live/member_live/show.ex:52
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Unpaid"
|
msgid "Payments"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:183
|
#: lib/mv_web/live/member_live/show.ex:166
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "View Example Member"
|
msgid "Pending"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:90
|
#: lib/mv_web/live/member_live/form.ex:76
|
||||||
|
#: lib/mv_web/live/member_live/show.ex:60
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "When active: Members pay from the period of their joining."
|
msgid "Personal Data"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:93
|
#: lib/mv_web/live/member_live/form.ex:111
|
||||||
|
#: lib/mv_web/live/member_live/show.ex:87
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "When inactive: Members pay from the next full period after joining."
|
msgid "Phone"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:98
|
#: lib/mv_web/live/member_live/form.ex:49
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Why are not all contribution types shown?"
|
msgid "Save"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:85
|
#: lib/mv_web/live/member_live/form.ex:169
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:86
|
#: lib/mv_web/live/member_live/show.ex:156
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:87
|
|
||||||
#: lib/mv_web/live/contribution_period_live/show.ex:344
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:276
|
|
||||||
#: lib/mv_web/live/contribution_type_live/index.ex:204
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Yearly"
|
msgid "This data is for demonstration purposes only (mockup)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:128
|
#: lib/mv_web/live/member_live/form.ex:190
|
||||||
|
#: lib/mv_web/live/member_live/show.ex:161
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Yearly Interval - Joining Period Excluded"
|
msgid "monthly"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/mv_web/live/contribution_settings_live.ex:117
|
#: lib/mv_web/live/member_live/form.ex:194
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Yearly Interval - Joining Period Included"
|
msgid "yearly"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue
I think these tabs are confusing at the moment.