diff --git a/lib/mv_web/controllers/member_export_controller.ex b/lib/mv_web/controllers/member_export_controller.ex index 801bf0a..cad32a2 100644 --- a/lib/mv_web/controllers/member_export_controller.ex +++ b/lib/mv_web/controllers/member_export_controller.ex @@ -10,10 +10,10 @@ defmodule MvWeb.MemberExportController do require Ash.Query import Ash.Expr - alias Mv.Membership.Member - alias Mv.Membership.CustomField - alias Mv.Membership.MembersCSV alias Mv.Authorization.Actor + alias Mv.Membership.CustomField + alias Mv.Membership.Member + alias Mv.Membership.MembersCSV @member_fields_allowlist Mv.Constants.member_fields() |> Enum.map(&Atom.to_string/1) @custom_field_prefix Mv.Constants.custom_field_prefix() @@ -100,7 +100,9 @@ defmodule MvWeb.MemberExportController do defp filter_valid_uuids(id_list) when is_list(id_list) do id_list - |> Enum.filter(fn id -> is_binary(id) and match?({:ok, _}, Ecto.UUID.cast(id)) end) + |> Enum.filter(fn id -> + is_binary(id) and match?({:ok, _}, Ecto.UUID.cast(id)) + end) |> Enum.uniq() end @@ -130,14 +132,18 @@ defmodule MvWeb.MemberExportController do |> Ash.Query.filter(expr(id in ^custom_field_ids)) |> Ash.Query.select([:id, :name, :value_type]) - case Ash.read(query, actor: actor) do - {:ok, custom_fields} -> - by_id = build_custom_fields_by_id(custom_field_ids, custom_fields) - {:ok, by_id} + query + |> Ash.read(actor: actor) + |> handle_custom_fields_read_result(custom_field_ids) + end - {:error, %Ash.Error.Forbidden{}} -> - {:error, :forbidden} - end + defp handle_custom_fields_read_result({:ok, custom_fields}, custom_field_ids) do + by_id = build_custom_fields_by_id(custom_field_ids, custom_fields) + {:ok, by_id} + end + + defp handle_custom_fields_read_result({:error, %Ash.Error.Forbidden{}}, _custom_field_ids) do + {:error, :forbidden} end defp build_custom_fields_by_id(custom_field_ids, custom_fields) do diff --git a/lib/mv_web/live/import_export_live.ex b/lib/mv_web/live/import_export_live.ex index 384c39b..86c3e1f 100644 --- a/lib/mv_web/live/import_export_live.ex +++ b/lib/mv_web/live/import_export_live.ex @@ -642,24 +642,48 @@ defmodule MvWeb.ImportExportLive do # Start async task to process chunk in production # Use start_child for fire-and-forget: no monitor, no Task messages # We only use our own send/2 messages for communication - Task.Supervisor.start_child(Mv.TaskSupervisor, fn -> - # Set locale in task process for translations - Gettext.put_locale(MvWeb.Gettext, locale) - - process_chunk_with_error_handling( + Task.Supervisor.start_child( + Mv.TaskSupervisor, + build_chunk_processing_task( chunk, import_state.column_map, import_state.custom_field_map, opts, live_view_pid, - idx + idx, + locale ) - end) + ) end {:noreply, socket} end + # Builds the task function for processing a chunk asynchronously. + defp build_chunk_processing_task( + chunk, + column_map, + custom_field_map, + opts, + live_view_pid, + idx, + locale + ) do + fn -> + # Set locale in task process for translations + Gettext.put_locale(MvWeb.Gettext, locale) + + process_chunk_with_error_handling( + chunk, + column_map, + custom_field_map, + opts, + live_view_pid, + idx + ) + end + end + # Handles chunk processing result from async task and schedules the next chunk. @spec handle_chunk_result( Phoenix.LiveView.Socket.t(), diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index 4cc92f4..b0d4d2f 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -2319,6 +2319,21 @@ msgstr "Mitgliederdaten verwalten" msgid "Use the data field name as the CSV column header in your file. Data fields must exist in Mila before importing, so they must be listed in the list of member data (like e-mail or first name). Unknown data field columns will be ignored with a warning." msgstr "Verwende die Namen der Datenfelder als Spaltennamen in der CSV Datei. Datenfelder müssen in Mila bereits angelegt sein, damit sie importiert werden können. sie müssen in der Liste der Mitgliederdaten als Datenfeld enthalten sein (z.B. E-Mail). Spalten mit unbekannten Spaltenüberschriften werden mit einer Warnung ignoriert." +#: lib/mv_web/live/member_live/index.html.heex +#, elixir-autogen, elixir-format, fuzzy +msgid "Export members to CSV" +msgstr "Mitglieder importieren (CSV)" + +#: lib/mv_web/live/member_live/index.html.heex +#, elixir-autogen, elixir-format +msgid "Export to CSV" +msgstr "Als CSV exportieren" + +#: lib/mv_web/live/member_live/index.html.heex +#, elixir-autogen, elixir-format +msgid "all" +msgstr "alle" + #~ #: lib/mv_web/live/global_settings_live.ex #~ #, elixir-autogen, elixir-format, fuzzy #~ msgid "Custom Fields in CSV Import" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index d3da51f..e2192d0 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -2319,3 +2319,18 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Use the data field name as the CSV column header in your file. Data fields must exist in Mila before importing, so they must be listed in the list of member data (like e-mail or first name). Unknown data field columns will be ignored with a warning." msgstr "" + +#: lib/mv_web/live/member_live/index.html.heex +#, elixir-autogen, elixir-format +msgid "Export members to CSV" +msgstr "" + +#: lib/mv_web/live/member_live/index.html.heex +#, elixir-autogen, elixir-format +msgid "Export to CSV" +msgstr "" + +#: lib/mv_web/live/member_live/index.html.heex +#, elixir-autogen, elixir-format +msgid "all" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index be17f98..1c59d95 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -2320,6 +2320,21 @@ msgstr "" msgid "Use the data field name as the CSV column header in your file. Data fields must exist in Mila before importing, so they must be listed in the list of member data (like e-mail or first name). Unknown data field columns will be ignored with a warning." msgstr "" +#: lib/mv_web/live/member_live/index.html.heex +#, elixir-autogen, elixir-format, fuzzy +msgid "Export members to CSV" +msgstr "" + +#: lib/mv_web/live/member_live/index.html.heex +#, elixir-autogen, elixir-format +msgid "Export to CSV" +msgstr "" + +#: lib/mv_web/live/member_live/index.html.heex +#, elixir-autogen, elixir-format +msgid "all" +msgstr "" + #~ #: lib/mv_web/live/global_settings_live.ex #~ #, elixir-autogen, elixir-format, fuzzy #~ msgid "Custom Fields in CSV Import"