feat: property value as Union type
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Moritz 2025-05-22 01:58:39 +02:00
parent c91f65d04c
commit d085d80f74
Signed by: moritz
GPG key ID: 1020A035E5DD0824
6 changed files with 40 additions and 7 deletions

View file

@ -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

View file

@ -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} />
</.inputs_for>
<input
type="hidden"
name={f_property[:property_type_id].name}
@ -95,12 +101,27 @@ defmodule MvWeb.MemberLive.FormComponent do
not Enum.member?(existing_properties, Map.get(i, "property_type_id"))
end
params = %{
"properties" =>
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]
)