diff --git a/lib/pinchflat_web/controllers/pages/page_html/history_table_live.ex b/lib/pinchflat_web/controllers/pages/page_html/history_table_live.ex
new file mode 100644
index 0000000..bd5c2a7
--- /dev/null
+++ b/lib/pinchflat_web/controllers/pages/page_html/history_table_live.ex
@@ -0,0 +1,106 @@
+defmodule Pinchflat.Pages.HistoryTableLive do
+ use PinchflatWeb, :live_view
+ import Ecto.Query, warn: false
+
+ alias Pinchflat.Repo
+ alias Pinchflat.Media.MediaQuery
+ alias Pinchflat.Utils.NumberUtils
+
+ @limit 10
+
+ def render(%{records: []} = assigns) do
+ ~H"""
+
+ <.icon_button icon_name="hero-arrow-path" class="h-10 w-10" phx-click="reload_page" />
+
Nothing Here!
+
+ """
+ end
+
+ def render(assigns) do
+ ~H"""
+
+
+ <.icon_button icon_name="hero-arrow-path" class="h-10 w-10" phx-click="reload_page" tooltip="Refresh" />
+ Showing <%= length(@records) %> of <%= @total_record_count %>
+
+ <.table rows={@records} table_class="text-white">
+ <:col :let={media_item} label="Title">
+ <.subtle_link href={~p"/sources/#{media_item.source_id}/media/#{media_item}"}>
+ <%= StringUtils.truncate(media_item.title, 35) %>
+
+
+ <:col :let={media_item} label="Upload Date">
+ <%= media_item.upload_date %>
+
+ <:col :let={media_item} label="Indexed At (UTC)">
+ <%= format_datetime(media_item.inserted_at) %>
+
+ <:col :let={media_item} label="Downloaded At (UTC)">
+ <%= format_datetime(media_item.media_downloaded_at) %>
+
+ <:col :let={media_item} label="Source">
+ <.subtle_link href={~p"/sources/#{media_item.source_id}"}>
+ <%= StringUtils.truncate(media_item.source.custom_name, 35) %>
+
+
+
+
+ <.live_pagination_controls page_number={@page} total_pages={@total_pages} />
+
+
+ """
+ end
+
+ def mount(_params, _session, socket) do
+ page = 1
+ base_query = generate_base_query()
+ pagination_attrs = fetch_pagination_attributes(base_query, page)
+
+ {:ok, assign(socket, Map.merge(pagination_attrs, %{base_query: base_query}))}
+ end
+
+ def handle_event("page_change", %{"direction" => direction}, %{assigns: assigns} = socket) do
+ direction = if direction == "inc", do: 1, else: -1
+ new_page = assigns.page + direction
+ new_assigns = fetch_pagination_attributes(assigns.base_query, new_page)
+
+ {:noreply, assign(socket, new_assigns)}
+ end
+
+ def handle_event("reload_page", _params, %{assigns: assigns} = socket) do
+ new_assigns = fetch_pagination_attributes(assigns.base_query, assigns.page)
+
+ {:noreply, assign(socket, new_assigns)}
+ end
+
+ defp fetch_pagination_attributes(base_query, page) do
+ total_record_count = Repo.aggregate(base_query, :count, :id)
+ total_pages = max(ceil(total_record_count / @limit), 1)
+ page = NumberUtils.clamp(page, 1, total_pages)
+ records = fetch_records(base_query, page)
+
+ %{page: page, total_pages: total_pages, records: records, total_record_count: total_record_count}
+ end
+
+ defp fetch_records(base_query, page) do
+ offset = (page - 1) * @limit
+
+ base_query
+ |> limit(^@limit)
+ |> offset(^offset)
+ |> Repo.all()
+ |> Repo.preload(:source)
+ end
+
+ defp generate_base_query do
+ MediaQuery.new()
+ |> order_by(desc: :id)
+ end
+
+ defp format_datetime(nil), do: ""
+
+ defp format_datetime(datetime) do
+ Calendar.strftime(datetime, "%Y-%m-%d %I:%M %p")
+ end
+end
diff --git a/lib/pinchflat_web/controllers/pages/page_html/home.html.heex b/lib/pinchflat_web/controllers/pages/page_html/home.html.heex
index 88f5ca9..c417681 100644
--- a/lib/pinchflat_web/controllers/pages/page_html/home.html.heex
+++ b/lib/pinchflat_web/controllers/pages/page_html/home.html.heex
@@ -23,5 +23,25 @@
- I know this page isn't super useful yet, but give it time :)
+
+
+
+ Download History
+
+ <%= live_render(@conn, Pinchflat.Pages.HistoryTableLive) %>
+
+
+
+
+<%!--
+
+
+ <.table rows={[]} table_class="text-black dark:text-white">
+ <:col :let={_source} label="Name">Test
+
+
+
+
--%>
+
+I know this page isn't super useful yet, but give it time :)