defmodule ExTeal.FieldVisibility do @moduledoc """ Functions that allow a resource to configure which fields can be displayed on which parts of the resource. """ alias ExTeal.Field @doc """ Field is only visible on Details and Index """ @spec except_on_forms(Field.t()) :: Field.t() def except_on_forms(field), do: %{ field | show_on_edit: false, show_on_new: false } @doc """ Hide field is hidden on the index """ @spec hide_from_index(Field.t()) :: Field.t() def hide_from_index(field), do: %{field | show_on_index: false} @doc """ Show field on the index """ @spec show_on_index(Field.t()) :: Field.t() def show_on_index(field), do: %{field | show_on_index: true} @doc """ Hide field is hidden on the detail """ @spec hide_from_detail(Field.t()) :: Field.t() def hide_from_detail(field), do: %{field | show_on_detail: false} @doc """ Hide field is hidden when updating a resource """ @spec hide_when_updating(Field.t()) :: Field.t() def hide_when_updating(field), do: %{field | show_on_edit: false} @doc """ Hide field is hidden when creating a resource """ @spec hide_when_creating(Field.t()) :: Field.t() def hide_when_creating(field), do: %{field | show_on_new: false} @doc """ Field is only visible on Details """ @spec only_on_details(Field.t()) :: Field.t() def only_on_details(field), do: %{ field | show_on_detail: true, show_on_edit: false, show_on_index: false, show_on_new: false } @doc """ Field is only visible on Create and New """ @spec only_on_forms(Field.t()) :: Field.t() def only_on_forms(field), do: %{ field | show_on_detail: false, show_on_edit: true, show_on_index: false, show_on_new: true } @doc """ Field is only visible on Index """ @spec only_on_index(Field.t()) :: Field.t() def only_on_index(field), do: %{ field | show_on_detail: false, show_on_edit: false, show_on_index: true, show_on_new: false } @doc """ Marks a relational field as searchable Only applies to many to many relationships """ @spec searchable(Field.t()) :: Field.t() def searchable(%Field{type: ExTeal.Field.ManyToMany} = field), do: put_in(field, [:options, :searchable], true) def searchable(field), do: field @doc """ Marks the field as safe to render as html """ @spec as_html(Field.t()) :: Field.t() def as_html(field), do: %{field | as_html: true} @doc """ Stack a fields value or form underneath its label """ @spec stacked(Field.t()) :: Field.t() def stacked(field), do: %{field | stacked: true} @doc """ Conditionally render a field on a resource as a whole based on the current request. Helpful for filtering out fields based on the current users permissions. """ @spec can_see?(Field.t(), (Plug.Conn.t() -> boolean())) :: Field.t() def can_see?(field, func) do Map.put(field, :can_see, func) end end