From 483854ea65e65c8aa120e01e9d615a7e37cb074b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20Eppl=C3=A9e?= Date: Tue, 2 Dec 2025 19:24:45 +0100 Subject: [PATCH] Move custom fields to global admin settings --- lib/mv_web/components/layouts/navbar.ex | 2 +- lib/mv_web/live/custom_field_live/form.ex | 142 ---------- .../live/custom_field_live/form_component.ex | 122 ++++++++ lib/mv_web/live/custom_field_live/index.ex | 199 ------------- .../live/custom_field_live/index_component.ex | 259 +++++++++++++++++ lib/mv_web/live/custom_field_live/show.ex | 75 ----- lib/mv_web/live/global_settings_live.ex | 47 ++- lib/mv_web/router.ex | 6 - priv/gettext/de/LC_MESSAGES/default.po | 258 ++++++++++------- priv/gettext/default.pot | 242 +++++++++------- priv/gettext/en/LC_MESSAGES/default.po | 268 +++++++++++------- .../member_field_visibility_test.exs | 14 - .../live/custom_field_live/deletion_test.exs | 77 ++--- test/mv_web/live/profile_navigation_test.exs | 2 - 14 files changed, 921 insertions(+), 792 deletions(-) delete mode 100644 lib/mv_web/live/custom_field_live/form.ex create mode 100644 lib/mv_web/live/custom_field_live/form_component.ex delete mode 100644 lib/mv_web/live/custom_field_live/index.ex create mode 100644 lib/mv_web/live/custom_field_live/index_component.ex delete mode 100644 lib/mv_web/live/custom_field_live/show.ex delete mode 100644 test/membership/member_field_visibility_test.exs diff --git a/lib/mv_web/components/layouts/navbar.ex b/lib/mv_web/components/layouts/navbar.ex index 7ff7f25..acbed90 100644 --- a/lib/mv_web/components/layouts/navbar.ex +++ b/lib/mv_web/components/layouts/navbar.ex @@ -23,7 +23,7 @@ defmodule MvWeb.Layouts.Navbar do {@club_name} diff --git a/lib/mv_web/live/custom_field_live/form.ex b/lib/mv_web/live/custom_field_live/form.ex deleted file mode 100644 index 99317a9..0000000 --- a/lib/mv_web/live/custom_field_live/form.ex +++ /dev/null @@ -1,142 +0,0 @@ -defmodule MvWeb.CustomFieldLive.Form do - @moduledoc """ - LiveView form for creating and editing custom fields (admin). - - ## Features - - Create new custom field definitions - - Edit existing custom fields - - Select value type from supported types - - Set immutable and required flags - - Real-time validation - - ## Form Fields - **Required:** - - name - Unique identifier (e.g., "phone_mobile", "emergency_contact") - - value_type - Data type (:string, :integer, :boolean, :date, :email) - - **Optional:** - - description - Human-readable explanation - - immutable - If true, values cannot be changed after creation (default: false) - - required - If true, all members must have this custom field (default: false) - - show_in_overview - If true, this custom field will be displayed in the member overview table (default: true) - - ## Value Type Selection - - `:string` - Text data (unlimited length) - - `:integer` - Numeric data - - `:boolean` - True/false flags - - `:date` - Date values - - `:email` - Validated email addresses - - ## Events - - `validate` - Real-time form validation - - `save` - Submit form (create or update custom field) - - ## Security - Custom field management is restricted to admin users. - """ - use MvWeb, :live_view - - @impl true - def render(assigns) do - ~H""" - - <.header> - {@page_title} - <:subtitle> - {gettext("Use this form to manage custom_field records in your database.")} - - - - <.form for={@form} id="custom_field-form" phx-change="validate" phx-submit="save"> - <.input field={@form[:name]} type="text" label={gettext("Name")} /> - - <.input - field={@form[:value_type]} - type="select" - label={gettext("Value type")} - options={ - Ash.Resource.Info.attribute(Mv.Membership.CustomField, :value_type).constraints[:one_of] - } - /> - <.input field={@form[:description]} type="text" label={gettext("Description")} /> - <.input field={@form[:immutable]} type="checkbox" label={gettext("Immutable")} /> - <.input field={@form[:required]} type="checkbox" label={gettext("Required")} /> - <.input field={@form[:show_in_overview]} type="checkbox" label={gettext("Show in overview")} /> - - <.button phx-disable-with={gettext("Saving...")} variant="primary"> - {gettext("Save Custom field")} - - <.button navigate={return_path(@return_to, @custom_field)}>{gettext("Cancel")} - - - """ - end - - @impl true - def mount(params, _session, socket) do - custom_field = - case params["id"] do - nil -> nil - id -> Ash.get!(Mv.Membership.CustomField, id) - end - - action = if is_nil(custom_field), do: "New", else: "Edit" - page_title = action <> " " <> "Custom field" - - {:ok, - socket - |> assign(:return_to, return_to(params["return_to"])) - |> assign(custom_field: custom_field) - |> assign(:page_title, page_title) - |> assign_form()} - end - - defp return_to("show"), do: "show" - defp return_to(_), do: "index" - - @impl true - def handle_event("validate", %{"custom_field" => custom_field_params}, socket) do - {:noreply, - assign(socket, form: AshPhoenix.Form.validate(socket.assigns.form, custom_field_params))} - end - - def handle_event("save", %{"custom_field" => custom_field_params}, socket) do - case AshPhoenix.Form.submit(socket.assigns.form, params: custom_field_params) do - {:ok, custom_field} -> - notify_parent({:saved, custom_field}) - - action = - case socket.assigns.form.source.type do - :create -> gettext("create") - :update -> gettext("update") - other -> to_string(other) - end - - socket = - socket - |> put_flash(:info, gettext("Custom field %{action} successfully", action: action)) - |> push_navigate(to: return_path(socket.assigns.return_to, custom_field)) - - {:noreply, socket} - - {:error, form} -> - {:noreply, assign(socket, form: form)} - end - end - - defp notify_parent(msg), do: send(self(), {__MODULE__, msg}) - - defp assign_form(%{assigns: %{custom_field: custom_field}} = socket) do - form = - if custom_field do - AshPhoenix.Form.for_update(custom_field, :update, as: "custom_field") - else - AshPhoenix.Form.for_create(Mv.Membership.CustomField, :create, as: "custom_field") - end - - assign(socket, form: to_form(form)) - end - - defp return_path("index", _custom_field), do: ~p"/custom_fields" - defp return_path("show", custom_field), do: ~p"/custom_fields/#{custom_field.id}" -end diff --git a/lib/mv_web/live/custom_field_live/form_component.ex b/lib/mv_web/live/custom_field_live/form_component.ex new file mode 100644 index 0000000..3c1b8d0 --- /dev/null +++ b/lib/mv_web/live/custom_field_live/form_component.ex @@ -0,0 +1,122 @@ +defmodule MvWeb.CustomFieldLive.FormComponent do + @moduledoc """ + LiveComponent form for creating and editing custom fields (embedded in settings). + + ## Features + - Create new custom field definitions + - Edit existing custom fields + - Select value type from supported types + - Set immutable and required flags + - Real-time validation + + ## Props + - `custom_field` - The custom field to edit (nil for new) + - `on_save` - Callback function to call when form is saved + - `on_cancel` - Callback function to call when form is cancelled + """ + use MvWeb, :live_component + + @impl true + def render(assigns) do + ~H""" +
+
+
+ <.button type="button" phx-click="cancel" phx-target={@myself} aria-label={gettext("Back to custom field overview")}> + <.icon name="hero-arrow-left" class="w-4 h-4" /> + +

+ {if @custom_field, do: gettext("Edit Custom Field"), else: gettext("New Custom Field")} +

+
+ + <.form + for={@form} + id={@id <> "-form"} + phx-change="validate" + phx-submit="save" + phx-target={@myself} + > + <.input field={@form[:name]} type="text" label={gettext("Name")} /> + + <.input + field={@form[:value_type]} + type="select" + label={gettext("Value type")} + options={ + Ash.Resource.Info.attribute(Mv.Membership.CustomField, :value_type).constraints[:one_of] + } + /> + <.input field={@form[:description]} type="text" label={gettext("Description")} /> + <.input field={@form[:immutable]} type="checkbox" label={gettext("Immutable")} /> + <.input field={@form[:required]} type="checkbox" label={gettext("Required")} /> + <.input + field={@form[:show_in_overview]} + type="checkbox" + label={gettext("Show in overview")} + /> + +
+ <.button type="button" phx-click="cancel" phx-target={@myself}> + {gettext("Cancel")} + + <.button phx-disable-with={gettext("Saving...")} variant="primary"> + {gettext("Save Custom field")} + +
+ +
+
+ """ + end + + @impl true + def update(assigns, socket) do + {:ok, + socket + |> assign(assigns) + |> assign_form()} + end + + @impl true + def handle_event("validate", %{"custom_field" => custom_field_params}, socket) do + {:noreply, + assign(socket, form: AshPhoenix.Form.validate(socket.assigns.form, custom_field_params))} + end + + @impl true + def handle_event("save", %{"custom_field" => custom_field_params}, socket) do + case AshPhoenix.Form.submit(socket.assigns.form, params: custom_field_params) do + {:ok, custom_field} -> + action = + case socket.assigns.form.source.type do + :create -> gettext("create") + :update -> gettext("update") + other -> to_string(other) + end + + socket.assigns.on_save.(custom_field, action) + {:noreply, socket} + + {:error, form} -> + {:noreply, assign(socket, form: form)} + end + end + + @impl true + def handle_event("cancel", _params, socket) do + socket.assigns.on_cancel.() + {:noreply, socket} + end + + defp assign_form(%{assigns: %{custom_field: custom_field}} = socket) do + form = + if custom_field do + AshPhoenix.Form.for_update(custom_field, :update, as: "custom_field") + else + AshPhoenix.Form.for_create(Mv.Membership.CustomField, :create, as: "custom_field") + end + + assign(socket, form: to_form(form)) + end +end diff --git a/lib/mv_web/live/custom_field_live/index.ex b/lib/mv_web/live/custom_field_live/index.ex deleted file mode 100644 index f711323..0000000 --- a/lib/mv_web/live/custom_field_live/index.ex +++ /dev/null @@ -1,199 +0,0 @@ -defmodule MvWeb.CustomFieldLive.Index do - @moduledoc """ - LiveView for managing custom field definitions (admin). - - ## Features - - List all custom fields - - Display type information (name, value type, description) - - Show immutable and required flags - - Create new custom fields - - Edit existing custom fields - - Delete custom fields with confirmation (cascades to all custom field values) - - ## Displayed Information - - Name: Unique identifier for the custom field - - Value type: Data type constraint (string, integer, boolean, date, email) - - Description: Human-readable explanation - - Immutable: Whether custom field values can be changed after creation - - Required: Whether all members must have this custom field (future feature) - - ## Events - - `prepare_delete` - Opens deletion confirmation modal with member count - - `confirm_delete` - Executes deletion after slug verification - - `cancel_delete` - Cancels deletion and closes modal - - `update_slug_confirmation` - Updates slug input state - - ## Security - Custom field management is restricted to admin users. - Deletion requires entering the custom field's slug to prevent accidental deletions. - """ - use MvWeb, :live_view - - @impl true - def render(assigns) do - ~H""" - - <.header> - Listing Custom fields - <:actions> - <.button variant="primary" navigate={~p"/custom_fields/new"}> - <.icon name="hero-plus" /> New Custom field - - - - - <.table - id="custom_fields" - rows={@streams.custom_fields} - row_click={fn {_id, custom_field} -> JS.navigate(~p"/custom_fields/#{custom_field}") end} - > - <:col :let={{_id, custom_field}} label="Name">{custom_field.name} - - <:col :let={{_id, custom_field}} label="Description">{custom_field.description} - - <:action :let={{_id, custom_field}}> -
- <.link navigate={~p"/custom_fields/#{custom_field}"}>Show -
- - <.link navigate={~p"/custom_fields/#{custom_field}/edit"}>Edit - - - <:action :let={{_id, custom_field}}> - <.link phx-click={JS.push("prepare_delete", value: %{id: custom_field.id})}> - Delete - - - - - <%!-- Delete Confirmation Modal --%> - - - -
- """ - end - - @impl true - def mount(_params, _session, socket) do - {:ok, - socket - |> assign(:page_title, "Listing Custom fields") - |> assign(:show_delete_modal, false) - |> assign(:custom_field_to_delete, nil) - |> assign(:slug_confirmation, "") - |> stream(:custom_fields, Ash.read!(Mv.Membership.CustomField))} - end - - @impl true - def handle_event("prepare_delete", %{"id" => id}, socket) do - custom_field = Ash.get!(Mv.Membership.CustomField, id, load: [:assigned_members_count]) - - {:noreply, - socket - |> assign(:custom_field_to_delete, custom_field) - |> assign(:show_delete_modal, true) - |> assign(:slug_confirmation, "")} - end - - @impl true - def handle_event("update_slug_confirmation", %{"slug" => slug}, socket) do - {:noreply, assign(socket, :slug_confirmation, slug)} - end - - @impl true - def handle_event("confirm_delete", _params, socket) do - custom_field = socket.assigns.custom_field_to_delete - - if socket.assigns.slug_confirmation == custom_field.slug do - # Delete the custom field (CASCADE will handle custom field values) - case Ash.destroy(custom_field) do - :ok -> - {:noreply, - socket - |> put_flash(:info, "Custom field deleted successfully") - |> assign(:show_delete_modal, false) - |> assign(:custom_field_to_delete, nil) - |> assign(:slug_confirmation, "") - |> stream_delete(:custom_fields, custom_field)} - - {:error, error} -> - {:noreply, - socket - |> put_flash(:error, "Failed to delete custom field: #{inspect(error)}")} - end - else - {:noreply, - socket - |> put_flash(:error, "Slug does not match. Deletion cancelled.")} - end - end - - @impl true - def handle_event("cancel_delete", _params, socket) do - {:noreply, - socket - |> assign(:show_delete_modal, false) - |> assign(:custom_field_to_delete, nil) - |> assign(:slug_confirmation, "")} - end -end diff --git a/lib/mv_web/live/custom_field_live/index_component.ex b/lib/mv_web/live/custom_field_live/index_component.ex new file mode 100644 index 0000000..9b8ff0d --- /dev/null +++ b/lib/mv_web/live/custom_field_live/index_component.ex @@ -0,0 +1,259 @@ +defmodule MvWeb.CustomFieldLive.IndexComponent do + @moduledoc """ + LiveComponent for managing custom field definitions (embedded in settings). + + ## Features + - List all custom fields + - Display type information (name, value type, description) + - Show immutable and required flags + - Create new custom fields + - Edit existing custom fields + - Delete custom fields with confirmation (cascades to all custom field values) + """ + use MvWeb, :live_component + + @impl true + def render(assigns) do + ~H""" +
+ <.header> + {gettext("Custom Fields")} + <:subtitle> + {gettext("These will appear in addition to other data when adding new members.")} + + <:actions> + <.button variant="primary" phx-click="new_custom_field" phx-target={@myself}> + <.icon name="hero-plus" /> {gettext("New Custom field")} + + + + + <%!-- Show form when creating or editing --%> +
+ <.live_component + module={MvWeb.CustomFieldLive.FormComponent} + id={@form_id} + custom_field={@editing_custom_field} + on_save={fn custom_field, action -> send(self(), {:custom_field_saved, custom_field, action}) end} + on_cancel={fn -> send_update(__MODULE__, id: @id, show_form: false) end} + /> +
+ + <%!-- Hide table when form is visible --%> + <.table + :if={!@show_form} + id="custom_fields" + rows={@streams.custom_fields} + row_click={ + fn {_id, custom_field} -> + JS.push("edit_custom_field", value: %{id: custom_field.id}, target: @myself) + end + } + > + <:col :let={{_id, custom_field}} label={gettext("Name")}>{custom_field.name} + + <:col :let={{_id, custom_field}} label={gettext("Value Type")}> + {custom_field.value_type} + + + <:col :let={{_id, custom_field}} label={gettext("Description")}> + {custom_field.description} + + + <:col :let={{_id, custom_field}} label={gettext("Show in Overview")}> + + {gettext("Yes")} + + + {gettext("No")} + + + + <:action :let={{_id, custom_field}}> + <.link phx-click={ + JS.push("edit_custom_field", value: %{id: custom_field.id}, target: @myself) + }> + {gettext("Edit")} + + + + <:action :let={{_id, custom_field}}> + <.link phx-click={JS.push("prepare_delete", value: %{id: custom_field.id}, target: @myself)}> + {gettext("Delete")} + + + + + <%!-- Delete Confirmation Modal --%> + + + +
+ """ + end + + @impl true + def update(assigns, socket) do + # If show_form is explicitly provided in assigns, reset editing state + socket = + if Map.has_key?(assigns, :show_form) and assigns.show_form == false do + socket + |> assign(:editing_custom_field, nil) + |> assign(:form_id, "custom-field-form-new") + else + socket + end + + {:ok, + socket + |> assign(assigns) + |> assign_new(:show_form, fn -> false end) + |> assign_new(:form_id, fn -> "custom-field-form-new" end) + |> assign_new(:editing_custom_field, fn -> nil end) + |> assign_new(:show_delete_modal, fn -> false end) + |> assign_new(:custom_field_to_delete, fn -> nil end) + |> assign_new(:slug_confirmation, fn -> "" end) + |> stream(:custom_fields, Ash.read!(Mv.Membership.CustomField), reset: true)} + end + + @impl true + def handle_event("new_custom_field", _params, socket) do + {:noreply, + socket + |> assign(:show_form, true) + |> assign(:editing_custom_field, nil) + |> assign(:form_id, "custom-field-form-new")} + end + + @impl true + def handle_event("edit_custom_field", %{"id" => id}, socket) do + custom_field = Ash.get!(Mv.Membership.CustomField, id) + + {:noreply, + socket + |> assign(:show_form, true) + |> assign(:editing_custom_field, custom_field) + |> assign(:form_id, "custom-field-form-#{id}")} + end + + @impl true + def handle_event("prepare_delete", %{"id" => id}, socket) do + custom_field = Ash.get!(Mv.Membership.CustomField, id, load: [:assigned_members_count]) + + {:noreply, + socket + |> assign(:custom_field_to_delete, custom_field) + |> assign(:show_delete_modal, true) + |> assign(:slug_confirmation, "")} + end + + @impl true + def handle_event("update_slug_confirmation", %{"slug" => slug}, socket) do + {:noreply, assign(socket, :slug_confirmation, slug)} + end + + @impl true + def handle_event("confirm_delete", _params, socket) do + custom_field = socket.assigns.custom_field_to_delete + + if socket.assigns.slug_confirmation == custom_field.slug do + case Ash.destroy(custom_field) do + :ok -> + send(self(), {:custom_field_deleted, custom_field}) + + {:noreply, + socket + |> assign(:show_delete_modal, false) + |> assign(:custom_field_to_delete, nil) + |> assign(:slug_confirmation, "") + |> stream_delete(:custom_fields, custom_field)} + + {:error, error} -> + send(self(), {:custom_field_delete_error, error}) + + {:noreply, + socket + |> assign(:show_delete_modal, false) + |> assign(:custom_field_to_delete, nil) + |> assign(:slug_confirmation, "")} + end + else + send(self(), :custom_field_slug_mismatch) + + {:noreply, + socket + |> assign(:show_delete_modal, false) + |> assign(:custom_field_to_delete, nil) + |> assign(:slug_confirmation, "")} + end + end + + @impl true + def handle_event("cancel_delete", _params, socket) do + {:noreply, + socket + |> assign(:show_delete_modal, false) + |> assign(:custom_field_to_delete, nil) + |> assign(:slug_confirmation, "")} + end +end diff --git a/lib/mv_web/live/custom_field_live/show.ex b/lib/mv_web/live/custom_field_live/show.ex deleted file mode 100644 index 239b844..0000000 --- a/lib/mv_web/live/custom_field_live/show.ex +++ /dev/null @@ -1,75 +0,0 @@ -defmodule MvWeb.CustomFieldLive.Show do - @moduledoc """ - LiveView for displaying a single custom field's details (admin). - - ## Features - - Display custom field definition - - Show all attributes (name, value type, description, flags) - - Navigate to edit form - - Return to custom field list - - ## Displayed Information - - ID: Internal UUID identifier - - Slug: URL-friendly identifier (auto-generated, immutable) - - Name: Unique identifier - - Value type: Data type constraint - - Description: Optional explanation - - Immutable flag: Whether values can be changed - - Required flag: Whether all members need this custom field - - ## Navigation - - Back to custom field list - - Edit custom field - - ## Security - Custom field details are restricted to admin users. - """ - use MvWeb, :live_view - - @impl true - def render(assigns) do - ~H""" - - <.header> - Custom field {@custom_field.slug} - <:subtitle>This is a custom_field record from your database. - - <:actions> - <.button navigate={~p"/custom_fields"}> - <.icon name="hero-arrow-left" /> - - <.button - variant="primary" - navigate={~p"/custom_fields/#{@custom_field}/edit?return_to=show"} - > - <.icon name="hero-pencil-square" /> Edit Custom field - - - - - <.list> - <:item title="Id">{@custom_field.id} - - <:item title="Slug"> - {@custom_field.slug} -

- {gettext("Auto-generated identifier (immutable)")} -

- - - <:item title="Name">{@custom_field.name} - - <:item title="Description">{@custom_field.description} - -
- """ - end - - @impl true - def mount(%{"id" => id}, _session, socket) do - {:ok, - socket - |> assign(:page_title, "Show Custom field") - |> assign(:custom_field, Ash.get!(Mv.Membership.CustomField, id))} - end -end diff --git a/lib/mv_web/live/global_settings_live.ex b/lib/mv_web/live/global_settings_live.ex index 0be4559..bb919cb 100644 --- a/lib/mv_web/live/global_settings_live.ex +++ b/lib/mv_web/live/global_settings_live.ex @@ -4,6 +4,7 @@ defmodule MvWeb.GlobalSettingsLive do ## Features - Edit the association/club name + - Manage custom fields - Real-time form validation - Success/error feedback @@ -28,7 +29,7 @@ defmodule MvWeb.GlobalSettingsLive do {:ok, socket - |> assign(:page_title, gettext("Club Settings")) + |> assign(:page_title, gettext("Settings")) |> assign(:settings, settings) |> assign_form()} end @@ -38,12 +39,16 @@ defmodule MvWeb.GlobalSettingsLive do ~H""" <.header> - {gettext("Club Settings")} + {gettext("Settings")} <:subtitle> {gettext("Manage global settings for the association.")} + <%!-- Club Settings Section --%> + <.header> + {gettext("Club Settings")} + <.form for={@form} id="settings-form" phx-change="validate" phx-submit="save"> <.input field={@form[:club_name]} @@ -56,6 +61,12 @@ defmodule MvWeb.GlobalSettingsLive do {gettext("Save Settings")} + + <%!-- Custom Fields Section --%> + <.live_component + module={MvWeb.CustomFieldLive.IndexComponent} + id="custom-fields-component" + /> """ end @@ -66,6 +77,7 @@ defmodule MvWeb.GlobalSettingsLive do assign(socket, form: AshPhoenix.Form.validate(socket.assigns.form, setting_params))} end + @impl true def handle_event("save", %{"setting" => setting_params}, socket) do case AshPhoenix.Form.submit(socket.assigns.form, params: setting_params) do {:ok, updated_settings} -> @@ -82,6 +94,37 @@ defmodule MvWeb.GlobalSettingsLive do end end + @impl true + def handle_info({:custom_field_saved, _custom_field, action}, socket) do + send_update(MvWeb.CustomFieldLive.IndexComponent, + id: "custom-fields-component", + show_form: false + ) + + {:noreply, + put_flash(socket, :info, gettext("Custom field %{action} successfully", action: action))} + end + + @impl true + def handle_info({:custom_field_deleted, _custom_field}, socket) do + {:noreply, put_flash(socket, :info, gettext("Custom field deleted successfully"))} + end + + @impl true + def handle_info({:custom_field_delete_error, error}, socket) do + {:noreply, + put_flash( + socket, + :error, + gettext("Failed to delete custom field: %{error}", error: inspect(error)) + )} + end + + @impl true + def handle_info(:custom_field_slug_mismatch, socket) do + {:noreply, put_flash(socket, :error, gettext("Slug does not match. Deletion cancelled."))} + end + defp assign_form(%{assigns: %{settings: settings}} = socket) do form = AshPhoenix.Form.for_update( diff --git a/lib/mv_web/router.ex b/lib/mv_web/router.ex index 09a2792..8b1b0e6 100644 --- a/lib/mv_web/router.ex +++ b/lib/mv_web/router.ex @@ -55,12 +55,6 @@ defmodule MvWeb.Router do live "/members/:id", MemberLive.Show, :show live "/members/:id/show/edit", MemberLive.Show, :edit - live "/custom_fields", CustomFieldLive.Index, :index - live "/custom_fields/new", CustomFieldLive.Form, :new - live "/custom_fields/:id/edit", CustomFieldLive.Form, :edit - live "/custom_fields/:id", CustomFieldLive.Show, :show - live "/custom_fields/:id/show/edit", CustomFieldLive.Show, :edit - live "/custom_field_values", CustomFieldValueLive.Index, :index live "/custom_field_values/new", CustomFieldValueLive.Form, :new live "/custom_field_values/:id/edit", CustomFieldValueLive.Form, :edit diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index 66bcec1..9abe609 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -10,13 +10,13 @@ msgid "" msgstr "" "Language: en\n" -#: lib/mv_web/components/core_components.ex:386 +#: lib/mv_web/components/core_components.ex:387 #, elixir-autogen, elixir-format msgid "Actions" msgstr "Aktionen" #: lib/mv_web/live/member_live/index.html.heex:248 -#: lib/mv_web/live/user_live/index.html.heex:72 +#: lib/mv_web/live/user_live/index.html.heex:71 #, elixir-autogen, elixir-format msgid "Are you sure?" msgstr "Bist du sicher?" @@ -29,55 +29,57 @@ msgstr "Verbindung wird wiederhergestellt" #: lib/mv_web/live/member_live/form.ex:53 #: lib/mv_web/live/member_live/index.html.heex:184 -#: lib/mv_web/live/member_live/show.ex:58 +#: lib/mv_web/live/member_live/show.ex:59 #, elixir-autogen, elixir-format msgid "City" msgstr "Stadt" +#: lib/mv_web/live/custom_field_live/index_component.ex:82 #: lib/mv_web/live/member_live/index.html.heex:250 -#: lib/mv_web/live/user_live/index.html.heex:74 +#: lib/mv_web/live/user_live/index.html.heex:73 #, elixir-autogen, elixir-format msgid "Delete" msgstr "Löschen" +#: lib/mv_web/live/custom_field_live/index_component.ex:76 #: lib/mv_web/live/member_live/index.html.heex:242 -#: lib/mv_web/live/user_live/form.ex:265 -#: lib/mv_web/live/user_live/index.html.heex:66 +#: lib/mv_web/live/user_live/form.ex:267 +#: lib/mv_web/live/user_live/index.html.heex:65 #, elixir-autogen, elixir-format msgid "Edit" msgstr "Bearbeiten" -#: lib/mv_web/live/member_live/show.ex:41 -#: lib/mv_web/live/member_live/show.ex:116 +#: lib/mv_web/live/member_live/show.ex:42 +#: lib/mv_web/live/member_live/show.ex:114 #, elixir-autogen, elixir-format msgid "Edit Member" msgstr "Mitglied bearbeiten" #: 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/show.ex:50 +#: lib/mv_web/live/member_live/show.ex:51 #: 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/show.ex:50 +#: lib/mv_web/live/user_live/show.ex:49 #, elixir-autogen, elixir-format msgid "Email" msgstr "E-Mail" #: lib/mv_web/live/member_live/form.ex:45 -#: lib/mv_web/live/member_live/show.ex:48 +#: lib/mv_web/live/member_live/show.ex:49 #, elixir-autogen, elixir-format msgid "First Name" msgstr "Vorname" #: lib/mv_web/live/member_live/form.ex:50 #: lib/mv_web/live/member_live/index.html.heex:220 -#: lib/mv_web/live/member_live/show.ex:55 +#: lib/mv_web/live/member_live/show.ex:56 #, elixir-autogen, elixir-format msgid "Join Date" msgstr "Beitrittsdatum" #: lib/mv_web/live/member_live/form.ex:46 -#: lib/mv_web/live/member_live/show.ex:49 +#: lib/mv_web/live/member_live/show.ex:50 #, elixir-autogen, elixir-format msgid "Last Name" msgstr "Nachname" @@ -88,7 +90,7 @@ msgid "New Member" msgstr "Neues Mitglied" #: lib/mv_web/live/member_live/index.html.heex:239 -#: lib/mv_web/live/user_live/index.html.heex:63 +#: lib/mv_web/live/user_live/index.html.heex:62 #, elixir-autogen, elixir-format msgid "Show" msgstr "Anzeigen" @@ -109,20 +111,20 @@ msgid "close" msgstr "schließen" #: lib/mv_web/live/member_live/form.ex:51 -#: lib/mv_web/live/member_live/show.ex:56 +#: lib/mv_web/live/member_live/show.ex:57 #, elixir-autogen, elixir-format msgid "Exit Date" msgstr "Austrittsdatum" #: 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/show.ex:60 +#: lib/mv_web/live/member_live/show.ex:61 #, elixir-autogen, elixir-format msgid "House Number" msgstr "Hausnummer" #: lib/mv_web/live/member_live/form.ex:52 -#: lib/mv_web/live/member_live/show.ex:57 +#: lib/mv_web/live/member_live/show.ex:58 #, elixir-autogen, elixir-format msgid "Notes" msgstr "Notizen" @@ -131,21 +133,21 @@ msgstr "Notizen" #: lib/mv_web/live/components/payment_filter_component.ex:144 #: 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/show.ex:51 +#: lib/mv_web/live/member_live/show.ex:52 #, elixir-autogen, elixir-format msgid "Paid" msgstr "Bezahlt" #: 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/show.ex:54 +#: lib/mv_web/live/member_live/show.ex:55 #, elixir-autogen, elixir-format msgid "Phone Number" msgstr "Telefonnummer" #: lib/mv_web/live/member_live/form.ex:56 #: lib/mv_web/live/member_live/index.html.heex:166 -#: lib/mv_web/live/member_live/show.ex:61 +#: lib/mv_web/live/member_live/show.ex:62 #, elixir-autogen, elixir-format msgid "Postal Code" msgstr "Postleitzahl" @@ -155,59 +157,61 @@ msgstr "Postleitzahl" msgid "Save Member" msgstr "Mitglied speichern" -#: lib/mv_web/live/custom_field_live/form.ex:66 +#: lib/mv_web/live/custom_field_live/form_component.ex:63 #: 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:60 #: lib/mv_web/live/member_live/form.ex:78 -#: lib/mv_web/live/user_live/form.ex:248 +#: lib/mv_web/live/user_live/form.ex:249 #, elixir-autogen, elixir-format msgid "Saving..." msgstr "Speichern..." #: lib/mv_web/live/member_live/form.ex:54 #: lib/mv_web/live/member_live/index.html.heex:130 -#: lib/mv_web/live/member_live/show.ex:59 +#: lib/mv_web/live/member_live/show.ex:60 #, elixir-autogen, elixir-format msgid "Street" msgstr "Straße" -#: lib/mv_web/live/member_live/show.ex:47 +#: lib/mv_web/live/member_live/show.ex:48 #, elixir-autogen, elixir-format msgid "Id" msgstr "ID" +#: lib/mv_web/live/custom_field_live/index_component.ex:68 #: 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/show.ex:52 +#: lib/mv_web/live/member_live/index/formatter.ex:62 +#: lib/mv_web/live/member_live/show.ex:53 #, elixir-autogen, elixir-format msgid "No" msgstr "Nein" -#: lib/mv_web/live/member_live/show.ex:115 +#: lib/mv_web/live/member_live/show.ex:113 #, elixir-autogen, elixir-format, fuzzy msgid "Show Member" msgstr "Mitglied anzeigen" -#: lib/mv_web/live/member_live/show.ex:33 +#: lib/mv_web/live/member_live/show.ex:34 #, elixir-autogen, elixir-format msgid "This is a member record from your database." msgstr "Dies ist ein Mitglied aus deiner Datenbank." +#: lib/mv_web/live/custom_field_live/index_component.ex:65 #: lib/mv_web/live/member_live/index.html.heex:234 -#: lib/mv_web/live/member_live/index/formatter.ex:60 -#: lib/mv_web/live/member_live/show.ex:52 +#: lib/mv_web/live/member_live/index/formatter.ex:61 +#: lib/mv_web/live/member_live/show.ex:53 #, elixir-autogen, elixir-format msgid "Yes" msgstr "Ja" -#: lib/mv_web/live/custom_field_live/form.ex:110 +#: lib/mv_web/live/custom_field_live/form_component.ex:93 #: lib/mv_web/live/custom_field_value_live/form.ex:233 #: lib/mv_web/live/member_live/form.ex:137 #, elixir-autogen, elixir-format msgid "create" msgstr "erstellt" -#: lib/mv_web/live/custom_field_live/form.ex:111 +#: lib/mv_web/live/custom_field_live/form_component.ex:94 #: lib/mv_web/live/custom_field_value_live/form.ex:234 #: lib/mv_web/live/member_live/form.ex:138 #, elixir-autogen, elixir-format @@ -249,11 +253,11 @@ msgstr "Ihre E-Mail-Adresse wurde bestätigt" msgid "Your password has successfully been reset" msgstr "Ihr Passwort wurde erfolgreich zurückgesetzt" -#: 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/form_component.ex:61 +#: lib/mv_web/live/custom_field_live/index_component.ex:138 #: lib/mv_web/live/custom_field_value_live/form.ex:77 #: lib/mv_web/live/member_live/form.ex:81 -#: lib/mv_web/live/user_live/form.ex:251 +#: lib/mv_web/live/user_live/form.ex:252 #, elixir-autogen, elixir-format msgid "Cancel" msgstr "Abbrechen" @@ -263,7 +267,8 @@ msgstr "Abbrechen" msgid "Choose a member" msgstr "Mitglied auswählen" -#: lib/mv_web/live/custom_field_live/form.ex:61 +#: lib/mv_web/live/custom_field_live/form_component.ex:50 +#: lib/mv_web/live/custom_field_live/index_component.ex:59 #, elixir-autogen, elixir-format msgid "Description" msgstr "Beschreibung" @@ -273,17 +278,12 @@ msgstr "Beschreibung" msgid "Edit User" msgstr "Benutzer*in bearbeiten" -#: lib/mv_web/live/user_live/show.ex:53 +#: lib/mv_web/live/user_live/show.ex:51 #, elixir-autogen, elixir-format msgid "Enabled" msgstr "Aktiviert" -#: lib/mv_web/live/user_live/show.ex:49 -#, elixir-autogen, elixir-format -msgid "ID" -msgstr "ID" - -#: lib/mv_web/live/custom_field_live/form.ex:62 +#: lib/mv_web/live/custom_field_live/form_component.ex:51 #, elixir-autogen, elixir-format msgid "Immutable" msgstr "Unveränderlich" @@ -305,13 +305,14 @@ msgid "Member" msgstr "Mitglied" #: lib/mv_web/components/layouts/navbar.ex:25 -#: 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 #, elixir-autogen, elixir-format msgid "Members" msgstr "Mitglieder" -#: lib/mv_web/live/custom_field_live/form.ex:51 +#: lib/mv_web/live/custom_field_live/form_component.ex:40 +#: lib/mv_web/live/custom_field_live/index_component.ex:53 #, elixir-autogen, elixir-format msgid "Name" msgstr "Name" @@ -321,16 +322,11 @@ msgstr "Name" msgid "New User" msgstr "Neue*r Benutzer*in" -#: lib/mv_web/live/user_live/show.ex:53 +#: lib/mv_web/live/user_live/show.ex:51 #, elixir-autogen, elixir-format msgid "Not enabled" msgstr "Nicht aktiviert" -#: lib/mv_web/live/user_live/show.ex:51 -#, elixir-autogen, elixir-format -msgid "Not set" -msgstr "Nicht gesetzt" - #: 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:224 @@ -338,13 +334,7 @@ msgstr "Nicht gesetzt" msgid "Note" msgstr "Hinweis" -#: 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 "OIDC ID" - -#: lib/mv_web/live/user_live/show.ex:52 +#: lib/mv_web/live/user_live/show.ex:50 #, elixir-autogen, elixir-format msgid "Password Authentication" msgstr "Passwort-Authentifizierung" @@ -354,7 +344,7 @@ msgstr "Passwort-Authentifizierung" msgid "Profil" msgstr "Profil" -#: lib/mv_web/live/custom_field_live/form.ex:63 +#: lib/mv_web/live/custom_field_live/form_component.ex:52 #, elixir-autogen, elixir-format msgid "Required" msgstr "Erforderlich" @@ -369,17 +359,20 @@ msgstr "Alle Mitglieder auswählen" msgid "Select member" msgstr "Mitglied auswählen" +#: lib/mv_web/components/layouts/navbar.ex:26 #: lib/mv_web/components/layouts/navbar.ex:99 +#: lib/mv_web/live/global_settings_live.ex:32 +#: lib/mv_web/live/global_settings_live.ex:42 #, elixir-autogen, elixir-format msgid "Settings" msgstr "Einstellungen" -#: lib/mv_web/live/user_live/form.ex:249 +#: lib/mv_web/live/user_live/form.ex:250 #, elixir-autogen, elixir-format msgid "Save User" msgstr "Benutzer*in speichern" -#: lib/mv_web/live/user_live/show.ex:79 +#: lib/mv_web/live/user_live/show.ex:77 #, elixir-autogen, elixir-format msgid "Show User" msgstr "Benutzer*in anzeigen" @@ -399,7 +392,7 @@ msgstr "Nicht unterstützter Wertetyp: %{type}" msgid "Use this form to manage user records in your database." msgstr "Verwenden Sie dieses Formular, um Benutzer*innen-Datensätze zu verwalten." -#: lib/mv_web/live/user_live/form.ex:266 +#: lib/mv_web/live/user_live/form.ex:268 #: lib/mv_web/live/user_live/show.ex:34 #, elixir-autogen, elixir-format msgid "User" @@ -410,7 +403,7 @@ msgstr "Benutzer*in" msgid "Value" msgstr "Wert" -#: lib/mv_web/live/custom_field_live/form.ex:56 +#: lib/mv_web/live/custom_field_live/form_component.ex:45 #, elixir-autogen, elixir-format msgid "Value type" msgstr "Wertetyp" @@ -427,7 +420,7 @@ msgstr "aufsteigend" msgid "descending" msgstr "absteigend" -#: lib/mv_web/live/user_live/form.ex:265 +#: lib/mv_web/live/user_live/form.ex:267 #, elixir-autogen, elixir-format msgid "New" msgstr "Neue*r" @@ -503,30 +496,30 @@ msgid "User will be created without a password. Check 'Set Password' to add one. msgstr "Benutzer*in wird ohne Passwort erstellt. Aktivieren Sie 'Passwort setzen', um eines hinzuzufügen." #: lib/mv_web/live/user_live/form.ex:126 -#: lib/mv_web/live/user_live/index.html.heex:53 -#: lib/mv_web/live/user_live/show.ex:55 +#: lib/mv_web/live/user_live/index.html.heex:52 +#: lib/mv_web/live/user_live/show.ex:53 #, elixir-autogen, elixir-format msgid "Linked Member" msgstr "Verknüpftes Mitglied" -#: lib/mv_web/live/member_live/show.ex:62 +#: lib/mv_web/live/member_live/show.ex:63 #, elixir-autogen, elixir-format msgid "Linked User" msgstr "Verknüpfte*r Benutzer*in" -#: lib/mv_web/live/user_live/index.html.heex:57 -#: lib/mv_web/live/user_live/show.ex:65 +#: lib/mv_web/live/user_live/index.html.heex:56 +#: lib/mv_web/live/user_live/show.ex:63 #, elixir-autogen, elixir-format msgid "No member linked" msgstr "Kein Mitglied verknüpft" -#: lib/mv_web/live/member_live/show.ex:72 +#: lib/mv_web/live/member_live/show.ex:73 #, elixir-autogen, elixir-format msgid "No user linked" msgstr "Keine*r Benutzer*in verknüpft" -#: lib/mv_web/live/member_live/show.ex:36 -#: lib/mv_web/live/member_live/show.ex:38 +#: lib/mv_web/live/member_live/show.ex:37 +#: lib/mv_web/live/member_live/show.ex:39 #, elixir-autogen, elixir-format msgid "Back to members list" msgstr "Zurück zur Mitgliederliste" @@ -608,7 +601,7 @@ msgid "Choose a custom field" msgstr "Wähle ein Benutzerdefiniertes Feld" #: lib/mv_web/live/member_live/form.ex:58 -#: lib/mv_web/live/member_live/show.ex:77 +#: lib/mv_web/live/member_live/show.ex:78 #, elixir-autogen, elixir-format msgid "Custom Field Values" msgstr "Benutzerdefinierte Feldwerte" @@ -618,7 +611,7 @@ msgstr "Benutzerdefinierte Feldwerte" msgid "Custom field" msgstr "Benutzerdefiniertes Feld" -#: lib/mv_web/live/custom_field_live/form.ex:117 +#: lib/mv_web/live/global_settings_live.ex:105 #, elixir-autogen, elixir-format msgid "Custom field %{action} successfully" msgstr "Benutzerdefiniertes Feld erfolgreich %{action}" @@ -633,7 +626,7 @@ msgstr "Benutzerdefinierter Feldwert erfolgreich %{action}" msgid "Please select a custom field first" msgstr "Bitte wähle zuerst ein Benutzerdefiniertes Feld" -#: lib/mv_web/live/custom_field_live/form.ex:67 +#: lib/mv_web/live/custom_field_live/form_component.ex:64 #, elixir-autogen, elixir-format msgid "Save Custom field" msgstr "Benutzerdefiniertes Feld speichern" @@ -643,12 +636,7 @@ msgstr "Benutzerdefiniertes Feld speichern" msgid "Save Custom field value" msgstr "Benutzerdefinierten Feldwert speichern" -#: lib/mv_web/live/custom_field_live/form.ex:46 -#, elixir-autogen, elixir-format -msgid "Use this form to manage custom_field records in your database." -msgstr "Verwende dieses Formular, um Benutzerdefinierte Felder in deiner Datenbank zu verwalten." - -#: lib/mv_web/components/layouts/navbar.ex:26 +#: lib/mv_web/live/custom_field_live/index_component.ex:20 #, elixir-autogen, elixir-format msgid "Custom Fields" msgstr "Benutzerdefinierte Felder" @@ -658,70 +646,64 @@ msgstr "Benutzerdefinierte Felder" msgid "Use this form to manage Custom Field Value records in your database." msgstr "Verwende dieses Formular, um Benutzerdefinierte Feldwerte in deiner Datenbank zu verwalten." -#: lib/mv_web/live/custom_field_live/show.ex:56 -#, elixir-autogen, elixir-format -msgid "Auto-generated identifier (immutable)" -msgstr "Automatisch generierter Bezeichner (unveränderlich)" - -#: lib/mv_web/live/custom_field_live/index.ex:79 +#: lib/mv_web/live/custom_field_live/index_component.ex:97 #, elixir-autogen, elixir-format msgid "%{count} member has a value assigned for this custom field." msgid_plural "%{count} members have values assigned for this custom field." msgstr[0] "%{count} Mitglied hat einen Wert für dieses benutzerdefinierte Feld zugewiesen." msgstr[1] "%{count} Mitglieder haben Werte für dieses benutzerdefinierte Feld zugewiesen." -#: lib/mv_web/live/custom_field_live/index.ex:87 +#: lib/mv_web/live/custom_field_live/index_component.ex:105 #, elixir-autogen, elixir-format msgid "All custom field values will be permanently deleted when you delete this custom field." msgstr "Alle benutzerdefinierten Feldwerte werden beim Löschen dieses benutzerdefinierten Feldes dauerhaft gelöscht." -#: lib/mv_web/live/custom_field_live/index.ex:72 +#: lib/mv_web/live/custom_field_live/index_component.ex:90 #, elixir-autogen, elixir-format msgid "Delete Custom Field" msgstr "Benutzerdefiniertes Feld löschen" -#: lib/mv_web/live/custom_field_live/index.ex:127 +#: lib/mv_web/live/custom_field_live/index_component.ex:146 #, elixir-autogen, elixir-format msgid "Delete Custom Field and All Values" msgstr "Benutzerdefiniertes Feld und alle Werte löschen" -#: lib/mv_web/live/custom_field_live/index.ex:109 +#: lib/mv_web/live/custom_field_live/index_component.ex:127 #, elixir-autogen, elixir-format msgid "Enter the text above to confirm" msgstr "Obigen Text zur Bestätigung eingeben" -#: lib/mv_web/live/custom_field_live/index.ex:97 +#: lib/mv_web/live/custom_field_live/index_component.ex:115 #, elixir-autogen, elixir-format, fuzzy msgid "To confirm deletion, please enter this text:" msgstr "Um die Löschung zu bestätigen, gib bitte folgenden Text ein:" -#: lib/mv_web/live/custom_field_live/form.ex:64 +#: lib/mv_web/live/custom_field_live/form_component.ex:56 #, elixir-autogen, elixir-format msgid "Show in overview" msgstr "In der Mitglieder-Übersicht anzeigen" -#: lib/mv_web/live/global_settings_live.ex:51 +#: lib/mv_web/live/global_settings_live.ex:56 #, elixir-autogen, elixir-format msgid "Association Name" msgstr "Vereinsname" -#: lib/mv_web/live/global_settings_live.ex:31 -#: lib/mv_web/live/global_settings_live.ex:41 +#: lib/mv_web/live/global_settings_live.ex:50 #, elixir-autogen, elixir-format, fuzzy msgid "Club Settings" msgstr "Vereinsdaten" -#: lib/mv_web/live/global_settings_live.ex:43 +#: lib/mv_web/live/global_settings_live.ex:44 #, elixir-autogen, elixir-format msgid "Manage global settings for the association." msgstr "Passe übergreifende Einstellungen für den Verein an." -#: lib/mv_web/live/global_settings_live.ex:56 +#: lib/mv_web/live/global_settings_live.ex:61 #, elixir-autogen, elixir-format, fuzzy msgid "Save Settings" msgstr "Einstellungen speichern" -#: lib/mv_web/live/global_settings_live.ex:75 +#: lib/mv_web/live/global_settings_live.ex:87 #, elixir-autogen, elixir-format msgid "Settings updated successfully" msgstr "Einstellungen erfolgreich gespeichert" @@ -736,7 +718,7 @@ msgstr "Ein Mitglied mit dieser E-Mail-Adresse existiert bereits. Um mit einem a msgid "Available members" msgstr "Verfügbare Mitglieder" -#: lib/mv_web/live/user_live/form.ex:357 +#: lib/mv_web/live/user_live/form.ex:359 #, elixir-autogen, elixir-format msgid "Failed to link member: %{error}" msgstr "Fehler beim Verlinken des Mitglieds: %{error}" @@ -776,7 +758,7 @@ msgstr "Mitglied entverknüpfen" msgid "Unlinking scheduled" msgstr "Entverknüpfung geplant" -#: lib/mv_web/live/member_live/index.ex:159 +#: lib/mv_web/live/member_live/index.ex:160 #, elixir-autogen, elixir-format msgid "Copied %{count} email address to clipboard" msgid_plural "Copied %{count} email addresses to clipboard" @@ -793,12 +775,12 @@ msgstr "E-Mail-Adressen der ausgewählten Mitglieder kopieren" msgid "Copy emails" msgstr "E-Mails kopieren" -#: lib/mv_web/live/member_live/index.ex:148 +#: lib/mv_web/live/member_live/index.ex:149 #, elixir-autogen, elixir-format msgid "No email addresses found" msgstr "Keine E-Mail-Adressen gefunden" -#: lib/mv_web/live/member_live/index.ex:145 +#: lib/mv_web/live/member_live/index.ex:146 #, elixir-autogen, elixir-format msgid "No members selected" msgstr "Keine Mitglieder ausgewählt" @@ -813,7 +795,7 @@ msgstr "E-Mail-Programm mit BCC-Empfänger*innen öffnen" msgid "Open in email program" msgstr "Im E-Mail-Programm öffnen" -#: lib/mv_web/live/member_live/index.ex:168 +#: lib/mv_web/live/member_live/index.ex:169 #, elixir-autogen, elixir-format msgid "Tip: Paste email addresses into the BCC field for privacy compliance" msgstr "Tipp: E-Mail-Adressen ins BCC-Feld einfügen für Datenschutzkonformität" @@ -853,8 +835,74 @@ msgstr "Nicht bezahlt" msgid "Payment filter" msgstr "Zahlungsfilter" +#: lib/mv_web/live/global_settings_live.ex:110 +#, elixir-autogen, elixir-format, fuzzy +msgid "Custom field deleted successfully" +msgstr "Benutzerdefiniertes Feld erfolgreich %{action}" + +#: lib/mv_web/live/custom_field_live/form_component.ex:29 +#, elixir-autogen, elixir-format, fuzzy +msgid "Edit Custom Field" +msgstr "Benutzerdefiniertes Feld bearbeiten" + +#: lib/mv_web/live/global_settings_live.ex:119 +#, elixir-autogen, elixir-format +msgid "Failed to delete custom field: %{error}" +msgstr "Konnte benutzerdefiniertes Feld nicht löschen: %{error}" + +#: lib/mv_web/live/custom_field_live/form_component.ex:29 +#, elixir-autogen, elixir-format, fuzzy +msgid "New Custom Field" +msgstr "Neues Benutzerdefiniertes Feld" + +#: lib/mv_web/live/custom_field_live/index_component.ex:26 +#, elixir-autogen, elixir-format, fuzzy +msgid "New Custom field" +msgstr "Neues Benutzerdefiniertes Feld" + +#: lib/mv_web/live/custom_field_live/index_component.ex:63 +#, elixir-autogen, elixir-format, fuzzy +msgid "Show in Overview" +msgstr "In der Mitglieder-Übersicht anzeigen" + +#: lib/mv_web/live/global_settings_live.ex:125 +#, elixir-autogen, elixir-format +msgid "Slug does not match. Deletion cancelled." +msgstr "Eingegebener Text war nicht korrekt. Löschen wurde abgebrochen." + +#: lib/mv_web/live/custom_field_live/index_component.ex:55 +#, elixir-autogen, elixir-format, fuzzy +msgid "Value Type" +msgstr "Wertetyp" + +#: lib/mv_web/live/custom_field_live/index_component.ex:22 +#, elixir-autogen, elixir-format +msgid "These will appear in addition to other data when adding new members." +msgstr "Diese Felder können zusätzlich zu den normalen Daten ausgefüllt werden, wenn ein neues Mitglied angelegt wird." + +#: lib/mv_web/live/custom_field_live/form_component.ex:25 +#, elixir-autogen, elixir-format +msgid "Back to custom field overview" +msgstr "Zurück zur Felderliste" + #~ #: lib/mv_web/live/member_live/form.ex:48 #~ #: lib/mv_web/live/member_live/show.ex:51 #~ #, elixir-autogen, elixir-format #~ msgid "Birth Date" #~ msgstr "Geburtsdatum" + +#~ #: lib/mv_web/live/user_live/show.ex:49 +#~ #, elixir-autogen, elixir-format +#~ msgid "ID" +#~ msgstr "ID" + +#~ #: lib/mv_web/live/user_live/show.ex:51 +#~ #, elixir-autogen, elixir-format +#~ msgid "Not set" +#~ msgstr "Nicht gesetzt" + +#~ #: 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 "OIDC ID" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 1e0e954..0240964 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -11,13 +11,13 @@ msgid "" msgstr "" -#: lib/mv_web/components/core_components.ex:386 +#: lib/mv_web/components/core_components.ex:387 #, elixir-autogen, elixir-format msgid "Actions" msgstr "" #: lib/mv_web/live/member_live/index.html.heex:248 -#: lib/mv_web/live/user_live/index.html.heex:72 +#: lib/mv_web/live/user_live/index.html.heex:71 #, elixir-autogen, elixir-format msgid "Are you sure?" msgstr "" @@ -30,55 +30,57 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex:53 #: lib/mv_web/live/member_live/index.html.heex:184 -#: lib/mv_web/live/member_live/show.ex:58 +#: lib/mv_web/live/member_live/show.ex:59 #, elixir-autogen, elixir-format msgid "City" msgstr "" +#: lib/mv_web/live/custom_field_live/index_component.ex:82 #: lib/mv_web/live/member_live/index.html.heex:250 -#: lib/mv_web/live/user_live/index.html.heex:74 +#: lib/mv_web/live/user_live/index.html.heex:73 #, elixir-autogen, elixir-format msgid "Delete" msgstr "" +#: lib/mv_web/live/custom_field_live/index_component.ex:76 #: lib/mv_web/live/member_live/index.html.heex:242 -#: lib/mv_web/live/user_live/form.ex:265 -#: lib/mv_web/live/user_live/index.html.heex:66 +#: lib/mv_web/live/user_live/form.ex:267 +#: lib/mv_web/live/user_live/index.html.heex:65 #, elixir-autogen, elixir-format msgid "Edit" msgstr "" -#: lib/mv_web/live/member_live/show.ex:41 -#: lib/mv_web/live/member_live/show.ex:116 +#: lib/mv_web/live/member_live/show.ex:42 +#: lib/mv_web/live/member_live/show.ex:114 #, elixir-autogen, elixir-format msgid "Edit Member" msgstr "" #: 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/show.ex:50 +#: lib/mv_web/live/member_live/show.ex:51 #: 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/show.ex:50 +#: lib/mv_web/live/user_live/show.ex:49 #, elixir-autogen, elixir-format msgid "Email" msgstr "" #: lib/mv_web/live/member_live/form.ex:45 -#: lib/mv_web/live/member_live/show.ex:48 +#: lib/mv_web/live/member_live/show.ex:49 #, elixir-autogen, elixir-format msgid "First Name" msgstr "" #: lib/mv_web/live/member_live/form.ex:50 #: lib/mv_web/live/member_live/index.html.heex:220 -#: lib/mv_web/live/member_live/show.ex:55 +#: lib/mv_web/live/member_live/show.ex:56 #, elixir-autogen, elixir-format msgid "Join Date" msgstr "" #: lib/mv_web/live/member_live/form.ex:46 -#: lib/mv_web/live/member_live/show.ex:49 +#: lib/mv_web/live/member_live/show.ex:50 #, elixir-autogen, elixir-format msgid "Last Name" msgstr "" @@ -89,7 +91,7 @@ msgid "New Member" msgstr "" #: lib/mv_web/live/member_live/index.html.heex:239 -#: lib/mv_web/live/user_live/index.html.heex:63 +#: lib/mv_web/live/user_live/index.html.heex:62 #, elixir-autogen, elixir-format msgid "Show" msgstr "" @@ -110,20 +112,20 @@ msgid "close" msgstr "" #: lib/mv_web/live/member_live/form.ex:51 -#: lib/mv_web/live/member_live/show.ex:56 +#: lib/mv_web/live/member_live/show.ex:57 #, elixir-autogen, elixir-format msgid "Exit Date" 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/show.ex:60 +#: lib/mv_web/live/member_live/show.ex:61 #, elixir-autogen, elixir-format msgid "House Number" msgstr "" #: lib/mv_web/live/member_live/form.ex:52 -#: lib/mv_web/live/member_live/show.ex:57 +#: lib/mv_web/live/member_live/show.ex:58 #, elixir-autogen, elixir-format msgid "Notes" msgstr "" @@ -132,21 +134,21 @@ msgstr "" #: lib/mv_web/live/components/payment_filter_component.ex:144 #: 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/show.ex:51 +#: lib/mv_web/live/member_live/show.ex:52 #, elixir-autogen, elixir-format msgid "Paid" 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/show.ex:54 +#: lib/mv_web/live/member_live/show.ex:55 #, elixir-autogen, elixir-format msgid "Phone Number" msgstr "" #: lib/mv_web/live/member_live/form.ex:56 #: lib/mv_web/live/member_live/index.html.heex:166 -#: lib/mv_web/live/member_live/show.ex:61 +#: lib/mv_web/live/member_live/show.ex:62 #, elixir-autogen, elixir-format msgid "Postal Code" msgstr "" @@ -156,59 +158,61 @@ msgstr "" msgid "Save Member" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:66 +#: lib/mv_web/live/custom_field_live/form_component.ex:63 #: 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:60 #: lib/mv_web/live/member_live/form.ex:78 -#: lib/mv_web/live/user_live/form.ex:248 +#: lib/mv_web/live/user_live/form.ex:249 #, elixir-autogen, elixir-format msgid "Saving..." msgstr "" #: lib/mv_web/live/member_live/form.ex:54 #: lib/mv_web/live/member_live/index.html.heex:130 -#: lib/mv_web/live/member_live/show.ex:59 +#: lib/mv_web/live/member_live/show.ex:60 #, elixir-autogen, elixir-format msgid "Street" msgstr "" -#: lib/mv_web/live/member_live/show.ex:47 +#: lib/mv_web/live/member_live/show.ex:48 #, elixir-autogen, elixir-format msgid "Id" msgstr "" +#: lib/mv_web/live/custom_field_live/index_component.ex:68 #: 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/show.ex:52 +#: lib/mv_web/live/member_live/index/formatter.ex:62 +#: lib/mv_web/live/member_live/show.ex:53 #, elixir-autogen, elixir-format msgid "No" msgstr "" -#: lib/mv_web/live/member_live/show.ex:115 +#: lib/mv_web/live/member_live/show.ex:113 #, elixir-autogen, elixir-format msgid "Show Member" msgstr "" -#: lib/mv_web/live/member_live/show.ex:33 +#: 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/custom_field_live/index_component.ex:65 #: lib/mv_web/live/member_live/index.html.heex:234 -#: lib/mv_web/live/member_live/index/formatter.ex:60 -#: lib/mv_web/live/member_live/show.ex:52 +#: lib/mv_web/live/member_live/index/formatter.ex:61 +#: lib/mv_web/live/member_live/show.ex:53 #, elixir-autogen, elixir-format msgid "Yes" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:110 +#: lib/mv_web/live/custom_field_live/form_component.ex:93 #: lib/mv_web/live/custom_field_value_live/form.ex:233 #: lib/mv_web/live/member_live/form.ex:137 #, elixir-autogen, elixir-format msgid "create" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:111 +#: lib/mv_web/live/custom_field_live/form_component.ex:94 #: lib/mv_web/live/custom_field_value_live/form.ex:234 #: lib/mv_web/live/member_live/form.ex:138 #, elixir-autogen, elixir-format @@ -250,11 +254,11 @@ msgstr "" msgid "Your password has successfully been reset" msgstr "" -#: 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/form_component.ex:61 +#: lib/mv_web/live/custom_field_live/index_component.ex:138 #: lib/mv_web/live/custom_field_value_live/form.ex:77 #: lib/mv_web/live/member_live/form.ex:81 -#: lib/mv_web/live/user_live/form.ex:251 +#: lib/mv_web/live/user_live/form.ex:252 #, elixir-autogen, elixir-format msgid "Cancel" msgstr "" @@ -264,7 +268,8 @@ msgstr "" msgid "Choose a member" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:61 +#: lib/mv_web/live/custom_field_live/form_component.ex:50 +#: lib/mv_web/live/custom_field_live/index_component.ex:59 #, elixir-autogen, elixir-format msgid "Description" msgstr "" @@ -274,17 +279,12 @@ msgstr "" msgid "Edit User" msgstr "" -#: lib/mv_web/live/user_live/show.ex:53 +#: lib/mv_web/live/user_live/show.ex:51 #, elixir-autogen, elixir-format msgid "Enabled" 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_component.ex:51 #, elixir-autogen, elixir-format msgid "Immutable" msgstr "" @@ -306,13 +306,14 @@ msgid "Member" msgstr "" #: lib/mv_web/components/layouts/navbar.ex:25 -#: 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 #, elixir-autogen, elixir-format msgid "Members" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:51 +#: lib/mv_web/live/custom_field_live/form_component.ex:40 +#: lib/mv_web/live/custom_field_live/index_component.ex:53 #, elixir-autogen, elixir-format msgid "Name" msgstr "" @@ -322,14 +323,9 @@ msgstr "" msgid "New User" msgstr "" -#: lib/mv_web/live/user_live/show.ex:53 -#, elixir-autogen, elixir-format -msgid "Not enabled" -msgstr "" - #: lib/mv_web/live/user_live/show.ex:51 #, elixir-autogen, elixir-format -msgid "Not set" +msgid "Not enabled" msgstr "" #: lib/mv_web/live/user_live/form.ex:107 @@ -339,13 +335,7 @@ msgstr "" msgid "Note" msgstr "" -#: 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 +#: lib/mv_web/live/user_live/show.ex:50 #, elixir-autogen, elixir-format msgid "Password Authentication" msgstr "" @@ -355,7 +345,7 @@ msgstr "" msgid "Profil" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:63 +#: lib/mv_web/live/custom_field_live/form_component.ex:52 #, elixir-autogen, elixir-format msgid "Required" msgstr "" @@ -370,17 +360,20 @@ msgstr "" msgid "Select member" msgstr "" +#: lib/mv_web/components/layouts/navbar.ex:26 #: lib/mv_web/components/layouts/navbar.ex:99 +#: lib/mv_web/live/global_settings_live.ex:32 +#: lib/mv_web/live/global_settings_live.ex:42 #, elixir-autogen, elixir-format msgid "Settings" msgstr "" -#: lib/mv_web/live/user_live/form.ex:249 +#: lib/mv_web/live/user_live/form.ex:250 #, elixir-autogen, elixir-format msgid "Save User" msgstr "" -#: lib/mv_web/live/user_live/show.ex:79 +#: lib/mv_web/live/user_live/show.ex:77 #, elixir-autogen, elixir-format msgid "Show User" msgstr "" @@ -400,7 +393,7 @@ msgstr "" msgid "Use this form to manage user records in your database." msgstr "" -#: lib/mv_web/live/user_live/form.ex:266 +#: lib/mv_web/live/user_live/form.ex:268 #: lib/mv_web/live/user_live/show.ex:34 #, elixir-autogen, elixir-format msgid "User" @@ -411,7 +404,7 @@ msgstr "" msgid "Value" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:56 +#: lib/mv_web/live/custom_field_live/form_component.ex:45 #, elixir-autogen, elixir-format msgid "Value type" msgstr "" @@ -428,7 +421,7 @@ msgstr "" msgid "descending" msgstr "" -#: lib/mv_web/live/user_live/form.ex:265 +#: lib/mv_web/live/user_live/form.ex:267 #, elixir-autogen, elixir-format msgid "New" msgstr "" @@ -504,30 +497,30 @@ msgid "User will be created without a password. Check 'Set Password' to add one. msgstr "" #: lib/mv_web/live/user_live/form.ex:126 -#: lib/mv_web/live/user_live/index.html.heex:53 -#: lib/mv_web/live/user_live/show.ex:55 +#: lib/mv_web/live/user_live/index.html.heex:52 +#: lib/mv_web/live/user_live/show.ex:53 #, elixir-autogen, elixir-format msgid "Linked Member" msgstr "" -#: lib/mv_web/live/member_live/show.ex:62 +#: lib/mv_web/live/member_live/show.ex:63 #, elixir-autogen, elixir-format msgid "Linked User" msgstr "" -#: lib/mv_web/live/user_live/index.html.heex:57 -#: lib/mv_web/live/user_live/show.ex:65 +#: lib/mv_web/live/user_live/index.html.heex:56 +#: lib/mv_web/live/user_live/show.ex:63 #, elixir-autogen, elixir-format msgid "No member linked" msgstr "" -#: lib/mv_web/live/member_live/show.ex:72 +#: lib/mv_web/live/member_live/show.ex:73 #, elixir-autogen, elixir-format msgid "No user linked" msgstr "" -#: lib/mv_web/live/member_live/show.ex:36 -#: lib/mv_web/live/member_live/show.ex:38 +#: lib/mv_web/live/member_live/show.ex:37 +#: lib/mv_web/live/member_live/show.ex:39 #, elixir-autogen, elixir-format msgid "Back to members list" msgstr "" @@ -609,7 +602,7 @@ msgid "Choose a custom field" msgstr "" #: lib/mv_web/live/member_live/form.ex:58 -#: lib/mv_web/live/member_live/show.ex:77 +#: lib/mv_web/live/member_live/show.ex:78 #, elixir-autogen, elixir-format msgid "Custom Field Values" msgstr "" @@ -619,7 +612,7 @@ msgstr "" msgid "Custom field" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:117 +#: lib/mv_web/live/global_settings_live.ex:105 #, elixir-autogen, elixir-format msgid "Custom field %{action} successfully" msgstr "" @@ -634,7 +627,7 @@ msgstr "" msgid "Please select a custom field first" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:67 +#: lib/mv_web/live/custom_field_live/form_component.ex:64 #, elixir-autogen, elixir-format msgid "Save Custom field" msgstr "" @@ -644,12 +637,7 @@ msgstr "" msgid "Save Custom field value" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:46 -#, elixir-autogen, elixir-format -msgid "Use this form to manage custom_field records in your database." -msgstr "" - -#: lib/mv_web/components/layouts/navbar.ex:26 +#: lib/mv_web/live/custom_field_live/index_component.ex:20 #, elixir-autogen, elixir-format msgid "Custom Fields" msgstr "" @@ -659,70 +647,64 @@ msgstr "" msgid "Use this form to manage Custom Field Value records in your database." msgstr "" -#: lib/mv_web/live/custom_field_live/show.ex:56 -#, elixir-autogen, elixir-format -msgid "Auto-generated identifier (immutable)" -msgstr "" - -#: lib/mv_web/live/custom_field_live/index.ex:79 +#: lib/mv_web/live/custom_field_live/index_component.ex:97 #, elixir-autogen, elixir-format msgid "%{count} member has a value assigned for this custom field." msgid_plural "%{count} members have values assigned for this custom field." msgstr[0] "" msgstr[1] "" -#: lib/mv_web/live/custom_field_live/index.ex:87 +#: lib/mv_web/live/custom_field_live/index_component.ex:105 #, elixir-autogen, elixir-format msgid "All custom field values will be permanently deleted when you delete this custom field." msgstr "" -#: lib/mv_web/live/custom_field_live/index.ex:72 +#: lib/mv_web/live/custom_field_live/index_component.ex:90 #, elixir-autogen, elixir-format msgid "Delete Custom Field" msgstr "" -#: lib/mv_web/live/custom_field_live/index.ex:127 +#: lib/mv_web/live/custom_field_live/index_component.ex:146 #, elixir-autogen, elixir-format msgid "Delete Custom Field and All Values" msgstr "" -#: lib/mv_web/live/custom_field_live/index.ex:109 +#: lib/mv_web/live/custom_field_live/index_component.ex:127 #, elixir-autogen, elixir-format msgid "Enter the text above to confirm" msgstr "" -#: lib/mv_web/live/custom_field_live/index.ex:97 +#: lib/mv_web/live/custom_field_live/index_component.ex:115 #, elixir-autogen, elixir-format msgid "To confirm deletion, please enter this text:" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:64 +#: lib/mv_web/live/custom_field_live/form_component.ex:56 #, elixir-autogen, elixir-format msgid "Show in overview" msgstr "" -#: lib/mv_web/live/global_settings_live.ex:51 +#: lib/mv_web/live/global_settings_live.ex:56 #, elixir-autogen, elixir-format msgid "Association Name" msgstr "" -#: lib/mv_web/live/global_settings_live.ex:31 -#: lib/mv_web/live/global_settings_live.ex:41 +#: lib/mv_web/live/global_settings_live.ex:50 #, elixir-autogen, elixir-format msgid "Club Settings" msgstr "" -#: lib/mv_web/live/global_settings_live.ex:43 +#: lib/mv_web/live/global_settings_live.ex:44 #, elixir-autogen, elixir-format msgid "Manage global settings for the association." msgstr "" -#: lib/mv_web/live/global_settings_live.ex:56 +#: lib/mv_web/live/global_settings_live.ex:61 #, elixir-autogen, elixir-format msgid "Save Settings" msgstr "" -#: lib/mv_web/live/global_settings_live.ex:75 +#: lib/mv_web/live/global_settings_live.ex:87 #, elixir-autogen, elixir-format msgid "Settings updated successfully" msgstr "" @@ -737,7 +719,7 @@ msgstr "" msgid "Available members" msgstr "" -#: lib/mv_web/live/user_live/form.ex:357 +#: lib/mv_web/live/user_live/form.ex:359 #, elixir-autogen, elixir-format msgid "Failed to link member: %{error}" msgstr "" @@ -777,7 +759,7 @@ msgstr "" msgid "Unlinking scheduled" msgstr "" -#: lib/mv_web/live/member_live/index.ex:159 +#: lib/mv_web/live/member_live/index.ex:160 #, elixir-autogen, elixir-format msgid "Copied %{count} email address to clipboard" msgid_plural "Copied %{count} email addresses to clipboard" @@ -794,12 +776,12 @@ msgstr "" msgid "Copy emails" msgstr "" -#: lib/mv_web/live/member_live/index.ex:148 +#: lib/mv_web/live/member_live/index.ex:149 #, elixir-autogen, elixir-format msgid "No email addresses found" msgstr "" -#: lib/mv_web/live/member_live/index.ex:145 +#: lib/mv_web/live/member_live/index.ex:146 #, elixir-autogen, elixir-format msgid "No members selected" msgstr "" @@ -814,7 +796,7 @@ msgstr "" msgid "Open in email program" msgstr "" -#: lib/mv_web/live/member_live/index.ex:168 +#: lib/mv_web/live/member_live/index.ex:169 #, elixir-autogen, elixir-format msgid "Tip: Paste email addresses into the BCC field for privacy compliance" msgstr "" @@ -853,3 +835,53 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Payment filter" msgstr "" + +#: lib/mv_web/live/global_settings_live.ex:110 +#, elixir-autogen, elixir-format +msgid "Custom field deleted successfully" +msgstr "" + +#: lib/mv_web/live/custom_field_live/form_component.ex:29 +#, elixir-autogen, elixir-format +msgid "Edit Custom Field" +msgstr "" + +#: lib/mv_web/live/global_settings_live.ex:119 +#, elixir-autogen, elixir-format +msgid "Failed to delete custom field: %{error}" +msgstr "" + +#: lib/mv_web/live/custom_field_live/form_component.ex:29 +#, elixir-autogen, elixir-format +msgid "New Custom Field" +msgstr "" + +#: lib/mv_web/live/custom_field_live/index_component.ex:26 +#, elixir-autogen, elixir-format +msgid "New Custom field" +msgstr "" + +#: lib/mv_web/live/custom_field_live/index_component.ex:63 +#, elixir-autogen, elixir-format +msgid "Show in Overview" +msgstr "" + +#: lib/mv_web/live/global_settings_live.ex:125 +#, elixir-autogen, elixir-format +msgid "Slug does not match. Deletion cancelled." +msgstr "" + +#: lib/mv_web/live/custom_field_live/index_component.ex:55 +#, elixir-autogen, elixir-format +msgid "Value Type" +msgstr "" + +#: lib/mv_web/live/custom_field_live/index_component.ex:22 +#, elixir-autogen, elixir-format +msgid "These will appear in addition to other data when adding new members." +msgstr "" + +#: lib/mv_web/live/custom_field_live/form_component.ex:25 +#, elixir-autogen, elixir-format +msgid "Back to custom field overview" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index 319bcc3..a5a05b1 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -11,13 +11,13 @@ msgstr "" "Language: en\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: lib/mv_web/components/core_components.ex:386 +#: lib/mv_web/components/core_components.ex:387 #, elixir-autogen, elixir-format msgid "Actions" msgstr "" #: lib/mv_web/live/member_live/index.html.heex:248 -#: lib/mv_web/live/user_live/index.html.heex:72 +#: lib/mv_web/live/user_live/index.html.heex:71 #, elixir-autogen, elixir-format msgid "Are you sure?" msgstr "" @@ -30,55 +30,57 @@ msgstr "" #: lib/mv_web/live/member_live/form.ex:53 #: lib/mv_web/live/member_live/index.html.heex:184 -#: lib/mv_web/live/member_live/show.ex:58 +#: lib/mv_web/live/member_live/show.ex:59 #, elixir-autogen, elixir-format msgid "City" msgstr "" +#: lib/mv_web/live/custom_field_live/index_component.ex:82 #: lib/mv_web/live/member_live/index.html.heex:250 -#: lib/mv_web/live/user_live/index.html.heex:74 +#: lib/mv_web/live/user_live/index.html.heex:73 #, elixir-autogen, elixir-format msgid "Delete" msgstr "" +#: lib/mv_web/live/custom_field_live/index_component.ex:76 #: lib/mv_web/live/member_live/index.html.heex:242 -#: lib/mv_web/live/user_live/form.ex:265 -#: lib/mv_web/live/user_live/index.html.heex:66 +#: lib/mv_web/live/user_live/form.ex:267 +#: lib/mv_web/live/user_live/index.html.heex:65 #, elixir-autogen, elixir-format msgid "Edit" msgstr "" -#: lib/mv_web/live/member_live/show.ex:41 -#: lib/mv_web/live/member_live/show.ex:116 +#: lib/mv_web/live/member_live/show.ex:42 +#: lib/mv_web/live/member_live/show.ex:114 #, elixir-autogen, elixir-format msgid "Edit Member" msgstr "" #: 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/show.ex:50 +#: lib/mv_web/live/member_live/show.ex:51 #: 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/show.ex:50 +#: lib/mv_web/live/user_live/show.ex:49 #, elixir-autogen, elixir-format msgid "Email" msgstr "" #: lib/mv_web/live/member_live/form.ex:45 -#: lib/mv_web/live/member_live/show.ex:48 +#: lib/mv_web/live/member_live/show.ex:49 #, elixir-autogen, elixir-format msgid "First Name" msgstr "" #: lib/mv_web/live/member_live/form.ex:50 #: lib/mv_web/live/member_live/index.html.heex:220 -#: lib/mv_web/live/member_live/show.ex:55 +#: lib/mv_web/live/member_live/show.ex:56 #, elixir-autogen, elixir-format msgid "Join Date" msgstr "" #: lib/mv_web/live/member_live/form.ex:46 -#: lib/mv_web/live/member_live/show.ex:49 +#: lib/mv_web/live/member_live/show.ex:50 #, elixir-autogen, elixir-format msgid "Last Name" msgstr "" @@ -89,7 +91,7 @@ msgid "New Member" msgstr "" #: lib/mv_web/live/member_live/index.html.heex:239 -#: lib/mv_web/live/user_live/index.html.heex:63 +#: lib/mv_web/live/user_live/index.html.heex:62 #, elixir-autogen, elixir-format msgid "Show" msgstr "" @@ -110,20 +112,20 @@ msgid "close" msgstr "" #: lib/mv_web/live/member_live/form.ex:51 -#: lib/mv_web/live/member_live/show.ex:56 +#: lib/mv_web/live/member_live/show.ex:57 #, elixir-autogen, elixir-format msgid "Exit Date" 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/show.ex:60 +#: lib/mv_web/live/member_live/show.ex:61 #, elixir-autogen, elixir-format msgid "House Number" msgstr "" #: lib/mv_web/live/member_live/form.ex:52 -#: lib/mv_web/live/member_live/show.ex:57 +#: lib/mv_web/live/member_live/show.ex:58 #, elixir-autogen, elixir-format msgid "Notes" msgstr "" @@ -132,21 +134,21 @@ msgstr "" #: lib/mv_web/live/components/payment_filter_component.ex:144 #: 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/show.ex:51 +#: lib/mv_web/live/member_live/show.ex:52 #, elixir-autogen, elixir-format msgid "Paid" 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/show.ex:54 +#: lib/mv_web/live/member_live/show.ex:55 #, elixir-autogen, elixir-format msgid "Phone Number" msgstr "" #: lib/mv_web/live/member_live/form.ex:56 #: lib/mv_web/live/member_live/index.html.heex:166 -#: lib/mv_web/live/member_live/show.ex:61 +#: lib/mv_web/live/member_live/show.ex:62 #, elixir-autogen, elixir-format msgid "Postal Code" msgstr "" @@ -156,59 +158,61 @@ msgstr "" msgid "Save Member" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:66 +#: lib/mv_web/live/custom_field_live/form_component.ex:63 #: 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:60 #: lib/mv_web/live/member_live/form.ex:78 -#: lib/mv_web/live/user_live/form.ex:248 +#: lib/mv_web/live/user_live/form.ex:249 #, elixir-autogen, elixir-format msgid "Saving..." msgstr "" #: lib/mv_web/live/member_live/form.ex:54 #: lib/mv_web/live/member_live/index.html.heex:130 -#: lib/mv_web/live/member_live/show.ex:59 +#: lib/mv_web/live/member_live/show.ex:60 #, elixir-autogen, elixir-format msgid "Street" msgstr "" -#: lib/mv_web/live/member_live/show.ex:47 +#: lib/mv_web/live/member_live/show.ex:48 #, elixir-autogen, elixir-format msgid "Id" msgstr "" +#: lib/mv_web/live/custom_field_live/index_component.ex:68 #: 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/show.ex:52 +#: lib/mv_web/live/member_live/index/formatter.ex:62 +#: lib/mv_web/live/member_live/show.ex:53 #, elixir-autogen, elixir-format msgid "No" msgstr "" -#: lib/mv_web/live/member_live/show.ex:115 +#: lib/mv_web/live/member_live/show.ex:113 #, elixir-autogen, elixir-format, fuzzy msgid "Show Member" msgstr "" -#: lib/mv_web/live/member_live/show.ex:33 +#: 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/custom_field_live/index_component.ex:65 #: lib/mv_web/live/member_live/index.html.heex:234 -#: lib/mv_web/live/member_live/index/formatter.ex:60 -#: lib/mv_web/live/member_live/show.ex:52 +#: lib/mv_web/live/member_live/index/formatter.ex:61 +#: lib/mv_web/live/member_live/show.ex:53 #, elixir-autogen, elixir-format msgid "Yes" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:110 +#: lib/mv_web/live/custom_field_live/form_component.ex:93 #: lib/mv_web/live/custom_field_value_live/form.ex:233 #: lib/mv_web/live/member_live/form.ex:137 #, elixir-autogen, elixir-format msgid "create" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:111 +#: lib/mv_web/live/custom_field_live/form_component.ex:94 #: lib/mv_web/live/custom_field_value_live/form.ex:234 #: lib/mv_web/live/member_live/form.ex:138 #, elixir-autogen, elixir-format @@ -250,11 +254,11 @@ msgstr "" msgid "Your password has successfully been reset" msgstr "" -#: 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/form_component.ex:61 +#: lib/mv_web/live/custom_field_live/index_component.ex:138 #: lib/mv_web/live/custom_field_value_live/form.ex:77 #: lib/mv_web/live/member_live/form.ex:81 -#: lib/mv_web/live/user_live/form.ex:251 +#: lib/mv_web/live/user_live/form.ex:252 #, elixir-autogen, elixir-format msgid "Cancel" msgstr "" @@ -264,7 +268,8 @@ msgstr "" msgid "Choose a member" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:61 +#: lib/mv_web/live/custom_field_live/form_component.ex:50 +#: lib/mv_web/live/custom_field_live/index_component.ex:59 #, elixir-autogen, elixir-format msgid "Description" msgstr "" @@ -274,17 +279,12 @@ msgstr "" msgid "Edit User" msgstr "" -#: lib/mv_web/live/user_live/show.ex:53 +#: lib/mv_web/live/user_live/show.ex:51 #, elixir-autogen, elixir-format msgid "Enabled" 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_component.ex:51 #, elixir-autogen, elixir-format msgid "Immutable" msgstr "" @@ -306,13 +306,14 @@ msgid "Member" msgstr "" #: lib/mv_web/components/layouts/navbar.ex:25 -#: 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 #, elixir-autogen, elixir-format msgid "Members" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:51 +#: lib/mv_web/live/custom_field_live/form_component.ex:40 +#: lib/mv_web/live/custom_field_live/index_component.ex:53 #, elixir-autogen, elixir-format msgid "Name" msgstr "" @@ -322,16 +323,11 @@ msgstr "" msgid "New User" msgstr "" -#: lib/mv_web/live/user_live/show.ex:53 +#: lib/mv_web/live/user_live/show.ex:51 #, elixir-autogen, elixir-format msgid "Not enabled" msgstr "" -#: lib/mv_web/live/user_live/show.ex:51 -#, elixir-autogen, elixir-format, fuzzy -msgid "Not set" -msgstr "" - #: 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:224 @@ -339,13 +335,7 @@ msgstr "" msgid "Note" msgstr "" -#: 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 +#: lib/mv_web/live/user_live/show.ex:50 #, elixir-autogen, elixir-format msgid "Password Authentication" msgstr "" @@ -355,7 +345,7 @@ msgstr "" msgid "Profil" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:63 +#: lib/mv_web/live/custom_field_live/form_component.ex:52 #, elixir-autogen, elixir-format msgid "Required" msgstr "" @@ -370,17 +360,20 @@ msgstr "" msgid "Select member" msgstr "" +#: lib/mv_web/components/layouts/navbar.ex:26 #: lib/mv_web/components/layouts/navbar.ex:99 +#: lib/mv_web/live/global_settings_live.ex:32 +#: lib/mv_web/live/global_settings_live.ex:42 #, elixir-autogen, elixir-format msgid "Settings" msgstr "" -#: lib/mv_web/live/user_live/form.ex:249 +#: lib/mv_web/live/user_live/form.ex:250 #, elixir-autogen, elixir-format, fuzzy msgid "Save User" msgstr "" -#: lib/mv_web/live/user_live/show.ex:79 +#: lib/mv_web/live/user_live/show.ex:77 #, elixir-autogen, elixir-format, fuzzy msgid "Show User" msgstr "" @@ -400,7 +393,7 @@ msgstr "" msgid "Use this form to manage user records in your database." msgstr "" -#: lib/mv_web/live/user_live/form.ex:266 +#: lib/mv_web/live/user_live/form.ex:268 #: lib/mv_web/live/user_live/show.ex:34 #, elixir-autogen, elixir-format msgid "User" @@ -411,7 +404,7 @@ msgstr "" msgid "Value" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:56 +#: lib/mv_web/live/custom_field_live/form_component.ex:45 #, elixir-autogen, elixir-format msgid "Value type" msgstr "" @@ -428,7 +421,7 @@ msgstr "" msgid "descending" msgstr "" -#: lib/mv_web/live/user_live/form.ex:265 +#: lib/mv_web/live/user_live/form.ex:267 #, elixir-autogen, elixir-format msgid "New" msgstr "" @@ -504,30 +497,30 @@ msgid "User will be created without a password. Check 'Set Password' to add one. msgstr "User will be created without a password. Check 'Set Password' to add one." #: lib/mv_web/live/user_live/form.ex:126 -#: lib/mv_web/live/user_live/index.html.heex:53 -#: lib/mv_web/live/user_live/show.ex:55 +#: lib/mv_web/live/user_live/index.html.heex:52 +#: lib/mv_web/live/user_live/show.ex:53 #, elixir-autogen, elixir-format, fuzzy msgid "Linked Member" msgstr "" -#: lib/mv_web/live/member_live/show.ex:62 +#: lib/mv_web/live/member_live/show.ex:63 #, elixir-autogen, elixir-format msgid "Linked User" msgstr "" -#: lib/mv_web/live/user_live/index.html.heex:57 -#: lib/mv_web/live/user_live/show.ex:65 +#: lib/mv_web/live/user_live/index.html.heex:56 +#: lib/mv_web/live/user_live/show.ex:63 #, elixir-autogen, elixir-format msgid "No member linked" msgstr "" -#: lib/mv_web/live/member_live/show.ex:72 +#: lib/mv_web/live/member_live/show.ex:73 #, elixir-autogen, elixir-format msgid "No user linked" msgstr "" -#: lib/mv_web/live/member_live/show.ex:36 -#: lib/mv_web/live/member_live/show.ex:38 +#: lib/mv_web/live/member_live/show.ex:37 +#: lib/mv_web/live/member_live/show.ex:39 #, elixir-autogen, elixir-format msgid "Back to members list" msgstr "" @@ -609,7 +602,7 @@ msgid "Choose a custom field" msgstr "" #: lib/mv_web/live/member_live/form.ex:58 -#: lib/mv_web/live/member_live/show.ex:77 +#: lib/mv_web/live/member_live/show.ex:78 #, elixir-autogen, elixir-format msgid "Custom Field Values" msgstr "" @@ -619,7 +612,7 @@ msgstr "" msgid "Custom field" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:117 +#: lib/mv_web/live/global_settings_live.ex:105 #, elixir-autogen, elixir-format msgid "Custom field %{action} successfully" msgstr "" @@ -634,7 +627,7 @@ msgstr "" msgid "Please select a custom field first" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:67 +#: lib/mv_web/live/custom_field_live/form_component.ex:64 #, elixir-autogen, elixir-format msgid "Save Custom field" msgstr "" @@ -644,12 +637,7 @@ msgstr "" msgid "Save Custom field value" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:46 -#, elixir-autogen, elixir-format, fuzzy -msgid "Use this form to manage custom_field records in your database." -msgstr "" - -#: lib/mv_web/components/layouts/navbar.ex:26 +#: lib/mv_web/live/custom_field_live/index_component.ex:20 #, elixir-autogen, elixir-format, fuzzy msgid "Custom Fields" msgstr "" @@ -659,70 +647,64 @@ msgstr "" msgid "Use this form to manage Custom Field Value records in your database." msgstr "" -#: lib/mv_web/live/custom_field_live/show.ex:56 -#, elixir-autogen, elixir-format -msgid "Auto-generated identifier (immutable)" -msgstr "" - -#: lib/mv_web/live/custom_field_live/index.ex:79 +#: lib/mv_web/live/custom_field_live/index_component.ex:97 #, elixir-autogen, elixir-format msgid "%{count} member has a value assigned for this custom field." msgid_plural "%{count} members have values assigned for this custom field." msgstr[0] "" msgstr[1] "" -#: lib/mv_web/live/custom_field_live/index.ex:87 +#: lib/mv_web/live/custom_field_live/index_component.ex:105 #, elixir-autogen, elixir-format msgid "All custom field values will be permanently deleted when you delete this custom field." msgstr "" -#: lib/mv_web/live/custom_field_live/index.ex:72 +#: lib/mv_web/live/custom_field_live/index_component.ex:90 #, elixir-autogen, elixir-format msgid "Delete Custom Field" msgstr "" -#: lib/mv_web/live/custom_field_live/index.ex:127 +#: lib/mv_web/live/custom_field_live/index_component.ex:146 #, elixir-autogen, elixir-format msgid "Delete Custom Field and All Values" msgstr "" -#: lib/mv_web/live/custom_field_live/index.ex:109 +#: lib/mv_web/live/custom_field_live/index_component.ex:127 #, elixir-autogen, elixir-format msgid "Enter the text above to confirm" msgstr "" -#: lib/mv_web/live/custom_field_live/index.ex:97 +#: lib/mv_web/live/custom_field_live/index_component.ex:115 #, elixir-autogen, elixir-format, fuzzy msgid "To confirm deletion, please enter this text:" msgstr "" -#: lib/mv_web/live/custom_field_live/form.ex:64 +#: lib/mv_web/live/custom_field_live/form_component.ex:56 #, elixir-autogen, elixir-format msgid "Show in overview" msgstr "" -#: lib/mv_web/live/global_settings_live.ex:51 +#: lib/mv_web/live/global_settings_live.ex:56 #, elixir-autogen, elixir-format msgid "Association Name" msgstr "" -#: lib/mv_web/live/global_settings_live.ex:31 -#: lib/mv_web/live/global_settings_live.ex:41 +#: lib/mv_web/live/global_settings_live.ex:50 #, elixir-autogen, elixir-format, fuzzy msgid "Club Settings" msgstr "" -#: lib/mv_web/live/global_settings_live.ex:43 +#: lib/mv_web/live/global_settings_live.ex:44 #, elixir-autogen, elixir-format msgid "Manage global settings for the association." msgstr "" -#: lib/mv_web/live/global_settings_live.ex:56 +#: lib/mv_web/live/global_settings_live.ex:61 #, elixir-autogen, elixir-format, fuzzy msgid "Save Settings" msgstr "" -#: lib/mv_web/live/global_settings_live.ex:75 +#: lib/mv_web/live/global_settings_live.ex:87 #, elixir-autogen, elixir-format msgid "Settings updated successfully" msgstr "" @@ -737,7 +719,7 @@ msgstr "" msgid "Available members" msgstr "" -#: lib/mv_web/live/user_live/form.ex:357 +#: lib/mv_web/live/user_live/form.ex:359 #, elixir-autogen, elixir-format msgid "Failed to link member: %{error}" msgstr "" @@ -777,7 +759,7 @@ msgstr "" msgid "Unlinking scheduled" msgstr "" -#: lib/mv_web/live/member_live/index.ex:159 +#: lib/mv_web/live/member_live/index.ex:160 #, elixir-autogen, elixir-format msgid "Copied %{count} email address to clipboard" msgid_plural "Copied %{count} email addresses to clipboard" @@ -794,12 +776,12 @@ msgstr "" msgid "Copy emails" msgstr "" -#: lib/mv_web/live/member_live/index.ex:148 +#: lib/mv_web/live/member_live/index.ex:149 #, elixir-autogen, elixir-format msgid "No email addresses found" msgstr "" -#: lib/mv_web/live/member_live/index.ex:145 +#: lib/mv_web/live/member_live/index.ex:146 #, elixir-autogen, elixir-format, fuzzy msgid "No members selected" msgstr "" @@ -814,7 +796,7 @@ msgstr "" msgid "Open in email program" msgstr "" -#: lib/mv_web/live/member_live/index.ex:168 +#: lib/mv_web/live/member_live/index.ex:169 #, elixir-autogen, elixir-format msgid "Tip: Paste email addresses into the BCC field for privacy compliance" msgstr "" @@ -854,8 +836,84 @@ msgstr "" msgid "Payment filter" msgstr "" +#: lib/mv_web/live/global_settings_live.ex:110 +#, elixir-autogen, elixir-format, fuzzy +msgid "Custom field deleted successfully" +msgstr "" + +#: lib/mv_web/live/custom_field_live/form_component.ex:29 +#, elixir-autogen, elixir-format, fuzzy +msgid "Edit Custom Field" +msgstr "" + +#: lib/mv_web/live/global_settings_live.ex:119 +#, elixir-autogen, elixir-format +msgid "Failed to delete custom field: %{error}" +msgstr "" + +#: lib/mv_web/live/custom_field_live/form_component.ex:29 +#, elixir-autogen, elixir-format, fuzzy +msgid "New Custom Field" +msgstr "" + +#: lib/mv_web/live/custom_field_live/index_component.ex:26 +#, elixir-autogen, elixir-format, fuzzy +msgid "New Custom field" +msgstr "" + +#: lib/mv_web/live/custom_field_live/index_component.ex:63 +#, elixir-autogen, elixir-format, fuzzy +msgid "Show in Overview" +msgstr "" + +#: lib/mv_web/live/global_settings_live.ex:125 +#, elixir-autogen, elixir-format +msgid "Slug does not match. Deletion cancelled." +msgstr "" + +#: lib/mv_web/live/custom_field_live/index_component.ex:55 +#, elixir-autogen, elixir-format, fuzzy +msgid "Value Type" +msgstr "" + +#: lib/mv_web/live/custom_field_live/index_component.ex:22 +#, elixir-autogen, elixir-format +msgid "These will appear in addition to other data when adding new members." +msgstr "" + +#: lib/mv_web/live/custom_field_live/form_component.ex:25 +#, elixir-autogen, elixir-format +msgid "Back to custom field overview" +msgstr "" + +#~ #: lib/mv_web/live/custom_field_live/show.ex:56 +#~ #, elixir-autogen, elixir-format +#~ msgid "Auto-generated identifier (immutable)" +#~ msgstr "" + #~ #: lib/mv_web/live/member_live/form.ex:48 #~ #: lib/mv_web/live/member_live/show.ex:51 #~ #, elixir-autogen, elixir-format #~ msgid "Birth Date" #~ msgstr "" + +#~ #: lib/mv_web/live/user_live/show.ex:49 +#~ #, elixir-autogen, elixir-format +#~ msgid "ID" +#~ msgstr "" + +#~ #: lib/mv_web/live/user_live/show.ex:51 +#~ #, elixir-autogen, elixir-format, fuzzy +#~ msgid "Not set" +#~ msgstr "" + +#~ #: 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/custom_field_live/form.ex:46 +#~ #, elixir-autogen, elixir-format, fuzzy +#~ msgid "Use this form to manage custom_field records in your database." +#~ msgstr "" diff --git a/test/membership/member_field_visibility_test.exs b/test/membership/member_field_visibility_test.exs deleted file mode 100644 index 9963169..0000000 --- a/test/membership/member_field_visibility_test.exs +++ /dev/null @@ -1,14 +0,0 @@ -defmodule Mv.Membership.MemberFieldVisibilityTest do - @moduledoc """ - Tests for member field visibility configuration. - - Tests cover: - - Member fields are visible by default (show_in_overview: true) - - Member fields can be hidden (show_in_overview: false) - - Checking if a specific field is visible - - Configuration is stored in Settings resource - """ - use Mv.DataCase, async: true - - alias Mv.Membership.Member -end diff --git a/test/mv_web/live/custom_field_live/deletion_test.exs b/test/mv_web/live/custom_field_live/deletion_test.exs index f0317e0..322cf38 100644 --- a/test/mv_web/live/custom_field_live/deletion_test.exs +++ b/test/mv_web/live/custom_field_live/deletion_test.exs @@ -1,6 +1,7 @@ defmodule MvWeb.CustomFieldLive.DeletionTest do @moduledoc """ - Tests for CustomFieldLive.Index deletion modal and slug confirmation. + Tests for CustomFieldLive.IndexComponent deletion modal and slug confirmation. + Tests the custom field management component embedded in the settings page. Tests cover: - Opening deletion confirmation modal @@ -39,11 +40,11 @@ defmodule MvWeb.CustomFieldLive.DeletionTest do # Create custom field value create_custom_field_value(member, custom_field, "test") - {:ok, view, _html} = live(conn, ~p"/custom_fields") + {:ok, view, _html} = live(conn, ~p"/settings") - # Click delete button + # Click delete button - find the delete link within the component view - |> element("a", "Delete") + |> element("#custom-fields-component a", "Delete") |> render_click() # Modal should be visible @@ -65,10 +66,10 @@ defmodule MvWeb.CustomFieldLive.DeletionTest do create_custom_field_value(member1, custom_field, "test1") create_custom_field_value(member2, custom_field, "test2") - {:ok, view, _html} = live(conn, ~p"/custom_fields") + {:ok, view, _html} = live(conn, ~p"/settings") view - |> element("a", "Delete") + |> element("#custom-fields-component a", "Delete") |> render_click() # Should show plural form @@ -78,10 +79,10 @@ defmodule MvWeb.CustomFieldLive.DeletionTest do test "shows 0 members for custom field without values", %{conn: conn} do {:ok, _custom_field} = create_custom_field("test_field", :string) - {:ok, view, _html} = live(conn, ~p"/custom_fields") + {:ok, view, _html} = live(conn, ~p"/settings") view - |> element("a", "Delete") + |> element("#custom-fields-component a", "Delete") |> render_click() # Should show 0 members @@ -93,15 +94,16 @@ defmodule MvWeb.CustomFieldLive.DeletionTest do test "updates confirmation state when typing", %{conn: conn} do {:ok, custom_field} = create_custom_field("test_field", :string) - {:ok, view, _html} = live(conn, ~p"/custom_fields") + {:ok, view, _html} = live(conn, ~p"/settings") view - |> element("a", "Delete") + |> element("#custom-fields-component a", "Delete") |> render_click() - # Type in slug input + # Type in slug input - use element to find the form with phx-target view - |> render_change("update_slug_confirmation", %{"slug" => custom_field.slug}) + |> element("#delete-custom-field-modal form") + |> render_change(%{"slug" => custom_field.slug}) # Confirm button should be enabled now (no disabled attribute) html = render(view) @@ -111,15 +113,16 @@ defmodule MvWeb.CustomFieldLive.DeletionTest do test "delete button is disabled when slug doesn't match", %{conn: conn} do {:ok, _custom_field} = create_custom_field("test_field", :string) - {:ok, view, _html} = live(conn, ~p"/custom_fields") + {:ok, view, _html} = live(conn, ~p"/settings") view - |> element("a", "Delete") + |> element("#custom-fields-component a", "Delete") |> render_click() - # Type wrong slug + # Type wrong slug - use element to find the form with phx-target view - |> render_change("update_slug_confirmation", %{"slug" => "wrong-slug"}) + |> element("#delete-custom-field-modal form") + |> render_change(%{"slug" => "wrong-slug"}) # Button should be disabled html = render(view) @@ -133,20 +136,21 @@ defmodule MvWeb.CustomFieldLive.DeletionTest do {:ok, custom_field} = create_custom_field("test_field", :string) {:ok, custom_field_value} = create_custom_field_value(member, custom_field, "test") - {:ok, view, _html} = live(conn, ~p"/custom_fields") + {:ok, view, _html} = live(conn, ~p"/settings") # Open modal view - |> element("a", "Delete") + |> element("#custom-fields-component a", "Delete") |> render_click() - # Enter correct slug + # Enter correct slug - use element to find the form with phx-target view - |> render_change("update_slug_confirmation", %{"slug" => custom_field.slug}) + |> element("#delete-custom-field-modal form") + |> render_change(%{"slug" => custom_field.slug}) # Click confirm view - |> element("button", "Delete Custom Field and All Values") + |> element("#delete-custom-field-modal button", "Delete Custom Field and All Values") |> render_click() # Should show success message @@ -162,27 +166,28 @@ defmodule MvWeb.CustomFieldLive.DeletionTest do assert {:ok, _} = Ash.get(Member, member.id) end - test "shows error when slug doesn't match", %{conn: conn} do + test "button remains disabled and custom field not deleted when slug doesn't match", %{ + conn: conn + } do {:ok, custom_field} = create_custom_field("test_field", :string) - {:ok, view, _html} = live(conn, ~p"/custom_fields") + {:ok, view, _html} = live(conn, ~p"/settings") view - |> element("a", "Delete") + |> element("#custom-fields-component a", "Delete") |> render_click() - # Enter wrong slug + # Enter wrong slug - use element to find the form with phx-target view - |> render_change("update_slug_confirmation", %{"slug" => "wrong-slug"}) + |> element("#delete-custom-field-modal form") + |> render_change(%{"slug" => "wrong-slug"}) - # Try to confirm (button should be disabled, but test the handler anyway) - view - |> render_click("confirm_delete", %{}) + # Button should be disabled and we cannot click it + # The test verifies that the button is properly disabled in the UI + html = render(view) + assert html =~ ~r/disabled(?:=""|(?!\w))/ - # Should show error message - assert render(view) =~ "Slug does not match" - - # Custom field should still exist + # Custom field should still exist since deletion couldn't proceed assert {:ok, _} = Ash.get(CustomField, custom_field.id) end end @@ -191,10 +196,10 @@ defmodule MvWeb.CustomFieldLive.DeletionTest do test "closes modal without deleting", %{conn: conn} do {:ok, custom_field} = create_custom_field("test_field", :string) - {:ok, view, _html} = live(conn, ~p"/custom_fields") + {:ok, view, _html} = live(conn, ~p"/settings") view - |> element("a", "Delete") + |> element("#custom-fields-component a", "Delete") |> render_click() # Modal should be visible @@ -202,7 +207,7 @@ defmodule MvWeb.CustomFieldLive.DeletionTest do # Click cancel view - |> element("button", "Cancel") + |> element("#delete-custom-field-modal button", "Cancel") |> render_click() # Modal should be gone diff --git a/test/mv_web/live/profile_navigation_test.exs b/test/mv_web/live/profile_navigation_test.exs index 5ba5eb0..4b383c6 100644 --- a/test/mv_web/live/profile_navigation_test.exs +++ b/test/mv_web/live/profile_navigation_test.exs @@ -148,8 +148,6 @@ defmodule MvWeb.ProfileNavigationTest do "/members/new", "/custom_field_values", "/custom_field_values/new", - "/custom_fields", - "/custom_fields/new", "/users", "/users/new" ]