defmodule LayoutBuilder.Layout.Row do use Ecto.Schema import Ecto.Changeset alias Ecto.UUID alias LayoutBuilder.Layout.Col @moduledoc """ Row represents a row inside a Layout or a Col. """ @type t() :: %__MODULE__{ id: Ecto.UUID.t() | nil, name: String.t(), cols: list(Col.t()) | nil, } embedded_schema do field :name, :string embeds_many :cols, Col end @spec build_row() :: %__MODULE__{ id: Ecto.UUID.t(), name: nil, cols: [ %Col{ id: Ecto.UUID.t(), name: nil, rows: [] } ] } def build_row(), do: %__MODULE__{id: UUID.generate(), cols: [Col.build_col]} @spec add_col(__MODULE__.t()) :: __MODULE__.t() def add_col(%__MODULE__{} = row) do %__MODULE__{row | cols: [Col.build_col | row.cols]} end def changeset(%__MODULE__{} = struct, attrs) do change(struct) |> changeset(attrs) end def changeset(%Ecto.Changeset{} = change, %__MODULE__{} = attrs) do changeset(change, Map.from_struct(attrs)) end def changeset(%Ecto.Changeset{} = change, %{} = attrs) do change |> cast(attrs, [:name]) |> cast_embed(:cols) end end