From e3c93260037dc789691bb152b44a586565108fa1 Mon Sep 17 00:00:00 2001 From: Kieran Eglin Date: Tue, 7 May 2024 10:55:34 -0700 Subject: [PATCH] Added basic history table to homepage --- .../pages/page_html/history_table_live.ex | 106 ++++++++++++++++++ .../pages/page_html/home.html.heex | 22 +++- 2 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 lib/pinchflat_web/controllers/pages/page_html/history_table_live.ex 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 :)