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""" <.header> Listing Custom fields <:actions> <.button variant="primary" navigate={~p"/custom_fields/new"}> <.icon name="hero-plus" /> New Custom field <.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 :let={{_id, custom_field}} label="Name">{custom_field.name} <:col :let={{_id, custom_field}} label="Description">{custom_field.description} <:action :let={{_id, custom_field}}>
<.link navigate={~p"/custom_fields/#{custom_field}"}>Show
<.link navigate={~p"/custom_fields/#{custom_field}/edit"}>Edit <:action :let={{id, custom_field}}> <.link phx-click={JS.push("delete", value: %{id: custom_field.id}) |> hide("##{id}")} data-confirm="Are you sure?" > Delete
""" 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