From 4e79a1fe19515a3ef1b565b9aa64607d89c4fc9c Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Mon, 1 Jun 2020 22:46:15 -0400 Subject: [PATCH] Fix pagination not working correctly with multiple feeds --- lib/frenzy_web/controllers/feed_controller.ex | 23 ++++++++++++++- .../controllers/group_controller.ex | 27 ++++++++++++++++- lib/frenzy_web/templates/feed/show.html.eex | 8 ++--- lib/frenzy_web/templates/group/read.html.eex | 8 ++--- lib/frenzy_web/views/feed_view.ex | 29 ------------------- lib/frenzy_web/views/group_view.ex | 3 -- 6 files changed, 56 insertions(+), 42 deletions(-) diff --git a/lib/frenzy_web/controllers/feed_controller.ex b/lib/frenzy_web/controllers/feed_controller.ex index c11818e..db4f737 100644 --- a/lib/frenzy_web/controllers/feed_controller.ex +++ b/lib/frenzy_web/controllers/feed_controller.ex @@ -38,9 +38,30 @@ defmodule FrenzyWeb.FeedController do DateTime.compare(a, b) == :gt end) + first_item = List.first(items) + last_item = List.last(items) + + prev_page_path = + if !is_nil(first_item) && + Repo.exists?(from i in Item, where: i.date > ^first_item.date and i.feed_id == ^id) do + current_path(conn, %{after: first_item.id}) + else + nil + end + + next_page_path = + if !is_nil(last_item) && + Repo.exists?(from i in Item, where: i.date < ^last_item.date and i.feed_id == ^id) do + current_path(conn, %{before: last_item.id}) + else + nil + end + render(conn, "show.html", %{ feed: feed, - items: items + items: items, + next_page_path: next_page_path, + prev_page_path: prev_page_path }) end diff --git a/lib/frenzy_web/controllers/group_controller.ex b/lib/frenzy_web/controllers/group_controller.ex index 4b08f49..1570338 100644 --- a/lib/frenzy_web/controllers/group_controller.ex +++ b/lib/frenzy_web/controllers/group_controller.ex @@ -112,9 +112,34 @@ defmodule FrenzyWeb.GroupController do DateTime.compare(a, b) == :gt end) + first_item = List.first(items) + last_item = List.last(items) + + prev_page_path = + if !is_nil(first_item) && + Repo.exists?( + from i in Item, where: i.date > ^first_item.date and i.feed_id in ^feed_ids + ) do + current_path(conn, %{after: first_item.id}) + else + nil + end + + next_page_path = + if !is_nil(last_item) && + Repo.exists?( + from i in Item, where: i.date < ^last_item.date and i.feed_id in ^feed_ids + ) do + current_path(conn, %{before: last_item.id}) + else + nil + end + render(conn, "read.html", %{ group: group, - items: items + items: items, + prev_page_path: prev_page_path, + next_page_path: next_page_path }) end end diff --git a/lib/frenzy_web/templates/feed/show.html.eex b/lib/frenzy_web/templates/feed/show.html.eex index 05e47aa..659a9e1 100644 --- a/lib/frenzy_web/templates/feed/show.html.eex +++ b/lib/frenzy_web/templates/feed/show.html.eex @@ -17,9 +17,9 @@

Items

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

- Newer + Newer

<% end %> @@ -41,8 +41,8 @@ -<%= unless is_nil(next_page_path(@conn, @items)) do %> +<%= unless is_nil(@next_page_path) do %>

- Older + Older

<% end %> diff --git a/lib/frenzy_web/templates/group/read.html.eex b/lib/frenzy_web/templates/group/read.html.eex index 9f3d89e..f3297c5 100644 --- a/lib/frenzy_web/templates/group/read.html.eex +++ b/lib/frenzy_web/templates/group/read.html.eex @@ -1,8 +1,8 @@

<%= @group.title %>

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

- Newer + Newer

<% end %> @@ -34,8 +34,8 @@ -<%= unless is_nil(next_page_path(@conn, @items)) do %> +<%= unless is_nil(@next_page_path) do %>

- Older + Older

<% end %> diff --git a/lib/frenzy_web/views/feed_view.ex b/lib/frenzy_web/views/feed_view.ex index 15de7f9..988654d 100644 --- a/lib/frenzy_web/views/feed_view.ex +++ b/lib/frenzy_web/views/feed_view.ex @@ -1,32 +1,3 @@ defmodule FrenzyWeb.FeedView do use FrenzyWeb, :view - alias Frenzy.{Repo, Item} - import Ecto.Query - - @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) - - if has_older do - Phoenix.Controller.current_path(conn, %{before: id}) - else - nil - end - end - - @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 - Phoenix.Controller.current_path(conn, %{after: id}) - else - nil - end - end end diff --git a/lib/frenzy_web/views/group_view.ex b/lib/frenzy_web/views/group_view.ex index 80f33ab..11d455f 100644 --- a/lib/frenzy_web/views/group_view.ex +++ b/lib/frenzy_web/views/group_view.ex @@ -1,6 +1,3 @@ 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