Current section
Files
Jump to
Current section
Files
lib/csv_editor/show.ex
defmodule CsvEditor.Show do
@moduledoc """
Documentation for CsvEditor.Show
"""
@doc """
CSV Editor Show Data
## Examples
iex> CsvEditor.Show.data({["head 1", "head 2", "head 3"], [["cell 1", "cell 2", "cell 3"], ["cell 4", "cell 5", "cell 6"]]})
[{:safe,
[60, "table", [[32, "class", 61, 34, "csv-editor", 34]], 62,
[[60, "thead", [], 62,
[60, "tr", [], 62,
[[60, "th", [], 62, "", 60, 47, "th", 62],
[[60, "th", [], 62, "head 1", 60, 47, "th", 62],
[60, "th", [], 62, "head 2", 60, 47, "th", 62],
[60, "th", [], 62, "head 3", 60, 47, "th", 62]]], 60, 47,
"tr", 62], 60, 47, "thead", 62],
[60, "tbody", [], 62,
[[60, "tr", [], 62,
[[60, "th", [], 62, "1", 60, 47, "th", 62],
[[60, "td", [], 62, "cell 1", 60, 47, "td", 62],
[60, "td", [], 62, "cell 2", 60, 47, "td", 62],
[60, "td", [], 62, "cell 3", 60, 47, "td", 62]]], 60, 47,
"tr", 62],
[60, "tr", [], 62,
[[60, "th", [], 62, "2", 60, 47, "th", 62],
[[60, "td", [], 62, "cell 4", 60, 47, "td", 62],
[60, "td", [], 62, "cell 5", 60, 47, "td", 62],
[60, "td", [], 62, "cell 6", 60, 47, "td", 62]]], 60, 47,
"tr", 62]], 60, 47, "tbody", 62]], 60, 47, "table", 62]}, []]
"""
import Phoenix.HTML.Tag
import Scrivener.HTML
def data(file) when is_bitstring(file), do: data(file, 1)
def data({body}), do: data({[], body}, 1)
def data({header, body}), do: data({header, body}, 1)
def data({header, body}, nil), do: data({header, body}, 1)
def data(file, page) when is_bitstring(file) do
decoder = CsvEditor.decode(file)
data(decoder, page)
end
def data({body}, nil), do: data({[], body}, 1)
def data({body}, page), do: data({[], body}, page)
def data({header, body}, nil), do: data({header, body}, 1)
def data({header, body}, page) do
pages = Scrivener.paginate(body, scrivener_config(page))
[table({header, pages.entries}, page), pager(pages, pages.total_pages)]
end
defp table({header, []}, page), do: []
defp table({header, entries}, page), do:
content_tag(:table, content({header, entries}, page), [class: "csv-editor"])
defp pager(pages), do:
pagination_links(pages, next: nil, previous: nil, first: true, last: true, view_style: :foundation)
defp pager(pages, 0), do: []
defp pager(pages, 1), do: []
defp pager(pages, _), do: pager(pages)
defp content({[], []}, page), do: []
defp content({[], body}, page), do: [body(body, page)]
defp content({header, []}, page), do: [header(header)]
defp content({header, body}, page), do: [header(header), body(body, page)]
defp header(header), do:
content_tag(:thead, content_tag(:tr, [cell("", :th), Enum.map(header, fn(e) -> cell(e, :th) end)]))
defp body(body, page), do: content_tag(:tbody, row(body, :td, page))
defp row(contents, tag, page) do
Enum.with_index(contents)
|> Enum.map(fn{c, index} -> row(c, tag, index, page) end)
end
defp row(c, tag, index, page) when is_list(c) do
content_tag(:tr, [cell(row_index(page, index), :th), Enum.map(c, fn(e) -> cell(e, tag) end)])
end
defp row(c, tag, _index, _page), do: cell(c, tag)
defp cell(c, tag), do: content_tag(tag, c)
defp scrivener_config(page) when is_bitstring(page), do: scrivener_config(String.to_integer(page))
defp scrivener_config(page), do: %Scrivener.Config{page_number: page, page_size: default_page_size()}
defp default_page_size, do: 50
defp row_index(page, index) when is_bitstring(page), do: row_index(String.to_integer(page), index)
defp row_index(page, index), do: (page - 1) * default_page_size() + index + 1
end