Compare commits

..

2 commits

Author SHA1 Message Date
83d6b1173d
choose input filed type by value_type
All checks were successful
continuous-integration/drone/push Build is passing
2025-05-28 19:02:42 +02:00
8d859275ba
property value as Union type 2025-05-28 18:43:18 +02:00
10 changed files with 60 additions and 33 deletions

View file

@ -33,3 +33,21 @@ test:
format: format:
mix format mix format
regen-migrations migration_name:
#!/bin/bash
set -euo pipefail
# Get count of untracked migrations
N_MIGRATIONS=$(git ls-files --others priv/repo/migrations | wc -l)
# Rollback untracked migrations
mix ash_postgres.rollback -n $N_MIGRATIONS
# Delete untracked migrations and snapshots
git ls-files --others priv/repo/migrations | xargs rm
git ls-files --others priv/resource_snapshots | xargs rm
# Regenerate migrations
mix ash.codegen --name {{migration_name}}
# Run migrations if flag
if echo $* | grep -e "-m" -q; then
mix ash.migrate
fi

View file

@ -20,9 +20,9 @@ defmodule Mv.Membership.Property do
constraints: [ constraints: [
storage: :type_and_value, storage: :type_and_value,
types: [ types: [
bool: [type: :boolean], boolean: [type: :boolean],
date: [type: :date], date: [type: :date],
int: [type: :integer], integer: [type: :integer],
string: [type: :string] string: [type: :string]
] ]
] ]

View file

@ -10,7 +10,7 @@ defmodule Mv.Membership.PropertyType do
actions do actions do
defaults [:create, :read, :update, :destroy] defaults [:create, :read, :update, :destroy]
default_accept [:name, :type, :description, :immutable, :required] default_accept [:name, :value_type, :description, :immutable, :required]
end end
attributes do attributes do
@ -18,7 +18,8 @@ defmodule Mv.Membership.PropertyType do
attribute :name, :string, allow_nil?: false, public?: true attribute :name, :string, allow_nil?: false, public?: true
attribute :type, :string, attribute :value_type, :atom,
constraints: [one_of: [:string, :integer, :boolean, :date]],
allow_nil?: false, allow_nil?: false,
description: "Definies the datatype `Property.value` is interpreted as" description: "Definies the datatype `Property.value` is interpreted as"

View file

@ -10,9 +10,9 @@ defmodule MvWeb.MemberLive.FormComponent do
%{ %{
"property_type_id" => pt.id, "property_type_id" => pt.id,
"value" => %{ "value" => %{
"type" => String.to_existing_atom(pt.type), "type" => pt.value_type,
"value" => nil, "value" => nil,
"_union_type" => pt.type "_union_type" => Atom.to_string(pt.value_type)
} }
} }
end) end)
@ -39,7 +39,13 @@ defmodule MvWeb.MemberLive.FormComponent do
<.inputs_for :let={f_property} field={@form[:properties]}> <.inputs_for :let={f_property} field={@form[:properties]}>
<% type = Enum.find(@property_types, &(&1.id == f_property[:property_type_id].value)) %> <% type = Enum.find(@property_types, &(&1.id == f_property[:property_type_id].value)) %>
<.inputs_for :let={value_form} field={f_property[:value]}> <.inputs_for :let={value_form} field={f_property[:value]}>
<.input field={value_form[:value]} label={type && type.name} /> <% input_type =
cond do
type && type.value_type == :boolean -> "checkbox"
type && type.value_type == :date -> :date
true -> :text
end %>
<.input field={value_form[:value]} label={type && type.name} type={input_type} />
</.inputs_for> </.inputs_for>
<input <input
type="hidden" type="hidden"

View file

@ -11,7 +11,7 @@ defmodule Mv.Repo.Migrations.InitialMigration do
create table(:property_types, primary_key: false) do create table(:property_types, primary_key: false) do
add :id, :uuid, null: false, default: fragment("gen_random_uuid()"), primary_key: true add :id, :uuid, null: false, default: fragment("gen_random_uuid()"), primary_key: true
add :name, :text, null: false add :name, :text, null: false
add :type, :text, null: false add :value_type, :text, null: false
add :description, :text add :description, :text
add :immutable, :boolean, null: false, default: false add :immutable, :boolean, null: false, default: false
add :required, :boolean, null: false, default: false add :required, :boolean, null: false, default: false

View file

@ -15,14 +15,35 @@ alias Mv.Membership
for attrs <- [ for attrs <- [
%{ %{
name: "Vorname", name: "Vorname",
type: "string", value_type: :string,
description: "Vorname des Mitglieds", description: "Vorname des Mitglieds",
immutable: true, immutable: true,
required: true required: true
}, },
%{
name: "Nachname",
value_type: :string,
description: "Nachname des Mitglieds",
immutable: true,
required: true
},
%{
name: "Geburtsdatum",
value_type: :date,
description: "Geburtsdatum des Mitglieds",
immutable: true,
required: true
},
%{
name: "Bezahlt",
value_type: :boolean,
description: "Status des Mitgliedsbeitrages des Mitglieds",
immutable: true,
required: true
},
%{ %{
name: "Email", name: "Email",
type: "string", value_type: :string,
description: "Email-Adresse des Mitglieds", description: "Email-Adresse des Mitglieds",
immutable: true, immutable: true,
required: true required: true

View file

@ -16,7 +16,7 @@
"custom_indexes": [], "custom_indexes": [],
"custom_statements": [], "custom_statements": [],
"has_create_action": true, "has_create_action": true,
"hash": "A0402269CB456075B81CA4CB3A2135A2C88D8B7FD51CD7A23084AA5264FEE344", "hash": "35D45214D6D344B0AF6CFCB69B8682FCB3D382D85883D3D3AAC1AEE7F54FD89A",
"identities": [], "identities": [],
"multitenancy": { "multitenancy": {
"attribute": null, "attribute": null,

View file

@ -84,7 +84,7 @@
"custom_indexes": [], "custom_indexes": [],
"custom_statements": [], "custom_statements": [],
"has_create_action": true, "has_create_action": true,
"hash": "4D127B8DA5051633CE92D4C94B1C3D76FCBD2EE992EF8318B977E5C2B8CF19E4", "hash": "8CF241CB9E8239511914EDEC96186BB7879529372BD8A4162431CCE9961F4F1B",
"identities": [], "identities": [],
"multitenancy": { "multitenancy": {
"attribute": null, "attribute": null,

View file

@ -27,7 +27,7 @@
"primary_key?": false, "primary_key?": false,
"references": null, "references": null,
"size": null, "size": null,
"source": "type", "source": "value_type",
"type": "text" "type": "text"
}, },
{ {
@ -66,7 +66,7 @@
"custom_indexes": [], "custom_indexes": [],
"custom_statements": [], "custom_statements": [],
"has_create_action": true, "has_create_action": true,
"hash": "47210108DE1E7B2A20A67205E875B3440526941E61AB95B166976E8CD8AA0955", "hash": "F98A723AE0D20005FBE4205E46ABEE09A88DFF9334C85BADC1FBEEF100F3E25B",
"identities": [ "identities": [
{ {
"all_tenants?": false, "all_tenants?": false,

View file

@ -1,19 +0,0 @@
#!/bin/bash
# Get count of untracked migrations
N_MIGRATIONS=$(git ls-files --others priv/repo/migrations | wc -l)
# Rollback untracked migrations
mix ash_postgres.rollback -n $N_MIGRATIONS
# Delete untracked migrations and snapshots
git ls-files --others priv/repo/migrations | xargs rm
git ls-files --others priv/resource_snapshots | xargs rm
# Regenerate migrations
mix ash.codegen --name $1
# Run migrations if flag
if echo $* | grep -e "-m" -q; then
mix ash.migrate
fi