Skip to content

Commit

Permalink
Espace réutilisateur : page dataset permettant de retirer des favoris (
Browse files Browse the repository at this point in the history
…#3968)

* Espace réutilisateur : page dataset permettant retirer des favoris

* Apply suggestions from code review

* Add comment

* Improve DOM for button
  • Loading branch information
AntoineAugusti authored May 30, 2024
1 parent af6ec59 commit 703d3eb
Show file tree
Hide file tree
Showing 10 changed files with 211 additions and 4 deletions.
5 changes: 5 additions & 0 deletions apps/transport/client/stylesheets/reuser_space.scss
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@
}
}

.reuser-space-section {
background-color: var(--theme-background-grey);
min-height: 80vh;
}

.action-panel {
display: flex;
flex-grow: 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ defmodule TransportWeb.ReuserSpaceController do
use TransportWeb, :controller
import Ecto.Query

plug(:find_dataset_or_redirect when action in [:datasets_edit, :unfavorite])

def espace_reutilisateur(%Plug.Conn{assigns: %{current_user: %{"id" => datagouv_user_id}}} = conn, _) do
contact = DB.Repo.get_by!(DB.Contact, datagouv_user_id: datagouv_user_id)
followed_datasets_ids = contact |> Ecto.assoc(:followed_datasets) |> select([d], d.id) |> DB.Repo.all()
Expand All @@ -12,5 +14,49 @@ defmodule TransportWeb.ReuserSpaceController do
|> render("index.html")
end

def datasets_edit(%Plug.Conn{} = conn, _), do: text(conn, "Coming later")
def datasets_edit(%Plug.Conn{} = conn, _), do: render(conn, "datasets_edit.html")

def unfavorite(%Plug.Conn{assigns: %{dataset: %DB.Dataset{} = dataset, contact: %DB.Contact{} = contact}} = conn, _) do
DB.DatasetFollower.unfollow!(contact, dataset)
delete_notification_subscriptions(contact, dataset)

conn
|> put_flash(
:info,
dgettext("reuser-space", "%{dataset_title} has been removed from your favorites",
dataset_title: dataset.custom_title
)
)
|> redirect(to: reuser_space_path(conn, :espace_reutilisateur))
end

defp delete_notification_subscriptions(%DB.Contact{id: contact_id}, %DB.Dataset{id: dataset_id}) do
DB.NotificationSubscription.base_query()
|> where([notification_subscription: ns], ns.contact_id == ^contact_id and ns.dataset_id == ^dataset_id)
|> DB.Repo.delete_all()
end

defp find_dataset_or_redirect(
%Plug.Conn{assigns: %{current_user: %{"id" => datagouv_user_id}}, path_params: %{"dataset_id" => dataset_id}} =
conn,
_options
) do
# This query makes sure that the dataset is in the user's favorites
DB.Contact.base_query()
|> join(:inner, [contact: c], d in assoc(c, :followed_datasets), as: :dataset)
|> where([contact: c], c.datagouv_user_id == ^datagouv_user_id)
|> where([dataset: d], d.id == ^dataset_id)
|> select([contact: c, dataset: d], %{contact: c, dataset: d})
|> DB.Repo.all()
|> case do
[%{contact: %DB.Contact{}, dataset: %DB.Dataset{}} = results] ->
conn |> merge_assigns(results)

_ ->
conn
|> put_flash(:error, dgettext("alert", "Unable to get this dataset for the moment"))
|> redirect(to: reuser_space_path(conn, :espace_reutilisateur))
|> halt()
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@ defmodule TransportWeb.Live.FollowedDatasetsLive do
</div>
</div>
</div>
<div class="panel__extra">
<a href={reuser_space_path(@socket, :datasets_edit, dataset.id)} class="no-bg">
<button class="button-outline primary small"><%= dgettext("reuser-space", "Edit") %></button>
</a>
</div>
</div>
<% end %>
</div>
Expand Down
1 change: 1 addition & 0 deletions apps/transport/lib/transport_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ defmodule TransportWeb.Router do
pipe_through([:reuser_space])
get("/", ReuserSpaceController, :espace_reutilisateur)
get("/datasets/:dataset_id", ReuserSpaceController, :datasets_edit)
post("/datasets/:dataset_id/unfavorite", ReuserSpaceController, :unfavorite)

live_session :reuser_space, session: %{"role" => :reuser}, root_layout: {TransportWeb.LayoutView, :app} do
live("/notifications", Live.NotificationsLive, :notifications, as: :reuser_space)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<section class="container pt-48 pb-24">
<%= breadcrumbs([@conn, :datasets_edit, @dataset.custom_title]) %>
</section>
<section class="reuser-space-section">
<div class="container pt-24">
<div class="panel">
<h2><%= @dataset.custom_title %></h2>
<a href="#modal" class="button warning"><%= dgettext("reuser-space", "Remove from favorites") %></a>
<div class="modal__backdrop" id="modal">
<div class="modal">
<p>
Here we will have soon a few words highlighting how dangerous this action is. We also offer a complimentary escape option.
</p>
<%= form_for %{}, reuser_space_path(@conn, :unfavorite, @dataset.id), [class: "no-margin", method: "post"], fn _ -> %>
<div class="form__group button__group">
<button
class="button warning"
type="submit"
data-tracking-category="reuser_space"
data-tracking-action="confirm_unfavorite_dataset"
>
<%= dgettext("reuser-space", "Remove from favorites") %>
</button>
<a
href="#"
class="button secondary"
data-tracking-category="reuser_space"
data-tracking-action="abort_unfavorite_dataset"
>
<%= dgettext("reuser-space", "Cancel") %>
</a>
</div>
<% end %>
</div>
</div>
</div>
</div>
</section>

<script defer type="text/javascript" src={static_path(@conn, "/js/app.js")} />
4 changes: 4 additions & 0 deletions apps/transport/lib/transport_web/views/bread_crumbs.ex
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ defmodule TransportWeb.BreadCrumbs do
]
end

def crumbs(conn, :datasets_edit, dataset_custom_title) do
crumbs(conn, :reuser_space) ++ [{dataset_custom_title, nil}]
end

def crumbs(conn, :select_resource, id) do
crumbs(conn, :espace_producteur) ++
[
Expand Down
16 changes: 16 additions & 0 deletions apps/transport/priv/gettext/en/LC_MESSAGES/reuser-space.po
Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,19 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "reuser-space-intro"
msgstr "To add a favorite and benefit from monitoring and quality improvement services for the datasets you reuse, you must first log in and then click on the ❤️ icon on the dataset page."

#, elixir-autogen, elixir-format
msgid "%{dataset_title} has been removed from your favorites"
msgstr ""

#, elixir-autogen, elixir-format
msgid "Cancel"
msgstr ""

#, elixir-autogen, elixir-format
msgid "Edit"
msgstr ""

#, elixir-autogen, elixir-format
msgid "Remove from favorites"
msgstr ""
16 changes: 16 additions & 0 deletions apps/transport/priv/gettext/fr/LC_MESSAGES/reuser-space.po
Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,19 @@ msgstr "transport.data.gouv.fr est affilié à data.gouv.fr : la plateforme ouve
#, elixir-autogen, elixir-format
msgid "reuser-space-intro"
msgstr "Pour ajouter un favori et bénéficier des services de suivi et d'amélioration de la qualité des jeux de données que vous réutilisez, vous devez au préalable vous connecter puis cliquer sur l'icône ❤️ sur la page du jeu de données."

#, elixir-autogen, elixir-format
msgid "%{dataset_title} has been removed from your favorites"
msgstr "%{dataset_title} a été retiré de vos favoris"

#, elixir-autogen, elixir-format
msgid "Cancel"
msgstr "Annuler"

#, elixir-autogen, elixir-format
msgid "Edit"
msgstr "Éditer"

#, elixir-autogen, elixir-format
msgid "Remove from favorites"
msgstr "Retirer de vos favoris"
16 changes: 16 additions & 0 deletions apps/transport/priv/gettext/reuser-space.pot
Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,19 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "reuser-space-intro"
msgstr ""

#, elixir-autogen, elixir-format
msgid "%{dataset_title} has been removed from your favorites"
msgstr ""

#, elixir-autogen, elixir-format
msgid "Cancel"
msgstr ""

#, elixir-autogen, elixir-format
msgid "Edit"
msgstr ""

#, elixir-autogen, elixir-format
msgid "Remove from favorites"
msgstr ""
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,71 @@ defmodule TransportWeb.ReuserSpaceControllerTest do
assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "Vous devez être préalablement connecté"
end

test "logged in", %{conn: conn} do
test "logged in, the requested dataset is not in the user's favorites", %{conn: conn} do
contact = insert_contact(%{datagouv_user_id: Ecto.UUID.generate()})
dataset = insert(:dataset)

conn =
conn
|> Plug.Test.init_test_session(%{current_user: %{"id" => contact.datagouv_user_id}})
|> get(reuser_space_path(conn, :datasets_edit, dataset.id))

assert redirected_to(conn, 302) == reuser_space_path(conn, :espace_reutilisateur)
assert Phoenix.Flash.get(conn.assigns.flash, :error) =~ "Impossible de récupérer ce jeu de données pour le moment"
end

test "logged in, with a favorited dataset", %{conn: conn} do
contact = insert_contact(%{datagouv_user_id: Ecto.UUID.generate()})
dataset = insert(:dataset)
insert(:dataset_follower, contact_id: contact.id, dataset_id: dataset.id, source: :follow_button)

assert conn
|> Plug.Test.init_test_session(%{current_user: %{"id" => contact.datagouv_user_id}})
|> get(reuser_space_path(conn, :datasets_edit, 42))
|> text_response(200) == "Coming later"
|> get(reuser_space_path(conn, :datasets_edit, dataset.id))
|> html_response(200)
|> Floki.parse_document!()
|> Floki.find("h2")
|> Floki.text() == dataset.custom_title
end
end

describe "unfavorite" do
test "requested dataset is not in the user's favorites", %{conn: conn} do
contact = insert_contact(%{datagouv_user_id: Ecto.UUID.generate()})
dataset = insert(:dataset)

conn =
conn
|> Plug.Test.init_test_session(%{current_user: %{"id" => contact.datagouv_user_id}})
|> post(reuser_space_path(conn, :unfavorite, dataset.id))

assert redirected_to(conn, 302) == reuser_space_path(conn, :espace_reutilisateur)
assert Phoenix.Flash.get(conn.assigns.flash, :error) =~ "Impossible de récupérer ce jeu de données pour le moment"
end

test "with a favorite dataset", %{conn: conn} do
contact = insert_contact(%{datagouv_user_id: Ecto.UUID.generate()})
dataset = insert(:dataset, custom_title: "FooBar")
insert(:dataset_follower, contact_id: contact.id, dataset_id: dataset.id, source: :follow_button)

insert(:notification_subscription,
contact_id: contact.id,
dataset_id: dataset.id,
source: :user,
reason: :expiration,
role: :reuser
)

conn =
conn
|> Plug.Test.init_test_session(%{current_user: %{"id" => contact.datagouv_user_id}})
|> post(reuser_space_path(conn, :unfavorite, dataset.id))

assert redirected_to(conn, 302) == reuser_space_path(conn, :espace_reutilisateur)
assert Phoenix.Flash.get(conn.assigns.flash, :info) =~ "FooBar a été retiré de vos favoris"

assert %DB.Contact{notification_subscriptions: [], followed_datasets: []} =
DB.Repo.preload(contact, [:followed_datasets, :notification_subscriptions])
end
end
end

0 comments on commit 703d3eb

Please sign in to comment.