78 lines
2.7 KiB
Elixir
78 lines
2.7 KiB
Elixir
defmodule MvWeb.MemberLive.Index.Formatter do
|
|
@moduledoc """
|
|
Formats custom field values for display in the member overview table.
|
|
|
|
Handles different value types (string, integer, boolean, date, email) and
|
|
formats them appropriately for display in the UI.
|
|
"""
|
|
use Gettext, backend: MvWeb.Gettext
|
|
|
|
@doc """
|
|
Formats a custom field value for display.
|
|
|
|
Handles different input formats:
|
|
- `nil` - Returns empty string
|
|
- `%Ash.Union{}` - Extracts value and type from union type
|
|
- Map (JSONB format) - Extracts type and value from map keys
|
|
- Direct value - Uses custom_field.value_type to determine format
|
|
|
|
## Examples
|
|
|
|
iex> format_custom_field_value(nil, %CustomField{value_type: :string})
|
|
""
|
|
|
|
iex> format_custom_field_value("test", %CustomField{value_type: :string})
|
|
"test"
|
|
|
|
iex> format_custom_field_value(true, %CustomField{value_type: :boolean})
|
|
"Yes"
|
|
"""
|
|
def format_custom_field_value(nil, _custom_field), do: ""
|
|
|
|
def format_custom_field_value(%Ash.Union{value: value, type: type}, custom_field) do
|
|
format_value_by_type(value, type, custom_field)
|
|
end
|
|
|
|
def format_custom_field_value(value, custom_field) when is_map(value) do
|
|
# Handle map format from JSONB
|
|
type = Map.get(value, "type") || Map.get(value, "_union_type")
|
|
val = Map.get(value, "value") || Map.get(value, "_union_value")
|
|
format_value_by_type(val, type, custom_field)
|
|
end
|
|
|
|
def format_custom_field_value(value, custom_field) do
|
|
format_value_by_type(value, custom_field.value_type, custom_field)
|
|
end
|
|
|
|
# Format value based on type
|
|
defp format_value_by_type(value, :string, _) when is_binary(value) do
|
|
# Return empty string if value is empty, otherwise return the value
|
|
if String.trim(value) == "", do: "", else: value
|
|
end
|
|
|
|
defp format_value_by_type(value, :string, _), do: to_string(value)
|
|
|
|
defp format_value_by_type(value, :integer, _), do: to_string(value)
|
|
|
|
defp format_value_by_type(value, :email, _) when is_binary(value) do
|
|
# Return empty string if value is empty
|
|
if String.trim(value) == "", do: "", else: value
|
|
end
|
|
|
|
defp format_value_by_type(value, :email, _), do: to_string(value)
|
|
|
|
defp format_value_by_type(value, :boolean, _) when value == true, do: gettext("Yes")
|
|
defp format_value_by_type(value, :boolean, _) when value == false, do: gettext("No")
|
|
defp format_value_by_type(value, :boolean, _), do: to_string(value)
|
|
|
|
defp format_value_by_type(%Date{} = date, :date, _), do: Date.to_string(date)
|
|
|
|
defp format_value_by_type(value, :date, _) when is_binary(value) do
|
|
case Date.from_iso8601(value) do
|
|
{:ok, date} -> Date.to_string(date)
|
|
_ -> value
|
|
end
|
|
end
|
|
|
|
defp format_value_by_type(value, _type, _), do: to_string(value)
|
|
end
|