diff --git a/lib/membership/property.ex b/lib/membership/property.ex index 433fc63..ed07ce2 100644 --- a/lib/membership/property.ex +++ b/lib/membership/property.ex @@ -16,8 +16,16 @@ defmodule Mv.Membership.Property do attributes do uuid_primary_key :id - attribute :value, :string, - description: "Speichert den Wert, Typ-Interpretation per property_type.typ" + attribute :value, :union, + constraints: [ + storage: :type_and_value, + types: [ + bool: [type: :boolean], + date: [type: :date], + int: [type: :integer], + string: [type: :string] + ] + ] end relationships do @@ -25,4 +33,8 @@ defmodule Mv.Membership.Property do belongs_to :property_type, Mv.Membership.PropertyType end + + calculations do + calculate :value_to_string, :string, expr(value[:value] <> "") + end end diff --git a/lib/mv_web/member_live/form_component.ex b/lib/mv_web/member_live/form_component.ex index b91d3c0..720e5c5 100644 --- a/lib/mv_web/member_live/form_component.ex +++ b/lib/mv_web/member_live/form_component.ex @@ -9,7 +9,11 @@ defmodule MvWeb.MemberLive.FormComponent do Enum.map(property_types, fn pt -> %{ "property_type_id" => pt.id, - "value" => nil + "value" => %{ + "type" => String.to_existing_atom(pt.type), + "value" => nil, + "_union_type" => pt.type + } } end) @@ -34,7 +38,9 @@ defmodule MvWeb.MemberLive.FormComponent do > <.inputs_for :let={f_property} field={@form[:properties]}> <% type = Enum.find(@property_types, &(&1.id == f_property[:property_type_id].value)) %> - <.input field={f_property[:value]} label={type && type.name} /> + <.inputs_for :let={value_form} field={f_property[:value]}> + <.input field={value_form[:value]} label={type && type.name} /> + + Enum.map(member.properties, fn prop -> + %{ + "property_type_id" => prop.property_type_id, + "value" => %{ + "_union_type" => Atom.to_string(prop.value.type), + "type" => prop.value.type, + "value" => prop.value.value + } + } + end) + } + form = AshPhoenix.Form.for_update( member, :update_member, api: Mv.Membership, as: "member", + params: params, forms: [auto?: true] ) diff --git a/priv/repo/migrations/20250514151922_initial_migration.exs b/priv/repo/migrations/20250521234537_initial_migration.exs similarity index 98% rename from priv/repo/migrations/20250514151922_initial_migration.exs rename to priv/repo/migrations/20250521234537_initial_migration.exs index 64915c2..ddf8abe 100644 --- a/priv/repo/migrations/20250514151922_initial_migration.exs +++ b/priv/repo/migrations/20250521234537_initial_migration.exs @@ -21,7 +21,7 @@ defmodule Mv.Repo.Migrations.InitialMigration do create table(:properties, primary_key: false) do add :id, :uuid, null: false, default: fragment("gen_random_uuid()"), primary_key: true - add :value, :text + add :value, :map add :member_id, :uuid add :property_type_id, :uuid end diff --git a/priv/resource_snapshots/repo/members/20250514151922.json b/priv/resource_snapshots/repo/members/20250521234537.json similarity index 100% rename from priv/resource_snapshots/repo/members/20250514151922.json rename to priv/resource_snapshots/repo/members/20250521234537.json diff --git a/priv/resource_snapshots/repo/properties/20250514151922.json b/priv/resource_snapshots/repo/properties/20250521234537.json similarity index 95% rename from priv/resource_snapshots/repo/properties/20250514151922.json rename to priv/resource_snapshots/repo/properties/20250521234537.json index 0707bcf..1fbee03 100644 --- a/priv/resource_snapshots/repo/properties/20250514151922.json +++ b/priv/resource_snapshots/repo/properties/20250521234537.json @@ -18,7 +18,7 @@ "references": null, "size": null, "source": "value", - "type": "text" + "type": "map" }, { "allow_nil?": true, @@ -84,7 +84,7 @@ "custom_indexes": [], "custom_statements": [], "has_create_action": true, - "hash": "F2A42A3427E0428637F465E4F357A3BE21B33231F94CF77B4843084128F6BDA5", + "hash": "4D127B8DA5051633CE92D4C94B1C3D76FCBD2EE992EF8318B977E5C2B8CF19E4", "identities": [], "multitenancy": { "attribute": null, diff --git a/priv/resource_snapshots/repo/property_types/20250514151922.json b/priv/resource_snapshots/repo/property_types/20250521234537.json similarity index 100% rename from priv/resource_snapshots/repo/property_types/20250514151922.json rename to priv/resource_snapshots/repo/property_types/20250521234537.json