Current section

Files

Jump to
ex_cell lib ex_cell cell.ex
Raw

lib/ex_cell/cell.ex

defmodule ExCell.Cell do
@moduledoc """
Cell methods that can be overridden
"""
alias Phoenix.HTML.Tag
@doc false
def name(module, namespace) do
parts = case namespace do
nil -> Module.split(module)
_ -> ExCell.module_relative_to(module, namespace)
end
Enum.join(parts, "-")
end
@doc false
def container(name, params \\ %{}, options \\ [], content \\ nil) do
{tag, options} = Keyword.pop(options, :tag, :div)
attributes = attributes(name, options, params)
case content do
nil -> Tag.tag(tag, attributes)
_ -> Tag.content_tag(tag, content, attributes)
end
end
@doc false
def class_name(classes) when is_list(classes) do
classes
|> List.flatten
|> Enum.reject(&is_nil/1)
|> Enum.join(" ")
end
@doc false
defp attributes(name, options, params) do
{data, options} = Keyword.pop(options, :data)
data = Enum.concat(
(data || []),
[cell: name, cell_params: Poison.encode!(params)]
)
options
|> Keyword.put(:data, data)
|> Enum.reject(&is_nil/1)
end
defmacro __using__(opts \\ []) do
quote do
import ExCell.View
def name do
cell_adapter().name(__MODULE__, unquote(opts[:namespace]))
end
def class_name, do: name()
def params, do: %{}
def params(values), do: Map.merge(params(), values)
def container do
container(%{}, [], [do: nil])
end
def container([do: content]) do
container(%{}, [], [do: content])
end
def container(options) when is_list(options) do
container(%{}, options, [do: nil])
end
def container(%{} = params) do
container(params, [], [do: nil])
end
def container(options, [do: content]) when is_list(options) do
container(%{}, options, [do: content])
end
def container(%{} = params, [do: content]) do
container(params, [], [do: content])
end
def container(%{} = params, options, [do: content]) when is_list(options) do
class_name = [class_name(), options[:class]]
|> cell_adapter().class_name()
options = Keyword.put(options, :class, class_name)
cell_adapter().container(name(), params(params), options, content)
end
defp cell_adapter, do: unquote(ExCell.config(:cell_adapter))
defoverridable [name: 0, params: 0, class_name: 0]
end
end
end