From 5da980aef4693341e8f66ce0156b4e20934fa111 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Mon, 1 Jun 2020 22:38:27 -0400 Subject: [PATCH] Add group read view --- .../controllers/group_controller.ex | 24 ++++++++++- lib/frenzy_web/router.ex | 1 + lib/frenzy_web/templates/group/read.html.eex | 41 +++++++++++++++++++ lib/frenzy_web/templates/group/show.html.eex | 2 +- lib/frenzy_web/views/feed_view.ex | 12 ++++-- lib/frenzy_web/views/group_view.ex | 3 ++ 6 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 lib/frenzy_web/templates/group/read.html.eex diff --git a/lib/frenzy_web/controllers/group_controller.ex b/lib/frenzy_web/controllers/group_controller.ex index fcde968..4b08f49 100644 --- a/lib/frenzy_web/controllers/group_controller.ex +++ b/lib/frenzy_web/controllers/group_controller.ex @@ -1,8 +1,9 @@ defmodule FrenzyWeb.GroupController do use FrenzyWeb, :controller - alias Frenzy.{Repo, Group, Feed} + alias Frenzy.{Repo, Group, Feed, Item, Paginator} alias FrenzyWeb.Router.Helpers, as: Routes alias FrenzyWeb.Endpoint + import Ecto.Query plug :user_owns_group @@ -95,4 +96,25 @@ defmodule FrenzyWeb.GroupController do {:ok, _} = Repo.delete(group) redirect(conn, to: Routes.group_path(Endpoint, :index)) end + + def read(conn, params) do + group = conn.assigns[:group] |> Repo.preload(:feeds) + feed_ids = Enum.map(group.feeds, fn feed -> feed.id end) + + items = + Item + |> where([i], i.feed_id in ^feed_ids) + |> Paginator.paginate(params) + |> limit(50) + |> preload(:feed) + |> Repo.all() + |> Enum.sort_by(fn item -> item.date end, fn a, b -> + DateTime.compare(a, b) == :gt + end) + + render(conn, "read.html", %{ + group: group, + items: items + }) + end end diff --git a/lib/frenzy_web/router.ex b/lib/frenzy_web/router.ex index bba11c3..482b512 100644 --- a/lib/frenzy_web/router.ex +++ b/lib/frenzy_web/router.ex @@ -48,6 +48,7 @@ defmodule FrenzyWeb.Router do get "/", GroupController, :index resources "/groups", GroupController + get "/groups/:id/read", GroupController, :read resources "/feeds", FeedController, except: [:index, :new] post "/feeds/:id/refresh", FeedController, :refresh diff --git a/lib/frenzy_web/templates/group/read.html.eex b/lib/frenzy_web/templates/group/read.html.eex new file mode 100644 index 0000000..9f3d89e --- /dev/null +++ b/lib/frenzy_web/templates/group/read.html.eex @@ -0,0 +1,41 @@ +

<%= @group.title %>

+ +<%= unless is_nil(prev_page_path(@conn, @items)) do %> +

+ Newer +

+<% end %> + + + + <%= for item <- @items do %> + class="item-read"<% end %>> + + + + + <% end %> + +
+ + <%= item.title || "(Untitled)" %> + + + + <%= if item.feed.favicon do %> + <%= item.feed.title %> favicon + <% end %> + <%= item.feed.title || "(Untitled)" %> + + + <%= if item.date do %> + <% {:ok, date} = Timex.format(item.date, "{YYYY}-{0M}-{0D} {0h12}:{m} {AM}") %> + <%= date %> + <% end %> +
+ +<%= unless is_nil(next_page_path(@conn, @items)) do %> +

+ Older +

+<% end %> diff --git a/lib/frenzy_web/templates/group/show.html.eex b/lib/frenzy_web/templates/group/show.html.eex index 5769d09..d356739 100644 --- a/lib/frenzy_web/templates/group/show.html.eex +++ b/lib/frenzy_web/templates/group/show.html.eex @@ -18,7 +18,7 @@ <% end %> -Read Articles +Read Articles

Feeds

diff --git a/lib/frenzy_web/views/feed_view.ex b/lib/frenzy_web/views/feed_view.ex index bbd346f..15de7f9 100644 --- a/lib/frenzy_web/views/feed_view.ex +++ b/lib/frenzy_web/views/feed_view.ex @@ -3,8 +3,10 @@ defmodule FrenzyWeb.FeedView do alias Frenzy.{Repo, Item} import Ecto.Query - @spec next_page_path(Plug.Conn.t(), [Frenzy.Item.t()]) :: String.t() - defp next_page_path(conn, items) do + @spec next_page_path(Plug.Conn.t(), [Frenzy.Item.t()]) :: String.t() | nil + def next_page_path(_conn, []), do: nil + + def next_page_path(conn, items) do %Item{id: id, date: date} = List.last(items) has_older = Repo.exists?(from i in Item, where: i.date < ^date) @@ -15,8 +17,10 @@ defmodule FrenzyWeb.FeedView do end end - @spec prev_page_path(Plug.Conn.t(), [Frenzy.Item.t()]) :: String.t() - defp prev_page_path(conn, [%Item{id: id, date: date} | _]) do + @spec prev_page_path(Plug.Conn.t(), [Frenzy.Item.t()]) :: String.t() | nil + def prev_page_path(_conn, []), do: nil + + def prev_page_path(conn, [%Item{id: id, date: date} | _]) do has_newer = Repo.exists?(from i in Item, where: i.date > ^date) if has_newer do diff --git a/lib/frenzy_web/views/group_view.ex b/lib/frenzy_web/views/group_view.ex index 11d455f..80f33ab 100644 --- a/lib/frenzy_web/views/group_view.ex +++ b/lib/frenzy_web/views/group_view.ex @@ -1,3 +1,6 @@ defmodule FrenzyWeb.GroupView do use FrenzyWeb, :view + + defdelegate next_page_path(conn, items), to: FrenzyWeb.FeedView + defdelegate prev_page_path(conn, items), to: FrenzyWeb.FeedView end