All checks were successful
continuous-integration/drone/push Build is passing
Complete refactoring of resources, database tables, code references, tests, and documentation for improved naming consistency.
88 lines
2.7 KiB
Elixir
88 lines
2.7 KiB
Elixir
defmodule MvWeb.CustomFieldLive.Index do
|
|
@moduledoc """
|
|
LiveView for managing custom field definitions (admin).
|
|
|
|
## Features
|
|
- List all custom fields
|
|
- Display type information (name, value type, description)
|
|
- Show immutable and required flags
|
|
- Create new custom fields
|
|
- Edit existing custom fields
|
|
- Delete custom fields (if no custom field values use them)
|
|
|
|
## Displayed Information
|
|
- Name: Unique identifier for the custom field
|
|
- Value type: Data type constraint (string, integer, boolean, date, email)
|
|
- Description: Human-readable explanation
|
|
- Immutable: Whether custom field values can be changed after creation
|
|
- Required: Whether all members must have this custom field (future feature)
|
|
|
|
## Events
|
|
- `delete` - Remove a custom field (only if no custom field values exist)
|
|
|
|
## Security
|
|
Custom field management is restricted to admin users.
|
|
"""
|
|
use MvWeb, :live_view
|
|
|
|
@impl true
|
|
def render(assigns) do
|
|
~H"""
|
|
<Layouts.app flash={@flash} current_user={@current_user}>
|
|
<.header>
|
|
Listing Custom fields
|
|
<:actions>
|
|
<.button variant="primary" navigate={~p"/custom_fields/new"}>
|
|
<.icon name="hero-plus" /> New Custom field
|
|
</.button>
|
|
</:actions>
|
|
</.header>
|
|
|
|
<.table
|
|
id="custom_fields"
|
|
rows={@streams.custom_fields}
|
|
row_click={fn {_id, custom_field} -> JS.navigate(~p"/custom_fields/#{custom_field}") end}
|
|
>
|
|
<:col :let={{_id, custom_field}} label="Id">{custom_field.id}</:col>
|
|
|
|
<:col :let={{_id, custom_field}} label="Name">{custom_field.name}</:col>
|
|
|
|
<:col :let={{_id, custom_field}} label="Description">{custom_field.description}</:col>
|
|
|
|
<:action :let={{_id, custom_field}}>
|
|
<div class="sr-only">
|
|
<.link navigate={~p"/custom_fields/#{custom_field}"}>Show</.link>
|
|
</div>
|
|
|
|
<.link navigate={~p"/custom_fields/#{custom_field}/edit"}>Edit</.link>
|
|
</:action>
|
|
|
|
<:action :let={{id, custom_field}}>
|
|
<.link
|
|
phx-click={JS.push("delete", value: %{id: custom_field.id}) |> hide("##{id}")}
|
|
data-confirm="Are you sure?"
|
|
>
|
|
Delete
|
|
</.link>
|
|
</:action>
|
|
</.table>
|
|
</Layouts.app>
|
|
"""
|
|
end
|
|
|
|
@impl true
|
|
def mount(_params, _session, socket) do
|
|
{:ok,
|
|
socket
|
|
|> assign(:page_title, "Listing Custom fields")
|
|
|> stream(:custom_fields, Ash.read!(Mv.Membership.CustomField))}
|
|
end
|
|
|
|
@impl true
|
|
def handle_event("delete", %{"id" => id}, socket) do
|
|
custom_field = Ash.get!(Mv.Membership.CustomField, id)
|
|
Ash.destroy!(custom_field)
|
|
|
|
{:noreply, stream_delete(socket, :custom_fields, custom_field)}
|
|
end
|
|
end
|