chore: remove immutable from custom fields

This commit is contained in:
carla 2025-12-12 14:20:07 +01:00
parent 2d259e8083
commit 6c38d7455f
4 changed files with 25 additions and 21 deletions

View file

@ -12,7 +12,6 @@ defmodule Mv.Membership.CustomField do
- `slug` - URL-friendly, immutable identifier automatically generated from name (e.g., "phone-mobile") - `slug` - URL-friendly, immutable identifier automatically generated from name (e.g., "phone-mobile")
- `value_type` - Data type constraint (`:string`, `:integer`, `:boolean`, `:date`, `:email`) - `value_type` - Data type constraint (`:string`, `:integer`, `:boolean`, `:date`, `:email`)
- `description` - Optional human-readable description - `description` - Optional human-readable description
- `immutable` - If true, custom field values cannot be changed after creation
- `required` - If true, all members must have this custom field (future feature) - `required` - If true, all members must have this custom field (future feature)
- `show_in_overview` - If true, this custom field will be displayed in the member overview table and can be sorted - `show_in_overview` - If true, this custom field will be displayed in the member overview table and can be sorted
@ -60,10 +59,10 @@ defmodule Mv.Membership.CustomField do
actions do actions do
defaults [:read, :update] defaults [:read, :update]
default_accept [:name, :value_type, :description, :immutable, :required, :show_in_overview] default_accept [:name, :value_type, :description, :required, :show_in_overview]
create :create do create :create do
accept [:name, :value_type, :description, :immutable, :required, :show_in_overview] accept [:name, :value_type, :description, :required, :show_in_overview]
change Mv.Membership.CustomField.Changes.GenerateSlug change Mv.Membership.CustomField.Changes.GenerateSlug
validate string_length(:slug, min: 1) validate string_length(:slug, min: 1)
end end
@ -113,10 +112,6 @@ defmodule Mv.Membership.CustomField do
trim?: true trim?: true
] ]
attribute :immutable, :boolean,
default: false,
allow_nil?: false
attribute :required, :boolean, attribute :required, :boolean,
default: false, default: false,
allow_nil?: false allow_nil?: false

View file

@ -6,7 +6,7 @@ defmodule MvWeb.CustomFieldLive.FormComponent do
- Create new custom field definitions - Create new custom field definitions
- Edit existing custom fields - Edit existing custom fields
- Select value type from supported types - Select value type from supported types
- Set immutable and required flags - Set required flag
- Real-time validation - Real-time validation
## Props ## Props
@ -50,10 +50,10 @@ defmodule MvWeb.CustomFieldLive.FormComponent do
label={gettext("Value type")} label={gettext("Value type")}
options={ options={
Ash.Resource.Info.attribute(Mv.Membership.CustomField, :value_type).constraints[:one_of] Ash.Resource.Info.attribute(Mv.Membership.CustomField, :value_type).constraints[:one_of]
|> Enum.map(fn type -> {MvWeb.Translations.FieldTypes.label(type), type} end)
} }
/> />
<.input field={@form[:description]} type="text" label={gettext("Description")} /> <.input field={@form[:description]} type="text" label={gettext("Description")} />
<.input field={@form[:immutable]} type="checkbox" label={gettext("Immutable")} />
<.input field={@form[:required]} type="checkbox" label={gettext("Required")} /> <.input field={@form[:required]} type="checkbox" label={gettext("Required")} />
<.input <.input
field={@form[:show_in_overview]} field={@form[:show_in_overview]}

View file

@ -0,0 +1,21 @@
defmodule Mv.Repo.Migrations.RemoveImmutableFromCustomFields do
@moduledoc """
Removes the immutable column from custom_fields table.
The immutable field is no longer needed in the custom field definition.
"""
use Ecto.Migration
def up do
alter table(:custom_fields) do
remove :immutable
end
end
def down do
alter table(:custom_fields) do
add :immutable, :boolean, null: false, default: false
end
end
end

View file

@ -12,28 +12,24 @@ for attrs <- [
name: "String Field", name: "String Field",
value_type: :string, value_type: :string,
description: "Example for a field of type string", description: "Example for a field of type string",
immutable: true,
required: false required: false
}, },
%{ %{
name: "Date Field", name: "Date Field",
value_type: :date, value_type: :date,
description: "Example for a field of type date", description: "Example for a field of type date",
immutable: true,
required: false required: false
}, },
%{ %{
name: "Boolean Field", name: "Boolean Field",
value_type: :boolean, value_type: :boolean,
description: "Example for a field of type boolean", description: "Example for a field of type boolean",
immutable: true,
required: false required: false
}, },
%{ %{
name: "Email Field", name: "Email Field",
value_type: :email, value_type: :email,
description: "Example for a field of type email", description: "Example for a field of type email",
immutable: true,
required: false required: false
}, },
# Realistic custom fields # Realistic custom fields
@ -41,56 +37,48 @@ for attrs <- [
name: "Membership Number", name: "Membership Number",
value_type: :string, value_type: :string,
description: "Unique membership identification number", description: "Unique membership identification number",
immutable: false,
required: false required: false
}, },
%{ %{
name: "Emergency Contact", name: "Emergency Contact",
value_type: :string, value_type: :string,
description: "Emergency contact person name and phone", description: "Emergency contact person name and phone",
immutable: false,
required: false required: false
}, },
%{ %{
name: "T-Shirt Size", name: "T-Shirt Size",
value_type: :string, value_type: :string,
description: "T-Shirt size for events (XS, S, M, L, XL, XXL)", description: "T-Shirt size for events (XS, S, M, L, XL, XXL)",
immutable: false,
required: false required: false
}, },
%{ %{
name: "Newsletter Subscription", name: "Newsletter Subscription",
value_type: :boolean, value_type: :boolean,
description: "Whether member wants to receive newsletter", description: "Whether member wants to receive newsletter",
immutable: false,
required: false required: false
}, },
%{ %{
name: "Date of Last Medical Check", name: "Date of Last Medical Check",
value_type: :date, value_type: :date,
description: "Date of last medical examination", description: "Date of last medical examination",
immutable: false,
required: false required: false
}, },
%{ %{
name: "Secondary Email", name: "Secondary Email",
value_type: :email, value_type: :email,
description: "Alternative email address", description: "Alternative email address",
immutable: false,
required: false required: false
}, },
%{ %{
name: "Membership Type", name: "Membership Type",
value_type: :string, value_type: :string,
description: "Type of membership (e.g., Regular, Student, Senior)", description: "Type of membership (e.g., Regular, Student, Senior)",
immutable: false,
required: false required: false
}, },
%{ %{
name: "Parking Permit", name: "Parking Permit",
value_type: :boolean, value_type: :boolean,
description: "Whether member has parking permit", description: "Whether member has parking permit",
immutable: false,
required: false required: false
} }
] do ] do