Current section

Files

Jump to
imagine_cms lib imagine_web views cms_page_view.ex
Raw

lib/imagine_web/views/cms_page_view.ex

defmodule ImagineWeb.CmsPageView do
use ImagineWeb, :view
alias Imagine.CmsPages
alias Imagine.CmsPages.CmsPage
def cms_page_browser(nil) do
home = CmsPages.get_home_page!()
cms_page_browser(home)
end
def cms_page_browser(target) do
home = CmsPages.get_home_page!()
trash = CmsPages.get_trash_page()
cms_page_browser_columns(0, [home, trash], target)
end
def cms_page_browser_columns(0, pages, target) do
[pages] ++
cond do
target.path == "" ->
[Imagine.Repo.preload(Enum.at(pages, 0), sub_pages: :sub_pages).sub_pages]
target.path == "_trash" ->
[Enum.at(pages, 1).sub_pages]
target.discarded_at ->
[Enum.at(pages, 1).sub_pages]
true ->
sub_pages = Imagine.Repo.preload(Enum.at(pages, 0), sub_pages: :sub_pages).sub_pages
cms_page_browser_columns(1, sub_pages, target)
end
end
def cms_page_browser_columns(_level, [], _target), do: []
def cms_page_browser_columns(level, pages, target) do
if level > 10, do: raise("Too many levels")
sub_pages =
find_intermediate_page_sub_pages(
pages,
Enum.at(String.split(target.path, "/"), level - 1)
)
if target.id in Enum.map(pages, fn p -> p.id end) do
[pages] ++ [sub_pages]
else
# figure out which one contains the path we need
[pages] ++ cms_page_browser_columns(level + 1, sub_pages, target)
end
end
defp find_intermediate_page_sub_pages([], _name), do: []
defp find_intermediate_page_sub_pages([page | pages], name) do
if page.name == name do
Imagine.Repo.preload(page, sub_pages: :sub_pages).sub_pages
else
find_intermediate_page_sub_pages(pages, name)
end
end
def cms_template_select_options(cms_templates) do
for t <- cms_templates, do: {t.name, t.id}
end
def cms_page_select_options(cms_pages, %CmsPage{path: ""}) do
cms_page_select_options(cms_pages)
end
def cms_page_select_options(cms_pages, %CmsPage{} = cms_page) do
list =
case cms_page.path do
nil -> cms_pages
_ -> Enum.reject(cms_pages, fn p -> String.starts_with?(p.path, cms_page.path) end)
end
cms_page_select_options(list)
end
def cms_page_select_options(cms_pages) do
for t <- Enum.sort_by(cms_pages, fn p -> p.path end),
do: {"/#{t.path} - #{t.title}", t.id}
end
def cms_page_version_select_options(cms_page_versions) do
[{"[Latest]", 0}] ++
for v <- cms_page_versions do
{"#{v.version} - #{v.created_on} by #{v.updated_by_username}", v.version}
end ++
[{"[Offline]", -1}]
end
end