From cecb547bd642a663d53fd17fcb412886fb33165f Mon Sep 17 00:00:00 2001 From: carla Date: Mon, 16 Feb 2026 16:53:37 +0100 Subject: [PATCH 1/4] bug: adds membership startdate column --- lib/mv_web/live/member_live/index.html.heex | 107 ++++++++++++-------- 1 file changed, 66 insertions(+), 41 deletions(-) diff --git a/lib/mv_web/live/member_live/index.html.heex b/lib/mv_web/live/member_live/index.html.heex index b490618..f8be88d 100644 --- a/lib/mv_web/live/member_live/index.html.heex +++ b/lib/mv_web/live/member_live/index.html.heex @@ -180,6 +180,67 @@ > {member.email} + <:col + :let={member} + :if={:join_date in @member_fields_visible} + label={ + ~H""" + <.live_component + module={MvWeb.Components.SortHeaderComponent} + id={:sort_join_date} + field={:join_date} + label={gettext("Join Date")} + sort_field={@sort_field} + sort_order={@sort_order} + /> + """ + } + > + {MvWeb.MemberLive.Index.format_date(member.join_date)} + + <:col + :let={member} + :if={:exit_date in @member_fields_visible} + label={ + ~H""" + <.live_component + module={MvWeb.Components.SortHeaderComponent} + id={:sort_exit_date} + field={:exit_date} + label={gettext("Exit Date")} + sort_field={@sort_field} + sort_order={@sort_order} + /> + """ + } + > + {MvWeb.MemberLive.Index.format_date(member.exit_date)} + + <:col + :let={member} + :if={:notes in @member_fields_visible} + label={gettext("Notes")} + > + {member.notes} + + <:col + :let={member} + :if={:city in @member_fields_visible} + label={ + ~H""" + <.live_component + module={MvWeb.Components.SortHeaderComponent} + id={:sort_city} + field={:city} + label={gettext("City")} + sort_field={@sort_field} + sort_order={@sort_order} + /> + """ + } + > + {member.city} + <:col :let={member} :if={:street in @member_fields_visible} @@ -236,57 +297,21 @@ <:col :let={member} - :if={:city in @member_fields_visible} + :if={:membership_fee_start_date in @member_fields_visible} label={ ~H""" <.live_component module={MvWeb.Components.SortHeaderComponent} - id={:sort_city} - field={:city} - label={gettext("City")} + id={:sort_membership_fee_start_date} + field={:membership_fee_start_date} + label={gettext("Membership Fee Start Date")} sort_field={@sort_field} sort_order={@sort_order} /> """ } > - {member.city} - - <:col - :let={member} - :if={:join_date in @member_fields_visible} - label={ - ~H""" - <.live_component - module={MvWeb.Components.SortHeaderComponent} - id={:sort_join_date} - field={:join_date} - label={gettext("Join Date")} - sort_field={@sort_field} - sort_order={@sort_order} - /> - """ - } - > - {MvWeb.MemberLive.Index.format_date(member.join_date)} - - <:col - :let={member} - :if={:exit_date in @member_fields_visible} - label={ - ~H""" - <.live_component - module={MvWeb.Components.SortHeaderComponent} - id={:sort_exit_date} - field={:exit_date} - label={gettext("Exit Date")} - sort_field={@sort_field} - sort_order={@sort_order} - /> - """ - } - > - {MvWeb.MemberLive.Index.format_date(member.exit_date)} + {MvWeb.MemberLive.Index.format_date(member.membership_fee_start_date)} <:col :let={member} From 49bd2eee0b0663dbd7c8592429681f3eb11c3019 Mon Sep 17 00:00:00 2001 From: carla Date: Tue, 17 Feb 2026 17:59:30 +0100 Subject: [PATCH 2/4] i18n: update translations --- priv/gettext/de/LC_MESSAGES/default.po | 2 ++ priv/gettext/default.pot | 2 ++ priv/gettext/en/LC_MESSAGES/default.po | 2 ++ 3 files changed, 6 insertions(+) diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index e40d053..0187da6 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -144,6 +144,7 @@ msgid "House Number" msgstr "Hausnummer" #: lib/mv_web/live/member_live/form.ex +#: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/live/member_live/show.ex #: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format @@ -1542,6 +1543,7 @@ msgstr "Du bist dabei alle %{count} Zyklen für dieses Mitglied zu löschen." msgid "Delete Membership Fee Type" msgstr "Mitgliedsbeitragsart löschen" +#: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format, fuzzy msgid "Membership Fee Start Date" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index fb156df..a05597c 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -145,6 +145,7 @@ msgid "House Number" msgstr "" #: lib/mv_web/live/member_live/form.ex +#: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/live/member_live/show.ex #: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format @@ -1543,6 +1544,7 @@ msgstr "" msgid "Delete Membership Fee Type" msgstr "" +#: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format msgid "Membership Fee Start Date" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index f12d478..261cbe4 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -145,6 +145,7 @@ msgid "House Number" msgstr "" #: lib/mv_web/live/member_live/form.ex +#: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/live/member_live/show.ex #: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format @@ -1543,6 +1544,7 @@ msgstr "" msgid "Delete Membership Fee Type" msgstr "" +#: lib/mv_web/live/member_live/index.html.heex #: lib/mv_web/translations/member_fields.ex #, elixir-autogen, elixir-format, fuzzy msgid "Membership Fee Start Date" From ce542eae3eacd51398a312bab339e22ef5879025 Mon Sep 17 00:00:00 2001 From: carla Date: Tue, 17 Feb 2026 18:26:32 +0100 Subject: [PATCH 3/4] fix: missing actor on tturning back from edit --- lib/mv_web/live/custom_field_live/index_component.ex | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/mv_web/live/custom_field_live/index_component.ex b/lib/mv_web/live/custom_field_live/index_component.ex index 5cf0f6b..a670a3e 100644 --- a/lib/mv_web/live/custom_field_live/index_component.ex +++ b/lib/mv_web/live/custom_field_live/index_component.ex @@ -219,6 +219,9 @@ defmodule MvWeb.CustomFieldLive.IndexComponent do send(self(), {:editing_section_changed, nil}) end + # Get actor from assigns or fall back to socket assigns + actor = Map.get(assigns, :actor, socket.assigns[:actor]) + {:ok, socket |> assign(assigns) @@ -228,7 +231,7 @@ defmodule MvWeb.CustomFieldLive.IndexComponent do |> 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, stream_custom_fields(assigns[:actor], self()), reset: true)} + |> stream(:custom_fields, stream_custom_fields(actor, self()), reset: true)} end @impl true From b18f895939e1cc68718b2842b19b41110ae2946a Mon Sep 17 00:00:00 2001 From: carla Date: Tue, 17 Feb 2026 18:56:56 +0100 Subject: [PATCH 4/4] chore: rename ImportExport module to Import --- lib/mv/membership/import/import_runner.ex | 2 +- lib/mv_web/components/layouts/sidebar.ex | 2 +- .../{import_export_live.ex => import_live.ex} | 27 +---- .../components.ex | 4 +- lib/mv_web/router.ex | 4 +- priv/gettext/de/LC_MESSAGES/default.po | 98 +++++++++---------- priv/gettext/default.pot | 83 +++++++--------- priv/gettext/en/LC_MESSAGES/default.po | 98 +++++++++---------- .../live/global_settings_live_config_test.exs | 2 +- ...ort_live_test.exs => import_live_test.exs} | 38 ++++--- 10 files changed, 161 insertions(+), 197 deletions(-) rename lib/mv_web/live/{import_export_live.ex => import_live.ex} (94%) rename lib/mv_web/live/{import_export_live => import_live}/components.ex (98%) rename test/mv_web/live/{import_export_live_test.exs => import_live_test.exs} (87%) diff --git a/lib/mv/membership/import/import_runner.ex b/lib/mv/membership/import/import_runner.ex index 5ff846b..eccd75f 100644 --- a/lib/mv/membership/import/import_runner.ex +++ b/lib/mv/membership/import/import_runner.ex @@ -1,7 +1,7 @@ defmodule Mv.Membership.Import.ImportRunner do @moduledoc """ Orchestrates CSV member import: file reading, progress tracking, chunk processing, - and error formatting. Used by `MvWeb.ImportExportLive` to keep LiveView thin. + and error formatting. Used by `MvWeb.ImportLive` to keep LiveView thin. This module does not depend on Phoenix or LiveView. It provides pure functions for progress/merge and side-effectful helpers (read_file_entry, process_chunk) that diff --git a/lib/mv_web/components/layouts/sidebar.ex b/lib/mv_web/components/layouts/sidebar.ex index 1896f24..8ed7f03 100644 --- a/lib/mv_web/components/layouts/sidebar.ex +++ b/lib/mv_web/components/layouts/sidebar.ex @@ -118,7 +118,7 @@ defmodule MvWeb.Layouts.Sidebar do /> <% end %> <%= if can_access_page?(@current_user, PagePaths.settings()) do %> - <.menu_subitem href={~p"/admin/import-export"} label={gettext("Import/Export")} /> + <.menu_subitem href={~p"/admin/import"} label={gettext("Import")} /> <.menu_subitem href={~p"/settings"} label={gettext("Settings")} /> <% end %> diff --git a/lib/mv_web/live/import_export_live.ex b/lib/mv_web/live/import_live.ex similarity index 94% rename from lib/mv_web/live/import_export_live.ex rename to lib/mv_web/live/import_live.ex index fe5484c..e97ecd7 100644 --- a/lib/mv_web/live/import_export_live.ex +++ b/lib/mv_web/live/import_live.ex @@ -1,6 +1,6 @@ -defmodule MvWeb.ImportExportLive do +defmodule MvWeb.ImportLive do @moduledoc """ - LiveView for importing and exporting members via CSV. + LiveView for importing members via CSV. ## Features - CSV member import (admin only) @@ -38,7 +38,7 @@ defmodule MvWeb.ImportExportLive do alias Mv.Membership.Import.ImportRunner alias Mv.Membership.Import.MemberCSV alias MvWeb.Authorization - alias MvWeb.ImportExportLive.Components + alias MvWeb.ImportLive.Components on_mount {MvWeb.LiveHelpers, :ensure_user_role_loaded} @@ -65,7 +65,7 @@ defmodule MvWeb.ImportExportLive do socket = socket - |> assign(:page_title, gettext("Import/Export")) + |> assign(:page_title, gettext("Import")) |> assign(:club_name, club_name) |> assign(:import_state, nil) |> assign(:import_progress, nil) @@ -90,13 +90,6 @@ defmodule MvWeb.ImportExportLive do def render(assigns) do ~H""" - <.header> - {gettext("Import/Export")} - <:subtitle> - {gettext("Import members from CSV files or export member data.")} - - - <%= if Authorization.can?(@current_user, :create, Mv.Membership.Member) do %> <%!-- CSV Import Section --%> <.form_section title={gettext("Import Members (CSV)")}> @@ -107,18 +100,6 @@ defmodule MvWeb.ImportExportLive do <% end %> - - <%!-- Export Section (Placeholder) --%> - <.form_section title={gettext("Export Members (CSV)")}> -
- <.icon name="hero-information-circle" class="size-5" aria-hidden="true" /> -
-

- {gettext("Export functionality will be available in a future release.")} -

-
-
- <% else %>