diff --git a/apps/ex_nvr/lib/ex_nvr/model/recording.ex b/apps/ex_nvr/lib/ex_nvr/model/recording.ex
index d2320f0a..0253fba4 100644
--- a/apps/ex_nvr/lib/ex_nvr/model/recording.ex
+++ b/apps/ex_nvr/lib/ex_nvr/model/recording.ex
@@ -23,9 +23,8 @@ defmodule ExNVR.Model.Recording do
]
]
],
- pagination_types: [:page],
- default_limit: 100,
- max_limit: 150}
+ pagination_types: [:first, :last],
+ default_pagination_type: :first}
@type t :: %__MODULE__{
start_date: DateTime.t(),
diff --git a/apps/ex_nvr_web/lib/ex_nvr_web/components/core_components.ex b/apps/ex_nvr_web/lib/ex_nvr_web/components/core_components.ex
index 38a1febd..555167d3 100644
--- a/apps/ex_nvr_web/lib/ex_nvr_web/components/core_components.ex
+++ b/apps/ex_nvr_web/lib/ex_nvr_web/components/core_components.ex
@@ -686,7 +686,7 @@ defmodule ExNVRWeb.CoreComponents do
-
6}>
- <.pagination_link current_page={@meta.current_page} page={page} />
-
- 6 && @meta.current_page > 4}>
- ...
-
- 6 && abs(@meta.current_page - idx) <= 1}
- >
- <.pagination_link current_page={@meta.current_page} page={idx} />
-
- 6 && @meta.current_page < @meta.total_pages - 3}>
- ...
-
- 6}>
- <.pagination_link current_page={@meta.current_page} page={page} />
-
-
- <.pagination_link current_page={@meta.current_page} page={idx} />
-
meta =
Map.take(meta, [
- :current_page,
+ :start_cursor,
:page_size,
- :total_count,
- :total_pages
+ :end_cursor
])
recordings = Enum.map(recordings, &Map.drop(&1, [:device_name, :timezone]))
diff --git a/apps/ex_nvr_web/lib/ex_nvr_web/live/recordings_list_live.ex b/apps/ex_nvr_web/lib/ex_nvr_web/live/recordings_list_live.ex
index 4ee9143e..571e6a86 100644
--- a/apps/ex_nvr_web/lib/ex_nvr_web/live/recordings_list_live.ex
+++ b/apps/ex_nvr_web/lib/ex_nvr_web/live/recordings_list_live.ex
@@ -143,7 +143,21 @@ defmodule ExNVRWeb.RecordingListLive do
@impl true
def handle_event("paginate", pagination_params, socket) do
- pagination_params = Map.merge(socket.assigns.pagination_params, pagination_params)
+ after_cursor = Map.get(pagination_params, "after-cursor", nil)
+ first = Map.get(pagination_params, "first", 100)
+ before_cursor = Map.get(pagination_params, "before-cursor", nil)
+ last = Map.get(pagination_params, "last", 100)
+
+ cursor_params =
+ if not is_nil(after_cursor) do
+ old_pagination_params = Map.drop(socket.assigns.pagination_params, ["before", "before-cursor", "last"])
+ Map.merge(old_pagination_params, %{"first" => first, "after" => after_cursor})
+ else
+ old_pagination_params = Map.drop(socket.assigns.pagination_params, ["after", "after-cursor", "first"])
+ Map.merge(old_pagination_params, %{"last" => last, "before" => before_cursor})
+ end
+
+ pagination_params = Map.merge(pagination_params, cursor_params)
params =
Map.merge(socket.assigns.filter_params, pagination_params)
diff --git a/apps/ex_nvr_web/test/ex_nvr_web/controllers/api/recording_controller_test.exs b/apps/ex_nvr_web/test/ex_nvr_web/controllers/api/recording_controller_test.exs
index 4eba39a8..74ec863e 100644
--- a/apps/ex_nvr_web/test/ex_nvr_web/controllers/api/recording_controller_test.exs
+++ b/apps/ex_nvr_web/test/ex_nvr_web/controllers/api/recording_controller_test.exs
@@ -88,12 +88,9 @@ defmodule ExNVRWeb.API.RecordingControllerTest do
assert Enum.map(response["data"], & &1["id"]) |> MapSet.new() ==
Enum.map(recordings, & &1.id) |> MapSet.new()
- assert %{
- "total_count" => 4,
- "total_pages" => 1,
- "current_page" => 1,
- "page_size" => 100
- } = response["meta"]
+ assert Map.get(response["meta"], "page_size") == 100
+ assert Map.has_key?(response["meta"], "start_cursor")
+ assert Map.has_key?(response["meta"], "end_cursor")
end
test "filter recordings chunks", %{conn: conn, device: device, recordings: recordings} do
diff --git a/apps/ex_nvr_web/test/ex_nvr_web/live/recordings_list_live_test.exs b/apps/ex_nvr_web/test/ex_nvr_web/live/recordings_list_live_test.exs
index 8c1924ed..0cb1376a 100644
--- a/apps/ex_nvr_web/test/ex_nvr_web/live/recordings_list_live_test.exs
+++ b/apps/ex_nvr_web/test/ex_nvr_web/live/recordings_list_live_test.exs
@@ -63,7 +63,7 @@ defmodule ExNVRWeb.RecordingListLiveTest do
{:ok, lv, html} =
conn
|> log_in_user(user_fixture())
- |> live(~p"/recordings?page_size=1")
+ |> live(~p"/recordings?first=1")
# check pagination
assert lv
@@ -74,14 +74,6 @@ defmodule ExNVRWeb.RecordingListLiveTest do
|> element("a", "Next")
|> has_element?()
- assert lv
- |> element("a", "1")
- |> has_element?()
-
- for page_label <- ["1", "2", "...", "4", "5", "6", "...", "9", "10"] do
- assert html =~ page_label
- end
-
assert_recording_info(lv, html, device, List.last(recordings))
end
@@ -91,14 +83,10 @@ defmodule ExNVRWeb.RecordingListLiveTest do
|> log_in_user(user_fixture())
|> live(~p"/recordings?page_size=1")
- html = element(lv, "a", "2") |> render_click(%{page_size: 1})
-
- for page_label <- ["1", "2", "...", "4", "5", "6", "...", "9", "10"] do
- assert html =~ page_label
- end
+ html = element(lv, "a", "Next") |> render_click(%{last: 1})
# check recording
- recording = Enum.at(recordings, length(recordings) - 2)
+ recording = Enum.at(recordings, 0)
assert_recording_info(lv, html, device, recording)
end
@@ -240,7 +228,7 @@ defmodule ExNVRWeb.RecordingListLiveTest do
{:ok, lv, html} =
logged_in_conn
|> live(
- ~p"/recordings?page_size=1&order_by[]=device_name&order_by[]=start_date&order_by[]=end_date&order_directions[]=asc&order_directions[]=desc"
+ ~p"/recordings?first=1&order_by[]=device_name&order_by[]=start_date&order_by[]=end_date&order_directions[]=asc&order_directions[]=desc"
)
assert_recording_info(lv, html, device, List.last(recordings))
@@ -249,7 +237,7 @@ defmodule ExNVRWeb.RecordingListLiveTest do
{:ok, lv, html} =
logged_in_conn
|> live(
- ~p"/recordings?page_size=1&order_by[]=start_date&order_by[]=device_name&order_directions[]=asc&order_directions[]=asc"
+ ~p"/recordings?first=1&order_by[]=start_date&order_by[]=device_name&order_directions[]=asc&order_directions[]=asc"
)
assert_recording_info(lv, html, new_device, List.first(new_recordings))
@@ -258,7 +246,7 @@ defmodule ExNVRWeb.RecordingListLiveTest do
{:ok, lv, html} =
logged_in_conn
|> live(
- ~p"/recordings?page_size=1&order_by[]=end_date&order_by[]=device_name&order_directions[]=desc&order_directions[]=desc"
+ ~p"/recordings?first=1&order_by[]=end_date&order_by[]=device_name&order_directions[]=desc&order_directions[]=desc"
)
assert_recording_info(lv, html, new_device, List.last(new_recordings))