From c1840cddf1d9102f864f33b352f3a2c204adf322 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lobo?= Date: Thu, 13 Jun 2024 16:49:59 +0100 Subject: [PATCH 01/39] feat: improve activities index --- .../activity_live/components/activity_card.ex | 72 +++++++++++++++++++ .../live/activity_live/form_component.ex | 2 +- lib/atomic_web/live/activity_live/index.ex | 17 +++-- .../live/activity_live/index.html.heex | 67 +++-------------- 4 files changed, 93 insertions(+), 65 deletions(-) create mode 100644 lib/atomic_web/live/activity_live/components/activity_card.ex diff --git a/lib/atomic_web/live/activity_live/components/activity_card.ex b/lib/atomic_web/live/activity_live/components/activity_card.ex new file mode 100644 index 000000000..af9876127 --- /dev/null +++ b/lib/atomic_web/live/activity_live/components/activity_card.ex @@ -0,0 +1,72 @@ +defmodule AtomicWeb.ActivityLive.Components.ActivityCard do + @moduledoc false + use AtomicWeb, :component + + import AtomicWeb.Components.{Avatar, Gradient} + + attr :activity, :map, required: true, doc: "The activity to display." + + def activity_card(assigns) do + ~H""" +
+ + <.link navigate={Routes.activity_show_path(AtomicWeb.Endpoint, :show, @activity)}> +
+ +
+
+

+ <%= @activity.title %> +

+
+
+
+

+ <.icon name={:calendar} solid class="mr-1.5 h-5 w-5 flex-shrink-0 text-zinc-400" /> + <%= if @activity.start do %> + <%= pretty_display_date(@activity.start) %> + <% end %> +

+ <%= if @activity.location do %> +

+ <.icon name={:map_pin} solid class="mr-1.5 h-5 w-5 flex-shrink-0 text-zinc-400" /> + <%= @activity.location && @activity.location.name %> +

+ <% end %> +
+
+ + <.link navigate={Routes.organization_show_path(AtomicWeb.Endpoint, :show, @activity.organization.id)} class="group flex max-w-min pt-2"> + <.icon name={:building_office} solid class="mr-1.5 h-5 w-5 text-zinc-400" /> + + <%= @activity.organization.name %> + + + +
+
+ <%= for speaker <- @activity.speakers do %> +
+ <.avatar name={speaker.name} size={:xs} color={:light_gray} class="!w-6 !h-6 mr-1.5" /> +

+ <%= extract_first_last_name(speaker.name) %> +

+
+ <% end %> +
+
+
+ +
+ <%= if @activity.image do %> + + <% else %> + <.gradient seed={@activity.id} class="rounded-r-lg" /> + <% end %> +
+
+ +
+ """ + end +end diff --git a/lib/atomic_web/live/activity_live/form_component.ex b/lib/atomic_web/live/activity_live/form_component.ex index 96237f659..dbb209172 100644 --- a/lib/atomic_web/live/activity_live/form_component.ex +++ b/lib/atomic_web/live/activity_live/form_component.ex @@ -106,7 +106,7 @@ defmodule AtomicWeb.ActivityLive.FormComponent do consume_uploaded_entries(socket, :image, fn %{path: path}, entry -> Activities.update_activity_image(activity, %{ "image" => %Plug.Upload{ - content_type: entry.content_type, + content_type: entry.client_type, filename: entry.client_name, path: path } diff --git a/lib/atomic_web/live/activity_live/index.ex b/lib/atomic_web/live/activity_live/index.ex index 6e2bf0e18..22ae9fc9a 100644 --- a/lib/atomic_web/live/activity_live/index.ex +++ b/lib/atomic_web/live/activity_live/index.ex @@ -1,7 +1,8 @@ defmodule AtomicWeb.ActivityLive.Index do use AtomicWeb, :live_view - import AtomicWeb.Components.{Avatar, Button, Empty, Pagination, Tabs} + import AtomicWeb.Components.{Button, Empty, Pagination, Tabs} + import AtomicWeb.ActivityLive.Components.ActivityCard alias Atomic.Accounts alias Atomic.Activities @@ -39,7 +40,9 @@ defmodule AtomicWeb.ActivityLive.Index do end defp list_all_activities(_socket, params) do - case Activities.list_activities(params, preloads: [:speakers, :activity_enrollments]) do + case Activities.list_activities(params, + preloads: [:speakers, :activity_enrollments, :organization] + ) do {:ok, {activities, meta}} -> %{activities: activities, meta: meta} @@ -53,7 +56,7 @@ defmodule AtomicWeb.ActivityLive.Index do Organizations.list_organizations_followed_by_user(socket.assigns.current_user.id) case Activities.list_organizations_activities(organizations, params, - preloads: [:speakers, :activity_enrollments] + preloads: [:speakers, :activity_enrollments, :organization] ) do {:ok, {activities, meta}} -> %{activities: activities, meta: meta} @@ -64,7 +67,9 @@ defmodule AtomicWeb.ActivityLive.Index do end defp list_upcoming_activities(_socket, params) do - case Activities.list_upcoming_activities(params, preloads: [:speakers, :activity_enrollments]) do + case Activities.list_upcoming_activities(params, + preloads: [:speakers, :activity_enrollments, :organization] + ) do {:ok, {activities, meta}} -> %{activities: activities, meta: meta} @@ -75,7 +80,7 @@ defmodule AtomicWeb.ActivityLive.Index do defp list_enrolled_activities(socket, params) do case Activities.list_user_activities(socket.assigns.current_user.id, params, - preloads: [:speakers, :activity_enrollments] + preloads: [:speakers, :activity_enrollments, :organization] ) do {:ok, {activities, meta}} -> %{activities: activities, meta: meta} @@ -86,7 +91,7 @@ defmodule AtomicWeb.ActivityLive.Index do end defp current_tab(_socket, params) when is_map_key(params, "tab"), do: params["tab"] - defp current_tab(_socket, _params), do: "all" + defp current_tab(_socket, _params), do: "upcoming" defp has_permissions?(socket) when not socket.assigns.is_authenticated?, do: false diff --git a/lib/atomic_web/live/activity_live/index.html.heex b/lib/atomic_web/live/activity_live/index.html.heex index a582348ef..9c6545476 100644 --- a/lib/atomic_web/live/activity_live/index.html.heex +++ b/lib/atomic_web/live/activity_live/index.html.heex @@ -1,14 +1,14 @@ <.page title="Activities"> <:actions> - <.button navigate={Routes.activity_new_path(@socket, :new, @current_organization)}> + <.button navigate={Routes.activity_new_path(@socket, :new, @current_organization)} icon={:plus}> <%= gettext("New") %> <.tabs class="max-w-5-xl mx-auto px-4 sm:px-6 lg:px-8"> - <.link patch="?tab=all" replace={false}> - <.tab active={@current_tab == "all"}> - <%= gettext("All") %> + <.link patch="?tab=upcoming" replace={false}> + <.tab active={@current_tab == "upcoming"}> + <%= gettext("Upcoming") %> @@ -18,9 +18,9 @@ - <.link patch="?tab=upcoming" replace={false}> - <.tab active={@current_tab == "upcoming"}> - <%= gettext("Upcoming") %> + <.link patch="?tab=all" replace={false}> + <.tab active={@current_tab == "all"}> + <%= gettext("All") %> @@ -37,59 +37,10 @@ <% else %>
-