chore: remove immutable from custom fields
This commit is contained in:
parent
2d259e8083
commit
6c38d7455f
4 changed files with 25 additions and 21 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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]}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue