diff --git a/Justfile b/Justfile
index 26db3bc..572f109 100644
--- a/Justfile
+++ b/Justfile
@@ -11,7 +11,6 @@ migrate-database:
reset-database:
mix ash.reset
- MIX_ENV=test mix ash.reset
seed-database:
mix run priv/repo/seeds.exs
@@ -21,10 +20,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/accounts/user.ex b/lib/accounts/user.ex
index 8d2946c..7f34bcb 100644
--- a/lib/accounts/user.ex
+++ b/lib/accounts/user.ex
@@ -24,8 +24,7 @@ defmodule Mv.Accounts.User do
token_resource Mv.Accounts.Token
require_token_presence_for_authentication? true
store_all_tokens? true
-
- # signing_algorithm "EdDSA" -> https://git.local-it.org/local-it/mitgliederverwaltung/issues/87
+ #signing_algorithm "EdDSA" -> https://git.local-it.org/local-it/mitgliederverwaltung/issues/87
signing_secret fn _, _ ->
{:ok, Application.get_env(:mv, :token_signing_secret)}
@@ -40,8 +39,7 @@ defmodule Mv.Accounts.User do
client_secret Mv.Secrets
auth_method :client_secret_jwt
code_verifier true
-
- # id_token_signed_response_alg "EdDSA" #-> https://git.local-it.org/local-it/mitgliederverwaltung/issues/87
+ #id_token_signed_response_alg "EdDSA" #-> https://git.local-it.org/local-it/mitgliederverwaltung/issues/87
end
password :password do
diff --git a/lib/membership/member.ex b/lib/membership/member.ex
index 583f173..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,134 +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/secrets.ex b/lib/mv/secrets.ex
index 6a88eee..2e397d2 100644
--- a/lib/mv/secrets.ex
+++ b/lib/mv/secrets.ex
@@ -1,39 +1,19 @@
defmodule Mv.Secrets do
use AshAuthentication.Secret
- def secret_for(
- [:authentication, :strategies, :rauthy, :client_id],
- Mv.Accounts.User,
- _opts,
- _meth
- ) do
+ def secret_for([:authentication, :strategies, :rauthy, :client_id], Mv.Accounts.User, _opts, _meth) do
get_config(:client_id)
end
- def secret_for(
- [:authentication, :strategies, :rauthy, :redirect_uri],
- Mv.Accounts.User,
- _opts,
- _meth
- ) do
+ def secret_for([:authentication, :strategies, :rauthy, :redirect_uri], Mv.Accounts.User, _opts, _meth) do
get_config(:redirect_uri)
end
- def secret_for(
- [:authentication, :strategies, :rauthy, :client_secret],
- Mv.Accounts.User,
- _opts,
- _meth
- ) do
+ def secret_for([:authentication, :strategies, :rauthy, :client_secret], Mv.Accounts.User, _opts, _meth) do
get_config(:client_secret)
end
- def secret_for(
- [:authentication, :strategies, :rauthy, :base_url],
- Mv.Accounts.User,
- _opts,
- _meth
- ) do
+ def secret_for([:authentication, :strategies, :rauthy, :base_url], Mv.Accounts.User, _opts, _meth) do
get_config(:base_url)
end
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"""
-
-
@elixirphoenix
diff --git a/lib/mv_web/controllers/auth_controller.ex b/lib/mv_web/controllers/auth_controller.ex
index e6bcb82..2861d73 100644
--- a/lib/mv_web/controllers/auth_controller.ex
+++ b/lib/mv_web/controllers/auth_controller.ex
@@ -1,5 +1,4 @@
require Logger
-
defmodule MvWeb.AuthController do
use MvWeb, :controller
use AshAuthentication.Phoenix.Controller
@@ -25,7 +24,6 @@ defmodule MvWeb.AuthController do
def failure(conn, activity, reason) do
Logger.error(%{conn: conn, reason: reason})
-
message =
case {activity, reason} do
{_,
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 cdc517b..1739da0 100644
--- a/lib/mv_web/router.ex
+++ b/lib/mv_web/router.ex
@@ -13,7 +13,6 @@ defmodule MvWeb.Router do
plug :protect_from_forgery
plug :put_secure_browser_headers
plug :load_from_session
- plug :set_locale
end
pipeline :api do
@@ -66,8 +65,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
# ASHAUTHENTICATION GENERATED AUTH ROUTES
@@ -128,10 +125,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 c16e11b..8feab5a 100644
--- a/mix.exs
+++ b/mix.exs
@@ -72,8 +72,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 51b4604..7cf5a9e 100644
--- a/mix.lock
+++ b/mix.lock
@@ -18,12 +18,10 @@
"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"},
"elixir_make": {:hex, :elixir_make, "0.9.0", "6484b3cd8c0cee58f09f05ecaf1a140a8c97670671a6a0e7ab4dc326c3109726", [:mix], [], "hexpm", "db23d4fd8b757462ad02f8aa73431a426fe6671c80b200d9710caf3d1dd0ffdb"},
"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"},
@@ -40,7 +38,6 @@
"jose": {:hex, :jose, "1.11.10", "a903f5227417bd2a08c8a00a0cbcc458118be84480955e8d251297a425723f83", [:mix, :rebar3], [], "hexpm", "0d6cd36ff8ba174db29148fc112b5842186b68a90ce9fc2b3ec3afe76593e614"},
"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"},
@@ -71,7 +68,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