diff --git a/Justfile b/Justfile index 19a93bf..f44be78 100644 --- a/Justfile +++ b/Justfile @@ -9,7 +9,6 @@ migrate-database: reset-database: mix ash.reset - MIX_ENV=test mix ash.reset seed-database: mix run priv/repo/seeds.exs @@ -19,10 +18,6 @@ start-database: ci-dev: lint audit test -gettext: - mix gettext.extract - mix gettext.merge priv/gettext - lint: mix format --check-formatted mix compile --warnings-as-errors diff --git a/lib/membership/member.ex b/lib/membership/member.ex index ec2b16f..0538f45 100644 --- a/lib/membership/member.ex +++ b/lib/membership/member.ex @@ -14,23 +14,6 @@ defmodule Mv.Membership.Member do create :create_member do primary? true argument :properties, {:array, :map} - - accept [ - :first_name, - :last_name, - :email, - :birth_date, - :paid, - :phone_number, - :join_date, - :exit_date, - :notes, - :city, - :street, - :house_number, - :postal_code - ] - change manage_relationship(:properties, type: :create) end @@ -38,138 +21,12 @@ defmodule Mv.Membership.Member do primary? true require_atomic? false argument :properties, {:array, :map} - - accept [ - :first_name, - :last_name, - :email, - :birth_date, - :paid, - :phone_number, - :join_date, - :exit_date, - :notes, - :city, - :street, - :house_number, - :postal_code - ] - change manage_relationship(:properties, on_match: :update, on_no_match: :create) end end - validations do - # Required fields are covered by allow_nil? false - - # First name and last name must not be empty - validate present(:first_name) - validate present(:last_name) - validate present(:email) - - # Birth date not in the future - validate compare(:birth_date, less_than_or_equal_to: &Date.utc_today/0), - where: [present(:birth_date)], - message: "cannot be in the future" - - # Join date not in the future - validate compare(:join_date, less_than_or_equal_to: &Date.utc_today/0), - where: [present(:join_date)], - message: "cannot be in the future" - - - # Exit date not before join date - validate compare(:exit_date, greater_than: :join_date), - where: [present([:join_date, :exit_date])], - message: "cannot be before join date" - - - # Phone number format (only if set) - validate match(:phone_number, ~r/^\+?[0-9\- ]{6,20}$/), - where: [present(:phone_number)], - message: "is not a valid phone number" - - - # Postal code format (only if set) - validate match(:postal_code, ~r/^\d{5}$/), - where: [present(:postal_code)], - message: "must consist of 5 digits" - - - # Email validation with EctoCommons.EmailValidator - validate fn changeset, _ -> - email = Ash.Changeset.get_attribute(changeset, :email) - - changeset2 = - {%{}, %{email: :string}} - |> Ecto.Changeset.cast(%{email: email}, [:email]) - |> EctoCommons.EmailValidator.validate_email(:email, checks: [:html_input, :pow]) - - if changeset2.valid? do - :ok - else - {:error, field: :email, message: "is not a valid email"} - end - end - end - attributes do uuid_v7_primary_key :id - - attribute :first_name, :string do - allow_nil? false - constraints min_length: 1 - end - - attribute :last_name, :string do - allow_nil? false - constraints min_length: 1 - end - - attribute :email, :string do - allow_nil? false - constraints min_length: 5, max_length: 254 - end - - attribute :birth_date, :date do - allow_nil? true - end - - attribute :paid, :boolean do - allow_nil? true - end - - attribute :phone_number, :string do - allow_nil? true - end - - attribute :join_date, :date do - allow_nil? true - end - - attribute :exit_date, :date do - allow_nil? true - end - - attribute :notes, :string do - allow_nil? true - end - - attribute :city, :string do - allow_nil? true - end - - attribute :street, :string do - allow_nil? true - end - - attribute :house_number, :string do - allow_nil? true - end - - attribute :postal_code, :string do - allow_nil? true - end end relationships do diff --git a/lib/membership/property.ex b/lib/membership/property.ex index 2c432a8..0bd5eab 100644 --- a/lib/membership/property.ex +++ b/lib/membership/property.ex @@ -6,10 +6,6 @@ defmodule Mv.Membership.Property do postgres do table "properties" repo Mv.Repo - - references do - reference :member, on_delete: :delete - end end actions do diff --git a/lib/membership/property_type.ex b/lib/membership/property_type.ex index 7444c13..8e42fa6 100644 --- a/lib/membership/property_type.ex +++ b/lib/membership/property_type.ex @@ -21,7 +21,7 @@ defmodule Mv.Membership.PropertyType do attribute :value_type, :atom, constraints: [one_of: [:string, :integer, :boolean, :date, :email]], allow_nil?: false, - description: "Defines the datatype `Property.value` is interpreted as" + description: "Definies the datatype `Property.value` is interpreted as" attribute :description, :string, allow_nil?: true, public?: true diff --git a/lib/mv_web.ex b/lib/mv_web.ex index 4254449..de7184d 100644 --- a/lib/mv_web.ex +++ b/lib/mv_web.ex @@ -55,7 +55,6 @@ defmodule MvWeb do use Phoenix.LiveView, layout: {MvWeb.Layouts, :app} - on_mount MvWeb.LiveHelpers unquote(html_helpers()) end end diff --git a/lib/mv_web/components/core_components.ex b/lib/mv_web/components/core_components.ex index c35f1ce..1e9b835 100644 --- a/lib/mv_web/components/core_components.ex +++ b/lib/mv_web/components/core_components.ex @@ -673,28 +673,4 @@ defmodule MvWeb.CoreComponents do def translate_errors(errors, field) when is_list(errors) do for {^field, {msg, opts}} <- errors, do: translate_error({msg, opts}) end - - @doc """ - Renders a list of items with name and value pairs. - - ## Examples - <.generic_list items={[ - {item.name, item.value}, - {other.name, other.value} - ]} /> - """ - attr :items, :list, required: true, doc: "List of {name, value} tuples" - - def generic_list(assigns) do - ~H""" -
-
-
-
{name}
-
{value}
-
-
-
- """ - end end diff --git a/lib/mv_web/components/layouts/app.html.heex b/lib/mv_web/components/layouts/app.html.heex index 54258db..3b3b607 100644 --- a/lib/mv_web/components/layouts/app.html.heex +++ b/lib/mv_web/components/layouts/app.html.heex @@ -9,13 +9,6 @@

-
- - -
@elixirphoenix diff --git a/lib/mv_web/live_helpers.ex b/lib/mv_web/live_helpers.ex deleted file mode 100644 index 03d7d45..0000000 --- a/lib/mv_web/live_helpers.ex +++ /dev/null @@ -1,7 +0,0 @@ -defmodule MvWeb.LiveHelpers do - def on_mount(:default, _params, session, socket) do - locale = session["locale"] || "en" - Gettext.put_locale(locale) - {:cont, socket} - end -end diff --git a/lib/mv_web/locale_controller.ex b/lib/mv_web/locale_controller.ex deleted file mode 100644 index 3c8056f..0000000 --- a/lib/mv_web/locale_controller.ex +++ /dev/null @@ -1,18 +0,0 @@ -defmodule MvWeb.LocaleController do - use MvWeb, :controller - - def set_locale(conn, %{"locale" => locale}) do - conn - |> put_session(:locale, locale) - |> redirect(to: get_referer(conn) || "/") - end - - defp get_referer(conn) do - conn.req_headers - |> Enum.find(fn {k, _v} -> k == "referer" end) - |> case do - {_, v} -> URI.parse(v).path - _ -> nil - end - end -end diff --git a/lib/mv_web/member_live/form_component.ex b/lib/mv_web/member_live/form_component.ex index 5535d1a..101cf6c 100644 --- a/lib/mv_web/member_live/form_component.ex +++ b/lib/mv_web/member_live/form_component.ex @@ -26,9 +26,7 @@ defmodule MvWeb.MemberLive.FormComponent do
<.header> {@title} - <:subtitle> - {gettext("Use this form to manage member records and their properties.")} - + <:subtitle>Use this form to manage member records and their properties. <.simple_form @@ -38,21 +36,6 @@ defmodule MvWeb.MemberLive.FormComponent do phx-change="validate" phx-submit="save" > - <.input field={@form[:first_name]} label={gettext("First Name")} required /> - <.input field={@form[:last_name]} label={gettext("Last Name")} required /> - <.input field={@form[:email]} label={gettext("Email")} required type="email" /> - <.input field={@form[:birth_date]} label={gettext("Birth Date")} type="date" /> - <.input field={@form[:paid]} label={gettext("Paid")} type="checkbox" /> - <.input field={@form[:phone_number]} label={gettext("Phone Number")} /> - <.input field={@form[:join_date]} label={gettext("Join Date")} type="date" /> - <.input field={@form[:exit_date]} label={gettext("Exit Date")} type="date" /> - <.input field={@form[:notes]} label={gettext("Notes")} /> - <.input field={@form[:city]} label={gettext("City")} /> - <.input field={@form[:street]} label={gettext("Street")} /> - <.input field={@form[:house_number]} label={gettext("House Number")} /> - <.input field={@form[:postal_code]} label={gettext("Postal Code")} /> - -

{gettext("Custom Properties")}

<.inputs_for :let={f_property} field={@form[:properties]}> <% type = Enum.find(@property_types, &(&1.id == f_property[:property_type_id].value)) %> <.inputs_for :let={value_form} field={f_property[:value]}> @@ -72,7 +55,7 @@ defmodule MvWeb.MemberLive.FormComponent do <:actions> - <.button phx-disable-with={gettext("Saving...")}>{gettext("Save Member")} + <.button phx-disable-with="Saving...">Save Member
@@ -97,16 +80,9 @@ defmodule MvWeb.MemberLive.FormComponent do {:ok, member} -> notify_parent({:saved, member}) - 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("Member %{action} successfully", action: action)) + |> put_flash(:info, "Member #{socket.assigns.form.source.type}d successfully") |> push_patch(to: socket.assigns.patch) {:noreply, socket} diff --git a/lib/mv_web/member_live/index.ex b/lib/mv_web/member_live/index.ex index 452ebab..4e37429 100644 --- a/lib/mv_web/member_live/index.ex +++ b/lib/mv_web/member_live/index.ex @@ -5,10 +5,10 @@ defmodule MvWeb.MemberLive.Index do def render(assigns) do ~H""" <.header> - {gettext("Listing Members")} + Listing Members <:actions> <.link patch={~p"/members/new"}> - <.button>{gettext("New Member")} + <.button>New Member @@ -18,27 +18,22 @@ defmodule MvWeb.MemberLive.Index do rows={@streams.members} row_click={fn {_id, member} -> JS.navigate(~p"/members/#{member}") end} > - - <:col :let={{_id, member}} label={gettext("First Name")}>{member.first_name} - <:col :let={{_id, member}} label={gettext("Last Name")}>{member.last_name} - <:col :let={{_id, member}} label={gettext("Email")}>{member.email} - <:col :let={{_id, member}} label={gettext("City")}>{member.city} - <:col :let={{_id, member}} label={gettext("Join Date")}>{member.join_date} + <:col :let={{_id, member}} label="Id">{member.id} <:action :let={{_id, member}}>
- <.link navigate={~p"/members/#{member}"}>{gettext("Show")} + <.link navigate={~p"/members/#{member}"}>Show
- <.link patch={~p"/members/#{member}/edit"}>{gettext("Edit")} + <.link patch={~p"/members/#{member}/edit"}>Edit <:action :let={{id, member}}> <.link phx-click={JS.push("delete", value: %{id: member.id}) |> hide("##{id}")} - data-confirm={gettext("Are you sure?")} + data-confirm="Are you sure?" > - {gettext("Delete")} + Delete @@ -73,19 +68,19 @@ defmodule MvWeb.MemberLive.Index do defp apply_action(socket, :edit, %{"id" => id}) do socket - |> assign(:page_title, gettext("Edit Member")) + |> assign(:page_title, "Edit Member") |> assign(:member, Ash.get!(Mv.Membership.Member, id)) end defp apply_action(socket, :new, _params) do socket - |> assign(:page_title, gettext("New Member")) + |> assign(:page_title, "New Member") |> assign(:member, nil) end defp apply_action(socket, :index, _params) do socket - |> assign(:page_title, gettext("Listing Members")) + |> assign(:page_title, "Listing Members") |> assign(:member, nil) end diff --git a/lib/mv_web/member_live/show.ex b/lib/mv_web/member_live/show.ex index 612abd6..47e0f92 100644 --- a/lib/mv_web/member_live/show.ex +++ b/lib/mv_web/member_live/show.ex @@ -1,55 +1,25 @@ defmodule MvWeb.MemberLive.Show do use MvWeb, :live_view - import Ash.Query @impl true def render(assigns) do ~H""" <.header> - {@member.first_name} {@member.last_name} - <:subtitle>{gettext("This is a member record from your database.")} + Member {@member.id} + <:subtitle>This is a member record from your database. <:actions> <.link patch={~p"/members/#{@member}/show/edit"} phx-click={JS.push_focus()}> - <.button>{gettext("Edit member")} + <.button>Edit member <.list> - <:item title={gettext("Id")}>{@member.id} - <:item title={gettext("First Name")}>{@member.first_name} - <:item title={gettext("Last Name")}>{@member.last_name} - <:item title={gettext("Email")}>{@member.email} - <:item title={gettext("Birth Date")}>{@member.birth_date} - <:item title={gettext("Paid")}> - {if @member.paid, do: gettext("Yes"), else: gettext("No")} - - <:item title={gettext("Phone Number")}>{@member.phone_number} - <:item title={gettext("Join Date")}>{@member.join_date} - <:item title={gettext("Exit Date")}>{@member.exit_date} - <:item title={gettext("Notes")}>{@member.notes} - <:item title={gettext("City")}>{@member.city} - <:item title={gettext("Street")}>{@member.street} - <:item title={gettext("House Number")}>{@member.house_number} - <:item title={gettext("Postal Code")}>{@member.postal_code} + <:item title="Id">{@member.id} -

{gettext("Custom Properties")}

- <.generic_list items={ - Enum.map(@member.properties, fn p -> - { - # name - p.property_type && p.property_type.name, - # value - case p.value do - %{value: v} -> v - v -> v - end - } - end) - } /> - <.back navigate={~p"/members"}>{gettext("Back to members")} + <.back navigate={~p"/members"}>Back to members <.modal :if={@live_action == :edit} @@ -76,19 +46,12 @@ defmodule MvWeb.MemberLive.Show do @impl true def handle_params(%{"id" => id}, _, socket) do - query = - Mv.Membership.Member - |> filter(id == ^id) - |> load(properties: [:property_type]) - - member = Ash.read_one!(query) - {:noreply, socket |> assign(:page_title, page_title(socket.assigns.live_action)) - |> assign(:member, member)} + |> assign(:member, Ash.get!(Mv.Membership.Member, id))} end - defp page_title(:show), do: gettext("Show Member") - defp page_title(:edit), do: gettext("Edit Member") + defp page_title(:show), do: "Show Member" + defp page_title(:edit), do: "Edit Member" end diff --git a/lib/mv_web/router.ex b/lib/mv_web/router.ex index f2cde75..3e9bdca 100644 --- a/lib/mv_web/router.ex +++ b/lib/mv_web/router.ex @@ -8,7 +8,6 @@ defmodule MvWeb.Router do plug :put_root_layout, html: {MvWeb.Layouts, :root} plug :protect_from_forgery plug :put_secure_browser_headers - plug :set_locale end pipeline :api do @@ -36,8 +35,6 @@ defmodule MvWeb.Router do live "/properties/:id/edit", PropertyLive.Index, :edit live "/properties/:id", PropertyLive.Show, :show live "/properties/:id/show/edit", PropertyLive.Show, :edit - - post "/set_locale", LocaleController, :set_locale end # Other scopes may use custom stacks. @@ -71,10 +68,4 @@ defmodule MvWeb.Router do ash_admin "/" end end - - defp set_locale(conn, _opts) do - locale = get_session(conn, :locale) || "en" - Gettext.put_locale(MvWeb.Gettext, locale) - conn - end end diff --git a/mix.exs b/mix.exs index a1e30ab..fd60217 100644 --- a/mix.exs +++ b/mix.exs @@ -69,8 +69,7 @@ defmodule Mv.MixProject do {:bandit, "~> 1.5"}, {:mix_audit, "~> 2.1", only: [:dev, :test], runtime: false}, {:sobelow, "~> 0.14", only: [:dev, :test], runtime: false}, - {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, - {:ecto_commons, "~> 0.3"} + {:credo, "~> 1.7", only: [:dev, :test], runtime: false} ] end diff --git a/mix.lock b/mix.lock index 962f445..8e179eb 100644 --- a/mix.lock +++ b/mix.lock @@ -13,11 +13,9 @@ "decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"}, "dns_cluster": {:hex, :dns_cluster, "0.2.0", "aa8eb46e3bd0326bd67b84790c561733b25c5ba2fe3c7e36f28e88f384ebcb33", [:mix], [], "hexpm", "ba6f1893411c69c01b9e8e8f772062535a4cf70f3f35bcc964a324078d8c8240"}, "ecto": {:hex, :ecto, "3.12.6", "8bf762dc5b87d85b7aca7ad5fe31ef8142a84cea473a3381eb933bd925751300", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4c0cba01795463eebbcd9e4b5ef53c1ee8e68b9c482baef2a80de5a61e7a57fe"}, - "ecto_commons": {:hex, :ecto_commons, "0.3.6", "7b1d9e59396cf8c8cbe5a26d50d03f9b6d0fe6c640210dd503622f276f1e59bb", [:mix], [{:burnex, "~> 3.0", [hex: :burnex, repo: "hexpm", optional: true]}, {:ecto, "~> 3.4", [hex: :ecto, repo: "hexpm", optional: false]}, {:ex_phone_number, "~> 0.2", [hex: :ex_phone_number, repo: "hexpm", optional: false]}, {:luhn, "~> 0.3.0", [hex: :luhn, repo: "hexpm", optional: false]}], "hexpm", "3f12981a1e398f206c5d2014e7b732b7ec91b110b9cb84875cb5b28fc75d7a0a"}, "ecto_sql": {:hex, :ecto_sql, "3.12.1", "c0d0d60e85d9ff4631f12bafa454bc392ce8b9ec83531a412c12a0d415a3a4d0", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.12", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.7", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.19 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "aff5b958a899762c5f09028c847569f7dfb9cc9d63bdb8133bff8a5546de6bf5"}, "esbuild": {:hex, :esbuild, "0.10.0", "b0aa3388a1c23e727c5a3e7427c932d89ee791746b0081bbe56103e9ef3d291f", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "468489cda427b974a7cc9f03ace55368a83e1a7be12fba7e30969af78e5f8c70"}, "ets": {:hex, :ets, "0.9.0", "79c6a6c205436780486f72d84230c6cba2f8a9920456750ddd1e47389107d5fd", [:mix], [], "hexpm", "2861fdfb04bcaeff370f1a5904eec864f0a56dcfebe5921ea9aadf2a481c822b"}, - "ex_phone_number": {:hex, :ex_phone_number, "0.4.5", "2065cc48c3e9d1ed9821f50877c32f2f6898362cb990f44147ca217c5d1374ed", [:mix], [{:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: false]}], "hexpm", "67163f8706f8cbfef1b1f4b9230c461f19786d0d79fd0b22cbeeefc6f0b99d4a"}, "expo": {:hex, :expo, "1.1.0", "f7b9ed7fb5745ebe1eeedf3d6f29226c5dd52897ac67c0f8af62a07e661e5c75", [:mix], [], "hexpm", "fbadf93f4700fb44c331362177bdca9eeb8097e8b0ef525c9cc501cb9917c960"}, "file_system": {:hex, :file_system, "1.1.0", "08d232062284546c6c34426997dd7ef6ec9f8bbd090eb91780283c9016840e8f", [:mix], [], "hexpm", "bfcf81244f416871f2a2e15c1b515287faa5db9c6bcf290222206d120b3d43f6"}, "finch": {:hex, :finch, "0.19.0", "c644641491ea854fc5c1bbaef36bfc764e3f08e7185e1f084e35e0672241b76d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "fc5324ce209125d1e2fa0fcd2634601c52a787aff1cd33ee833664a5af4ea2b6"}, @@ -32,7 +30,6 @@ "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, "libgraph": {:hex, :libgraph, "0.16.0", "3936f3eca6ef826e08880230f806bfea13193e49bf153f93edcf0239d4fd1d07", [:mix], [], "hexpm", "41ca92240e8a4138c30a7e06466acc709b0cbb795c643e9e17174a178982d6bf"}, "live_debugger": {:hex, :live_debugger, "0.2.4", "2e0b02874ca562ba2d8cebb9e024c25c0ae9c1f4ee499135a70814e1dea6183e", [:mix], [{:igniter, ">= 0.5.40 and < 1.0.0-0", [hex: :igniter, repo: "hexpm", optional: true]}, {:phoenix_live_view, "~> 0.20.4 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}], "hexpm", "bfd0db143be54ccf2872f15bfd2209fbec1083d0b06b81b4cedeecb2fa9ac208"}, - "luhn": {:hex, :luhn, "0.3.3", "5aa0c6a32c2db4b9db9f9b883ba8301c1ae169d57199b9e6cb1ba2707bc51d96", [:mix], [], "hexpm", "3e823a913a25aab51352c727f135278d22954874d5f0835be81ed4fec3daf78d"}, "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, "mix_audit": {:hex, :mix_audit, "2.1.5", "c0f77cee6b4ef9d97e37772359a187a166c7a1e0e08b50edf5bf6959dfe5a016", [:make, :mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:yaml_elixir, "~> 2.11", [hex: :yaml_elixir, repo: "hexpm", optional: false]}], "hexpm", "87f9298e21da32f697af535475860dc1d3617a010e0b418d2ec6142bc8b42d69"}, @@ -61,7 +58,6 @@ "splode": {:hex, :splode, "0.2.9", "3a2776e187c82f42f5226b33b1220ccbff74f4bcc523dd4039c804caaa3ffdc7", [:mix], [], "hexpm", "8002b00c6e24f8bd1bcced3fbaa5c33346048047bb7e13d2f3ad428babbd95c3"}, "stream_data": {:hex, :stream_data, "1.2.0", "58dd3f9e88afe27dc38bef26fce0c84a9e7a96772b2925c7b32cd2435697a52b", [:mix], [], "hexpm", "eb5c546ee3466920314643edf68943a5b14b32d1da9fe01698dc92b73f89a9ed"}, "swoosh": {:hex, :swoosh, "1.19.2", "b2325aa7cd2bcd63ba023fa07a73dfc4f80660a592d40912975a879966ed9b7b", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.2.3", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.5.10 or ~> 0.6 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "cab7ef7c2c94c68fe21d3da26f6b86db118fdf4e7024ccb5842a4972c1056837"}, - "sweet_xml": {:hex, :sweet_xml, "0.7.5", "803a563113981aaac202a1dbd39771562d0ad31004ddbfc9b5090bdcd5605277", [:mix], [], "hexpm", "193b28a9b12891cae351d81a0cead165ffe67df1b73fe5866d10629f4faefb12"}, "tailwind": {:hex, :tailwind, "0.3.1", "a89d2835c580748c7a975ad7dd3f2ea5e63216dc16d44f9df492fbd12c094bed", [:mix], [], "hexpm", "98a45febdf4a87bc26682e1171acdedd6317d0919953c353fcd1b4f9f4b676a2"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, "telemetry_metrics": {:hex, :telemetry_metrics, "1.1.0", "5bd5f3b5637e0abea0426b947e3ce5dd304f8b3bc6617039e2b5a008adc02f8f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7b79e8ddfde70adb6db8a6623d1778ec66401f366e9a8f5dd0955c56bc8ce67"}, diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po deleted file mode 100644 index aa33cc3..0000000 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ /dev/null @@ -1,244 +0,0 @@ -## `msgid`s in this file come from POT (.pot) files. -## -## Do not add, change, or remove `msgid`s manually here as -## they're tied to the ones in the corresponding POT file -## (with the same domain). -## -## Use `mix gettext.extract --merge` or `mix gettext.merge` -## to merge POT files into PO files. -msgid "" -msgstr "" -"Language: en\n" - -#: lib/mv_web/components/core_components.ex:482 -#, elixir-autogen, elixir-format -msgid "Actions" -msgstr "" - -#: lib/mv_web/member_live/index.ex:39 -#, elixir-autogen, elixir-format -msgid "Are you sure?" -msgstr "Bist du sicher?" - -#: lib/mv_web/components/core_components.ex:160 -#, elixir-autogen, elixir-format -msgid "Attempting to reconnect" -msgstr "Verbindung wird wiederhergestellt" - -#: lib/mv_web/member_live/form_component.ex:48 -#: lib/mv_web/member_live/index.ex:25 -#: lib/mv_web/member_live/show.ex:30 -#, elixir-autogen, elixir-format -msgid "City" -msgstr "Stadt" - -#: lib/mv_web/member_live/index.ex:41 -#, elixir-autogen, elixir-format -msgid "Delete" -msgstr "Löschen" - -#: lib/mv_web/member_live/index.ex:33 -#, elixir-autogen, elixir-format -msgid "Edit" -msgstr "Bearbeiten" - -#: lib/mv_web/member_live/index.ex:76 -#: lib/mv_web/member_live/show.ex:91 -#, elixir-autogen, elixir-format -msgid "Edit Member" -msgstr "Mitglied bearbeiten" - -#: lib/mv_web/member_live/form_component.ex:41 -#: lib/mv_web/member_live/index.ex:24 -#: lib/mv_web/member_live/show.ex:23 -#, elixir-autogen, elixir-format -msgid "Email" -msgstr "E-Mail" - -#: lib/mv_web/components/core_components.ex:151 -#, elixir-autogen, elixir-format -msgid "Error!" -msgstr "Fehler!" - -#: lib/mv_web/member_live/form_component.ex:39 -#: lib/mv_web/member_live/index.ex:22 -#: lib/mv_web/member_live/show.ex:21 -#, elixir-autogen, elixir-format -msgid "First Name" -msgstr "Vorname" - -#: lib/mv_web/components/core_components.ex:172 -#, elixir-autogen, elixir-format -msgid "Hang in there while we get back on track" -msgstr "Bitte warten, wir stellen die Verbindung wieder her." - -#: lib/mv_web/member_live/form_component.ex:45 -#: lib/mv_web/member_live/index.ex:26 -#: lib/mv_web/member_live/show.ex:27 -#, elixir-autogen, elixir-format -msgid "Join Date" -msgstr "Beitrittsdatum" - -#: lib/mv_web/member_live/form_component.ex:40 -#: lib/mv_web/member_live/index.ex:23 -#: lib/mv_web/member_live/show.ex:22 -#, elixir-autogen, elixir-format -msgid "Last Name" -msgstr "Nachname" - -#: lib/mv_web/member_live/index.ex:8 -#: lib/mv_web/member_live/index.ex:88 -#, elixir-autogen, elixir-format -msgid "Listing Members" -msgstr "Mitglieder" - -#: lib/mv_web/member_live/index.ex:11 -#: lib/mv_web/member_live/index.ex:82 -#, elixir-autogen, elixir-format -msgid "New Member" -msgstr "Neues Mitglied" - -#: lib/mv_web/member_live/index.ex:30 -#, elixir-autogen, elixir-format -msgid "Show" -msgstr "Anzeigen" - -#: lib/mv_web/components/core_components.ex:167 -#, elixir-autogen, elixir-format -msgid "Something went wrong!" -msgstr "Etwas ist schiefgelaufen!" - -#: lib/mv_web/components/core_components.ex:150 -#, elixir-autogen, elixir-format -msgid "Success!" -msgstr "Erfolg!" - -#: lib/mv_web/components/core_components.ex:155 -#, elixir-autogen, elixir-format -msgid "We can't find the internet" -msgstr "Keine Internetverbindung gefunden" - -#: lib/mv_web/components/core_components.ex:76 -#: lib/mv_web/components/core_components.ex:130 -#, elixir-autogen, elixir-format -msgid "close" -msgstr "schließen" - -#: lib/mv_web/member_live/form_component.ex:42 -#: lib/mv_web/member_live/show.ex:24 -#, elixir-autogen, elixir-format -msgid "Birth Date" -msgstr "Geburtsdatum" - -#: lib/mv_web/member_live/form_component.ex:53 -#: lib/mv_web/member_live/show.ex:36 -#, elixir-autogen, elixir-format -msgid "Custom Properties" -msgstr "Eigene Eigenschaften" - -#: lib/mv_web/member_live/form_component.ex:46 -#: lib/mv_web/member_live/show.ex:28 -#, elixir-autogen, elixir-format -msgid "Exit Date" -msgstr "Austrittsdatum" - -#: lib/mv_web/member_live/form_component.ex:50 -#: lib/mv_web/member_live/show.ex:32 -#, elixir-autogen, elixir-format -msgid "House Number" -msgstr "Hausnummer" - -#: lib/mv_web/member_live/form_component.ex:47 -#: lib/mv_web/member_live/show.ex:29 -#, elixir-autogen, elixir-format -msgid "Notes" -msgstr "Notizen" - -#: lib/mv_web/member_live/form_component.ex:43 -#: lib/mv_web/member_live/show.ex:25 -#, elixir-autogen, elixir-format -msgid "Paid" -msgstr "Bezahlt" - -#: lib/mv_web/member_live/form_component.ex:44 -#: lib/mv_web/member_live/show.ex:26 -#, elixir-autogen, elixir-format -msgid "Phone Number" -msgstr "Telefonnummer" - -#: lib/mv_web/member_live/form_component.ex:51 -#: lib/mv_web/member_live/show.ex:33 -#, elixir-autogen, elixir-format -msgid "Postal Code" -msgstr "Postleitzahl" - -#: lib/mv_web/member_live/form_component.ex:73 -#, elixir-autogen, elixir-format -msgid "Save Member" -msgstr "Mitglied speichern" - -#: lib/mv_web/member_live/form_component.ex:73 -#, elixir-autogen, elixir-format -msgid "Saving..." -msgstr "Speichern..." - -#: lib/mv_web/member_live/form_component.ex:49 -#: lib/mv_web/member_live/show.ex:31 -#, elixir-autogen, elixir-format -msgid "Street" -msgstr "Straße" - -#: lib/mv_web/member_live/form_component.ex:29 -#, elixir-autogen, elixir-format -msgid "Use this form to manage member records and their properties." -msgstr "Dieses Formular dient zur Verwaltung von Mitgliedern und deren Eigenschaften." - -#: lib/mv_web/member_live/show.ex:50 -#, elixir-autogen, elixir-format -msgid "Back to members" -msgstr "Zurück zur Mitgliederliste" - -#: lib/mv_web/member_live/show.ex:14 -#, elixir-autogen, elixir-format -msgid "Edit member" -msgstr "Mitglied bearbeiten" - -#: lib/mv_web/member_live/show.ex:20 -#, elixir-autogen, elixir-format -msgid "Id" -msgstr "ID" - -#: lib/mv_web/member_live/show.ex:25 -#, elixir-autogen, elixir-format -msgid "No" -msgstr "Nein" - -#: lib/mv_web/member_live/show.ex:90 -#, elixir-autogen, elixir-format, fuzzy -msgid "Show Member" -msgstr "Mitglied anzeigen" - -#: lib/mv_web/member_live/show.ex:10 -#, elixir-autogen, elixir-format -msgid "This is a member record from your database." -msgstr "Dies ist ein Mitglied aus deiner Datenbank." - -#: lib/mv_web/member_live/show.ex:25 -#, elixir-autogen, elixir-format -msgid "Yes" -msgstr "Ja" - -#: lib/mv_web/member_live/form_component.ex:107 -#, elixir-autogen, elixir-format -msgid "Member %{action} successfully" -msgstr "Mitglied %{action} erfolgreich" - -#: lib/mv_web/member_live/form_component.ex:100 -#, elixir-autogen, elixir-format -msgid "create" -msgstr "erstellt" - -#: lib/mv_web/member_live/form_component.ex:101 -#, elixir-autogen, elixir-format -msgid "update" -msgstr "aktualisiert" diff --git a/priv/gettext/de/LC_MESSAGES/errors.po b/priv/gettext/de/LC_MESSAGES/errors.po deleted file mode 100644 index c0fba6d..0000000 --- a/priv/gettext/de/LC_MESSAGES/errors.po +++ /dev/null @@ -1,133 +0,0 @@ -## `msgid`s in this file come from POT (.pot) files. -## -## Do not add, change, or remove `msgid`s manually here as -## they're tied to the ones in the corresponding POT file -## (with the same domain). -## -## Use `mix gettext.extract --merge` or `mix gettext.merge` -## to merge POT files into PO files. -msgid "" -msgstr "" -"Language: en\n" - -## From Ecto.Changeset.cast/4 -msgid "can't be blank" -msgstr "" - -## From Ecto.Changeset.unique_constraint/3 -msgid "has already been taken" -msgstr "" - -## From Ecto.Changeset.put_change/3 -msgid "is invalid" -msgstr "" - -## From Ecto.Changeset.validate_acceptance/3 -msgid "must be accepted" -msgstr "" - -## From Ecto.Changeset.validate_format/3 -msgid "has invalid format" -msgstr "" - -## From Ecto.Changeset.validate_subset/3 -msgid "has an invalid entry" -msgstr "" - -## From Ecto.Changeset.validate_exclusion/3 -msgid "is reserved" -msgstr "" - -## From Ecto.Changeset.validate_confirmation/3 -msgid "does not match confirmation" -msgstr "" - -## From Ecto.Changeset.no_assoc_constraint/3 -msgid "is still associated with this entry" -msgstr "" - -msgid "are still associated with this entry" -msgstr "" - -## From Ecto.Changeset.validate_length/3 -msgid "should have %{count} item(s)" -msgid_plural "should have %{count} item(s)" -msgstr[0] "" -msgstr[1] "" - -msgid "should be %{count} character(s)" -msgid_plural "should be %{count} character(s)" -msgstr[0] "" -msgstr[1] "" - -msgid "should be %{count} byte(s)" -msgid_plural "should be %{count} byte(s)" -msgstr[0] "" -msgstr[1] "" - -msgid "should have at least %{count} item(s)" -msgid_plural "should have at least %{count} item(s)" -msgstr[0] "" -msgstr[1] "" - -msgid "should be at least %{count} character(s)" -msgid_plural "should be at least %{count} character(s)" -msgstr[0] "" -msgstr[1] "" - -msgid "should be at least %{count} byte(s)" -msgid_plural "should be at least %{count} byte(s)" -msgstr[0] "" -msgstr[1] "" - -msgid "should have at most %{count} item(s)" -msgid_plural "should have at most %{count} item(s)" -msgstr[0] "" -msgstr[1] "" - -msgid "should be at most %{count} character(s)" -msgid_plural "should be at most %{count} character(s)" -msgstr[0] "" -msgstr[1] "" - -msgid "should be at most %{count} byte(s)" -msgid_plural "should be at most %{count} byte(s)" -msgstr[0] "" -msgstr[1] "" - -## From Ecto.Changeset.validate_number/3 -msgid "must be less than %{number}" -msgstr "" - -msgid "must be greater than %{number}" -msgstr "" - -msgid "must be less than or equal to %{number}" -msgstr "" - -msgid "must be greater than or equal to %{number}" -msgstr "" - -msgid "must be equal to %{number}" -msgstr "" - -msgid "is not a valid email" -msgstr "ist keine gültige E-Mail-Adresse" - -msgid "cannot be in the future" -msgstr "darf nicht in der Zukunft liegen" - -msgid "must be present" -msgstr "muss ausgefüllt sein" - -msgid "is not a valid phone number" -msgstr "ist keine gültige Telefonnummer" - -msgid "length must be greater than or equal to 5" -msgstr "Die Länge muss mindestens 5 Zeichen betragen" - -msgid "cannot be before join date" -msgstr "darf nicht vor dem Eintrittsdatum liegen" - -msgid "must consist of 5 digits" -msgstr "muss aus 5 Ziffern bestehen" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot deleted file mode 100644 index f5b79d7..0000000 --- a/priv/gettext/default.pot +++ /dev/null @@ -1,245 +0,0 @@ -## This file is a PO Template file. -## -## "msgid"s here are often extracted from source code. -## Add new messages manually only if they're dynamic -## messages that can't be statically extracted. -## -## Run "mix gettext.extract" to bring this file up to -## date. Leave "msgstr"s empty as changing them here has no -## effect: edit them in PO (.po) files instead. -# -msgid "" -msgstr "" - -#: lib/mv_web/components/core_components.ex:482 -#, elixir-autogen, elixir-format -msgid "Actions" -msgstr "" - -#: lib/mv_web/member_live/index.ex:39 -#, elixir-autogen, elixir-format -msgid "Are you sure?" -msgstr "" - -#: lib/mv_web/components/core_components.ex:160 -#, elixir-autogen, elixir-format -msgid "Attempting to reconnect" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:48 -#: lib/mv_web/member_live/index.ex:25 -#: lib/mv_web/member_live/show.ex:30 -#, elixir-autogen, elixir-format -msgid "City" -msgstr "" - -#: lib/mv_web/member_live/index.ex:41 -#, elixir-autogen, elixir-format -msgid "Delete" -msgstr "" - -#: lib/mv_web/member_live/index.ex:33 -#, elixir-autogen, elixir-format -msgid "Edit" -msgstr "" - -#: lib/mv_web/member_live/index.ex:76 -#: lib/mv_web/member_live/show.ex:91 -#, elixir-autogen, elixir-format -msgid "Edit Member" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:41 -#: lib/mv_web/member_live/index.ex:24 -#: lib/mv_web/member_live/show.ex:23 -#, elixir-autogen, elixir-format -msgid "Email" -msgstr "" - -#: lib/mv_web/components/core_components.ex:151 -#, elixir-autogen, elixir-format -msgid "Error!" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:39 -#: lib/mv_web/member_live/index.ex:22 -#: lib/mv_web/member_live/show.ex:21 -#, elixir-autogen, elixir-format -msgid "First Name" -msgstr "" - -#: lib/mv_web/components/core_components.ex:172 -#, elixir-autogen, elixir-format -msgid "Hang in there while we get back on track" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:45 -#: lib/mv_web/member_live/index.ex:26 -#: lib/mv_web/member_live/show.ex:27 -#, elixir-autogen, elixir-format -msgid "Join Date" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:40 -#: lib/mv_web/member_live/index.ex:23 -#: lib/mv_web/member_live/show.ex:22 -#, elixir-autogen, elixir-format -msgid "Last Name" -msgstr "" - -#: lib/mv_web/member_live/index.ex:8 -#: lib/mv_web/member_live/index.ex:88 -#, elixir-autogen, elixir-format -msgid "Listing Members" -msgstr "" - -#: lib/mv_web/member_live/index.ex:11 -#: lib/mv_web/member_live/index.ex:82 -#, elixir-autogen, elixir-format -msgid "New Member" -msgstr "" - -#: lib/mv_web/member_live/index.ex:30 -#, elixir-autogen, elixir-format -msgid "Show" -msgstr "" - -#: lib/mv_web/components/core_components.ex:167 -#, elixir-autogen, elixir-format -msgid "Something went wrong!" -msgstr "" - -#: lib/mv_web/components/core_components.ex:150 -#, elixir-autogen, elixir-format -msgid "Success!" -msgstr "" - -#: lib/mv_web/components/core_components.ex:155 -#, elixir-autogen, elixir-format -msgid "We can't find the internet" -msgstr "" - -#: lib/mv_web/components/core_components.ex:76 -#: lib/mv_web/components/core_components.ex:130 -#, elixir-autogen, elixir-format -msgid "close" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:42 -#: lib/mv_web/member_live/show.ex:24 -#, elixir-autogen, elixir-format -msgid "Birth Date" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:53 -#: lib/mv_web/member_live/show.ex:36 -#, elixir-autogen, elixir-format -msgid "Custom Properties" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:46 -#: lib/mv_web/member_live/show.ex:28 -#, elixir-autogen, elixir-format -msgid "Exit Date" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:50 -#: lib/mv_web/member_live/show.ex:32 -#, elixir-autogen, elixir-format -msgid "House Number" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:47 -#: lib/mv_web/member_live/show.ex:29 -#, elixir-autogen, elixir-format -msgid "Notes" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:43 -#: lib/mv_web/member_live/show.ex:25 -#, elixir-autogen, elixir-format -msgid "Paid" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:44 -#: lib/mv_web/member_live/show.ex:26 -#, elixir-autogen, elixir-format -msgid "Phone Number" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:51 -#: lib/mv_web/member_live/show.ex:33 -#, elixir-autogen, elixir-format -msgid "Postal Code" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:73 -#, elixir-autogen, elixir-format -msgid "Save Member" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:73 -#, elixir-autogen, elixir-format -msgid "Saving..." -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:49 -#: lib/mv_web/member_live/show.ex:31 -#, elixir-autogen, elixir-format -msgid "Street" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:29 -#, elixir-autogen, elixir-format -msgid "Use this form to manage member records and their properties." -msgstr "" - -#: lib/mv_web/member_live/show.ex:50 -#, elixir-autogen, elixir-format -msgid "Back to members" -msgstr "" - -#: lib/mv_web/member_live/show.ex:14 -#, elixir-autogen, elixir-format -msgid "Edit member" -msgstr "" - -#: lib/mv_web/member_live/show.ex:20 -#, elixir-autogen, elixir-format -msgid "Id" -msgstr "" - -#: lib/mv_web/member_live/show.ex:25 -#, elixir-autogen, elixir-format -msgid "No" -msgstr "" - -#: lib/mv_web/member_live/show.ex:90 -#, elixir-autogen, elixir-format -msgid "Show Member" -msgstr "" - -#: lib/mv_web/member_live/show.ex:10 -#, elixir-autogen, elixir-format -msgid "This is a member record from your database." -msgstr "" - -#: lib/mv_web/member_live/show.ex:25 -#, elixir-autogen, elixir-format -msgid "Yes" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:107 -#, elixir-autogen, elixir-format -msgid "Mitglied %{action} erfolgreich" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:100 -#, elixir-autogen, elixir-format -msgid "create" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:101 -#, elixir-autogen, elixir-format -msgid "update" -msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po deleted file mode 100644 index 6173d39..0000000 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ /dev/null @@ -1,245 +0,0 @@ -## "msgid"s in this file come from POT (.pot) files. -### -### Do not add, change, or remove "msgid"s manually here as -### they're tied to the ones in the corresponding POT file -### (with the same domain). -### -### Use "mix gettext.extract --merge" or "mix gettext.merge" -### to merge POT files into PO files. -msgid "" -msgstr "" -"Language: en\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: lib/mv_web/components/core_components.ex:482 -#, elixir-autogen, elixir-format -msgid "Actions" -msgstr "" - -#: lib/mv_web/member_live/index.ex:39 -#, elixir-autogen, elixir-format -msgid "Are you sure?" -msgstr "" - -#: lib/mv_web/components/core_components.ex:160 -#, elixir-autogen, elixir-format -msgid "Attempting to reconnect" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:48 -#: lib/mv_web/member_live/index.ex:25 -#: lib/mv_web/member_live/show.ex:30 -#, elixir-autogen, elixir-format -msgid "City" -msgstr "" - -#: lib/mv_web/member_live/index.ex:41 -#, elixir-autogen, elixir-format -msgid "Delete" -msgstr "" - -#: lib/mv_web/member_live/index.ex:33 -#, elixir-autogen, elixir-format -msgid "Edit" -msgstr "" - -#: lib/mv_web/member_live/index.ex:76 -#: lib/mv_web/member_live/show.ex:91 -#, elixir-autogen, elixir-format -msgid "Edit Member" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:41 -#: lib/mv_web/member_live/index.ex:24 -#: lib/mv_web/member_live/show.ex:23 -#, elixir-autogen, elixir-format -msgid "Email" -msgstr "" - -#: lib/mv_web/components/core_components.ex:151 -#, elixir-autogen, elixir-format -msgid "Error!" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:39 -#: lib/mv_web/member_live/index.ex:22 -#: lib/mv_web/member_live/show.ex:21 -#, elixir-autogen, elixir-format -msgid "First Name" -msgstr "" - -#: lib/mv_web/components/core_components.ex:172 -#, elixir-autogen, elixir-format -msgid "Hang in there while we get back on track" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:45 -#: lib/mv_web/member_live/index.ex:26 -#: lib/mv_web/member_live/show.ex:27 -#, elixir-autogen, elixir-format -msgid "Join Date" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:40 -#: lib/mv_web/member_live/index.ex:23 -#: lib/mv_web/member_live/show.ex:22 -#, elixir-autogen, elixir-format -msgid "Last Name" -msgstr "" - -#: lib/mv_web/member_live/index.ex:8 -#: lib/mv_web/member_live/index.ex:88 -#, elixir-autogen, elixir-format -msgid "Listing Members" -msgstr "" - -#: lib/mv_web/member_live/index.ex:11 -#: lib/mv_web/member_live/index.ex:82 -#, elixir-autogen, elixir-format -msgid "New Member" -msgstr "" - -#: lib/mv_web/member_live/index.ex:30 -#, elixir-autogen, elixir-format -msgid "Show" -msgstr "" - -#: lib/mv_web/components/core_components.ex:167 -#, elixir-autogen, elixir-format -msgid "Something went wrong!" -msgstr "" - -#: lib/mv_web/components/core_components.ex:150 -#, elixir-autogen, elixir-format -msgid "Success!" -msgstr "" - -#: lib/mv_web/components/core_components.ex:155 -#, elixir-autogen, elixir-format -msgid "We can't find the internet" -msgstr "" - -#: lib/mv_web/components/core_components.ex:76 -#: lib/mv_web/components/core_components.ex:130 -#, elixir-autogen, elixir-format -msgid "close" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:42 -#: lib/mv_web/member_live/show.ex:24 -#, elixir-autogen, elixir-format -msgid "Birth Date" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:53 -#: lib/mv_web/member_live/show.ex:36 -#, elixir-autogen, elixir-format -msgid "Custom Properties" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:46 -#: lib/mv_web/member_live/show.ex:28 -#, elixir-autogen, elixir-format -msgid "Exit Date" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:50 -#: lib/mv_web/member_live/show.ex:32 -#, elixir-autogen, elixir-format -msgid "House Number" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:47 -#: lib/mv_web/member_live/show.ex:29 -#, elixir-autogen, elixir-format -msgid "Notes" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:43 -#: lib/mv_web/member_live/show.ex:25 -#, elixir-autogen, elixir-format -msgid "Paid" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:44 -#: lib/mv_web/member_live/show.ex:26 -#, elixir-autogen, elixir-format -msgid "Phone Number" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:51 -#: lib/mv_web/member_live/show.ex:33 -#, elixir-autogen, elixir-format -msgid "Postal Code" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:73 -#, elixir-autogen, elixir-format, fuzzy -msgid "Save Member" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:73 -#, elixir-autogen, elixir-format -msgid "Saving..." -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:49 -#: lib/mv_web/member_live/show.ex:31 -#, elixir-autogen, elixir-format -msgid "Street" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:29 -#, elixir-autogen, elixir-format -msgid "Use this form to manage member records and their properties." -msgstr "" - -#: lib/mv_web/member_live/show.ex:50 -#, elixir-autogen, elixir-format -msgid "Back to members" -msgstr "" - -#: lib/mv_web/member_live/show.ex:14 -#, elixir-autogen, elixir-format, fuzzy -msgid "Edit member" -msgstr "" - -#: lib/mv_web/member_live/show.ex:20 -#, elixir-autogen, elixir-format -msgid "Id" -msgstr "" - -#: lib/mv_web/member_live/show.ex:25 -#, elixir-autogen, elixir-format -msgid "No" -msgstr "" - -#: lib/mv_web/member_live/show.ex:90 -#, elixir-autogen, elixir-format, fuzzy -msgid "Show Member" -msgstr "" - -#: lib/mv_web/member_live/show.ex:10 -#, elixir-autogen, elixir-format -msgid "This is a member record from your database." -msgstr "" - -#: lib/mv_web/member_live/show.ex:25 -#, elixir-autogen, elixir-format -msgid "Yes" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:107 -#, elixir-autogen, elixir-format -msgid "Member %{action} successfully" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:100 -#, elixir-autogen, elixir-format -msgid "create" -msgstr "" - -#: lib/mv_web/member_live/form_component.ex:101 -#, elixir-autogen, elixir-format -msgid "update" -msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/errors.po b/priv/gettext/en/LC_MESSAGES/errors.po index 60c1037..844c4f5 100644 --- a/priv/gettext/en/LC_MESSAGES/errors.po +++ b/priv/gettext/en/LC_MESSAGES/errors.po @@ -110,12 +110,3 @@ msgstr "" msgid "must be equal to %{number}" msgstr "" - -msgid "length must be greater than or equal to 5" -msgstr "length must be greater than or equal to 5" - -msgid "cannot be before join date" -msgstr "cannot be before join date" - -msgid "must consist of 5 digits" -msgstr "must consist of 5 digits" diff --git a/priv/repo/migrations/20250617090641_member_fields.exs b/priv/repo/migrations/20250617090641_member_fields.exs deleted file mode 100644 index 36a80eb..0000000 --- a/priv/repo/migrations/20250617090641_member_fields.exs +++ /dev/null @@ -1,45 +0,0 @@ -defmodule Mv.Repo.Migrations.MemberFields do - @moduledoc """ - Updates resources based on their most recent snapshots. - - This file was autogenerated with `mix ash_postgres.generate_migrations` - """ - - use Ecto.Migration - - def up do - alter table(:members) do - add :first_name, :text, null: false - add :last_name, :text, null: false - add :email, :text, null: false - add :birth_date, :date - add :paid, :boolean - add :phone_number, :text - add :join_date, :date - add :exit_date, :date - add :notes, :text - add :city, :text - add :street, :text - add :house_number, :text - add :postal_code, :text - end - end - - def down do - alter table(:members) do - remove :postal_code - remove :house_number - remove :street - remove :city - remove :notes - remove :exit_date - remove :join_date - remove :phone_number - remove :paid - remove :birth_date - remove :email - remove :last_name - remove :first_name - end - end -end diff --git a/priv/repo/migrations/20250617132424_member_delete.exs b/priv/repo/migrations/20250617132424_member_delete.exs deleted file mode 100644 index f0f539a..0000000 --- a/priv/repo/migrations/20250617132424_member_delete.exs +++ /dev/null @@ -1,38 +0,0 @@ -defmodule Mv.Repo.Migrations.MemberDelete do - @moduledoc """ - Updates resources based on their most recent snapshots. - - This file was autogenerated with `mix ash_postgres.generate_migrations` - """ - - use Ecto.Migration - - def up do - drop constraint(:properties, "properties_member_id_fkey") - - alter table(:properties) do - modify :member_id, - references(:members, - column: :id, - name: "properties_member_id_fkey", - type: :uuid, - prefix: "public", - on_delete: :delete_all - ) - end - end - - def down do - drop constraint(:properties, "properties_member_id_fkey") - - alter table(:properties) do - modify :member_id, - references(:members, - column: :id, - name: "properties_member_id_fkey", - type: :uuid, - prefix: "public" - ) - end - end -end diff --git a/priv/repo/seeds.exs b/priv/repo/seeds.exs index 1497096..39327d0 100644 --- a/priv/repo/seeds.exs +++ b/priv/repo/seeds.exs @@ -7,30 +7,37 @@ alias Mv.Membership for attrs <- [ %{ - name: "String Field", + name: "Vorname", value_type: :string, - description: "Example for a field of type string", + description: "Vorname des Mitglieds", immutable: true, required: true }, %{ - name: "Date Field", + name: "Nachname", + value_type: :string, + description: "Nachname des Mitglieds", + immutable: true, + required: true + }, + %{ + name: "Geburtsdatum", value_type: :date, - description: "Example for a field of type date", + description: "Geburtsdatum des Mitglieds", immutable: true, required: true }, %{ - name: "Boolean Field", + name: "Bezahlt", value_type: :boolean, - description: "Example for a field of type boolean", + description: "Status des Mitgliedsbeitrages des Mitglieds", immutable: true, required: true }, %{ - name: "Email Field", + name: "Email", value_type: :email, - description: "Example for a field of type email", + description: "Email-Adresse des Mitglieds", immutable: true, required: true } diff --git a/priv/resource_snapshots/repo/members/20250617090641.json b/priv/resource_snapshots/repo/members/20250617090641.json deleted file mode 100644 index 9e2d991..0000000 --- a/priv/resource_snapshots/repo/members/20250617090641.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - "attributes": [ - { - "allow_nil?": false, - "default": "fragment(\"uuid_generate_v7()\")", - "generated?": false, - "precision": null, - "primary_key?": true, - "references": null, - "scale": null, - "size": null, - "source": "id", - "type": "uuid" - }, - { - "allow_nil?": false, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": null, - "scale": null, - "size": null, - "source": "first_name", - "type": "text" - }, - { - "allow_nil?": false, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": null, - "scale": null, - "size": null, - "source": "last_name", - "type": "text" - }, - { - "allow_nil?": false, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": null, - "scale": null, - "size": null, - "source": "email", - "type": "text" - }, - { - "allow_nil?": true, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": null, - "scale": null, - "size": null, - "source": "birth_date", - "type": "date" - }, - { - "allow_nil?": true, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": null, - "scale": null, - "size": null, - "source": "paid", - "type": "boolean" - }, - { - "allow_nil?": true, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": null, - "scale": null, - "size": null, - "source": "phone_number", - "type": "text" - }, - { - "allow_nil?": true, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": null, - "scale": null, - "size": null, - "source": "join_date", - "type": "date" - }, - { - "allow_nil?": true, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": null, - "scale": null, - "size": null, - "source": "exit_date", - "type": "date" - }, - { - "allow_nil?": true, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": null, - "scale": null, - "size": null, - "source": "notes", - "type": "text" - }, - { - "allow_nil?": true, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": null, - "scale": null, - "size": null, - "source": "city", - "type": "text" - }, - { - "allow_nil?": true, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": null, - "scale": null, - "size": null, - "source": "street", - "type": "text" - }, - { - "allow_nil?": true, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": null, - "scale": null, - "size": null, - "source": "house_number", - "type": "text" - }, - { - "allow_nil?": true, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": null, - "scale": null, - "size": null, - "source": "postal_code", - "type": "text" - } - ], - "base_filter": null, - "check_constraints": [], - "custom_indexes": [], - "custom_statements": [], - "has_create_action": true, - "hash": "CF80317E7EE409618E08458B10EE122FF605640DDA8CD6000B433F1979614F5D", - "identities": [], - "multitenancy": { - "attribute": null, - "global": null, - "strategy": null - }, - "repo": "Elixir.Mv.Repo", - "schema": null, - "table": "members" -} \ No newline at end of file diff --git a/priv/resource_snapshots/repo/properties/20250617132424.json b/priv/resource_snapshots/repo/properties/20250617132424.json deleted file mode 100644 index 49e3b48..0000000 --- a/priv/resource_snapshots/repo/properties/20250617132424.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "attributes": [ - { - "allow_nil?": false, - "default": "fragment(\"gen_random_uuid()\")", - "generated?": false, - "precision": null, - "primary_key?": true, - "references": null, - "scale": null, - "size": null, - "source": "id", - "type": "uuid" - }, - { - "allow_nil?": true, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": null, - "scale": null, - "size": null, - "source": "value", - "type": "map" - }, - { - "allow_nil?": true, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": { - "deferrable": false, - "destination_attribute": "id", - "destination_attribute_default": null, - "destination_attribute_generated": null, - "index?": false, - "match_type": null, - "match_with": null, - "multitenancy": { - "attribute": null, - "global": null, - "strategy": null - }, - "name": "properties_member_id_fkey", - "on_delete": "delete", - "on_update": null, - "primary_key?": true, - "schema": "public", - "table": "members" - }, - "scale": null, - "size": null, - "source": "member_id", - "type": "uuid" - }, - { - "allow_nil?": true, - "default": "nil", - "generated?": false, - "precision": null, - "primary_key?": false, - "references": { - "deferrable": false, - "destination_attribute": "id", - "destination_attribute_default": null, - "destination_attribute_generated": null, - "index?": false, - "match_type": null, - "match_with": null, - "multitenancy": { - "attribute": null, - "global": null, - "strategy": null - }, - "name": "properties_property_type_id_fkey", - "on_delete": null, - "on_update": null, - "primary_key?": true, - "schema": "public", - "table": "property_types" - }, - "scale": null, - "size": null, - "source": "property_type_id", - "type": "uuid" - } - ], - "base_filter": null, - "check_constraints": [], - "custom_indexes": [], - "custom_statements": [], - "has_create_action": true, - "hash": "4F17BE0106435A1D75D46A3ABDE6A3DA20FC9B1C43D101B6C310009279DD7CBA", - "identities": [], - "multitenancy": { - "attribute": null, - "global": null, - "strategy": null - }, - "repo": "Elixir.Mv.Repo", - "schema": null, - "table": "properties" -} \ No newline at end of file diff --git a/test/membership/member_test.exs b/test/membership/member_test.exs deleted file mode 100644 index 7015d34..0000000 --- a/test/membership/member_test.exs +++ /dev/null @@ -1,110 +0,0 @@ -defmodule Mv.Membership.MemberTest do - use Mv.DataCase, async: false - alias Mv.Membership - - describe "Fields and Validations" do - @valid_attrs %{ - first_name: "John", - last_name: "Doe", - birth_date: ~D[1990-01-01], - paid: true, - email: "john@example.com", - phone_number: "+49123456789", - join_date: ~D[2020-01-01], - exit_date: nil, - notes: "Test note", - city: "Berlin", - street: "Main Street", - house_number: "1A", - postal_code: "12345" - } - - test "First name is required and must not be empty" do - attrs = Map.put(@valid_attrs, :first_name, "") - assert {:error, %Ash.Error.Invalid{errors: errors}} = Membership.create_member(attrs) - assert error_message(errors, :first_name) =~ "must be present" - end - - test "Last name is required and must not be empty" do - attrs = Map.put(@valid_attrs, :last_name, "") - assert {:error, %Ash.Error.Invalid{errors: errors}} = Membership.create_member(attrs) - assert error_message(errors, :last_name) =~ "must be present" - end - - test "Email is required" do - attrs = Map.put(@valid_attrs, :email, "") - assert {:error, %Ash.Error.Invalid{errors: errors}} = Membership.create_member(attrs) - assert error_message(errors, :email) =~ "must be present" - end - - test "Email must be valid" do - attrs = Map.put(@valid_attrs, :email, "test@") - assert {:error, %Ash.Error.Invalid{errors: errors}} = Membership.create_member(attrs) - assert error_message(errors, :email) =~ "is not a valid email" - end - - test "Birth date is optional but must not be in the future" do - attrs = Map.put(@valid_attrs, :birth_date, Date.utc_today() |> Date.add(1)) - assert {:error, %Ash.Error.Invalid{errors: errors}} = Membership.create_member(attrs) - assert error_message(errors, :birth_date) =~ "cannot be in the future" - end - - test "Paid is optional but must be boolean if specified" do - attrs = Map.put(@valid_attrs, :paid, nil) - attrs2 = Map.put(@valid_attrs, :paid, "yes") - assert {:ok, _member} = Membership.create_member(Map.delete(attrs, :paid)) - assert {:error, %Ash.Error.Invalid{errors: errors}} = Membership.create_member(attrs2) - assert error_message(errors, :paid) =~ "is invalid" - end - - test "Phone number is optional but must have a valid format if specified" do - attrs = Map.put(@valid_attrs, :phone_number, "abc") - assert {:error, %Ash.Error.Invalid{errors: errors}} = Membership.create_member(attrs) - assert error_message(errors, :phone_number) =~ "is not a valid phone number" - attrs2 = Map.delete(@valid_attrs, :phone_number) - assert {:ok, _member} = Membership.create_member(attrs2) - end - - test "Join date is optional but must not be in the future" do - attrs = Map.put(@valid_attrs, :join_date, Date.utc_today() |> Date.add(1)) - assert {:error, %Ash.Error.Invalid{errors: errors}} = Membership.create_member(attrs) - assert error_message(errors, :join_date) =~ "cannot be in the future" - attrs2 = Map.delete(@valid_attrs, :join_date) - assert {:ok, _member} = Membership.create_member(attrs2) - end - - test "Exit date is optional but must not be before join date if both are specified" do - attrs = Map.put(@valid_attrs, :exit_date, ~D[2010-01-01]) - assert {:error, %Ash.Error.Invalid{errors: errors}} = Membership.create_member(attrs) - assert error_message(errors, :exit_date) =~ "cannot be before join date" - attrs2 = Map.delete(@valid_attrs, :exit_date) - assert {:ok, _member} = Membership.create_member(attrs2) - end - - test "Notes is optional" do - attrs = Map.delete(@valid_attrs, :notes) - assert {:ok, _member} = Membership.create_member(attrs) - end - - test "City, street, house number are optional" do - attrs = @valid_attrs |> Map.drop([:city, :street, :house_number]) - assert {:ok, _member} = Membership.create_member(attrs) - end - - test "Postal code is optional but must have 5 digits if specified" do - attrs = Map.put(@valid_attrs, :postal_code, "1234") - assert {:error, %Ash.Error.Invalid{errors: errors}} = Membership.create_member(attrs) - assert error_message(errors, :postal_code) =~ "must consist of 5 digits" - attrs2 = Map.delete(@valid_attrs, :postal_code) - assert {:ok, _member} = Membership.create_member(attrs2) - end - end - - # Helper function for error evaluation - defp error_message(errors, field) do - errors - |> Enum.filter(fn err -> Map.get(err, :field) == field end) - |> Enum.map(&Map.get(&1, :message, "")) - |> List.first() - end -end diff --git a/test/mv_web/locale_test.exs b/test/mv_web/locale_test.exs deleted file mode 100644 index 1cc6693..0000000 --- a/test/mv_web/locale_test.exs +++ /dev/null @@ -1,14 +0,0 @@ -defmodule MvWeb.LocaleTest do - use MvWeb.ConnCase, async: true - import Phoenix.ConnTest - - test "language switch via form sets the locale to English in the session" do - conn = post(build_conn(), "/set_locale", %{"locale" => "en"}) - assert get_session(conn, :locale) == "en" - end - - test "language switch via form sets the locale to German in the session" do - conn = post(build_conn(), "/set_locale", %{"locale" => "de"}) - assert get_session(conn, :locale) == "de" - end -end diff --git a/test/mv_web/member_live/index_test.exs b/test/mv_web/member_live/index_test.exs deleted file mode 100644 index b5a5968..0000000 --- a/test/mv_web/member_live/index_test.exs +++ /dev/null @@ -1,60 +0,0 @@ -defmodule MvWeb.MemberLive.IndexTest do - use MvWeb.ConnCase, async: true - import Phoenix.LiveViewTest - - test "shows translated title in German", %{conn: conn} do - conn = Plug.Test.init_test_session(conn, locale: "de") - {:ok, _view, html} = live(conn, "/members") - # Expected German title - assert html =~ "Mitglieder" - end - - test "shows translated title in English", %{conn: conn} do - Gettext.put_locale(MvWeb.Gettext, "en") - {:ok, _view, html} = live(conn, "/members") - # Expected English title - assert html =~ "Members" - end - - test "shows translated button text in German", %{conn: conn} do - conn = Plug.Test.init_test_session(conn, locale: "de") - {:ok, _view, html} = live(conn, "/members/new") - assert html =~ "Speichern" - end - - test "shows translated button text in English", %{conn: conn} do - Gettext.put_locale(MvWeb.Gettext, "en") - {:ok, _view, html} = live(conn, "/members/new") - assert html =~ "Save" - end - - test "shows translated flash message after creating a member in German", %{conn: conn} do - conn = Plug.Test.init_test_session(conn, locale: "de") - {:ok, view, _html} = live(conn, "/members") - view |> element("a", "Neues Mitglied") |> render_click() - - form_data = %{ - "member[first_name]" => "Max", - "member[last_name]" => "Mustermann", - "member[email]" => "max@example.com" - } - - view |> form("#member-form", form_data) |> render_submit() - assert has_element?(view, "#flash-group", "Mitglied erstellt erfolgreich") - end - - test "shows translated flash message after creating a member in English", %{conn: conn} do - conn = Plug.Test.init_test_session(conn, locale: "en") - {:ok, view, _html} = live(conn, "/members") - view |> element("a", "New Member") |> render_click() - - form_data = %{ - "member[first_name]" => "Max", - "member[last_name]" => "Mustermann", - "member[email]" => "max@example.com" - } - - view |> form("#member-form", form_data) |> render_submit() - assert has_element?(view, "#flash-group", "Member create successfully") - end -end