Skip to content

Commit

Permalink
Espace producteur : supprimer ressource d'un JDD (#3504)
Browse files Browse the repository at this point in the history
* Espace producteur : supprimer ressource d'un JDD

* Unused variable

* Improve UI and add tracking events

* Fix test

* Improve UI
  • Loading branch information
AntoineAugusti authored Oct 6, 2023
1 parent d3b6669 commit c296972
Show file tree
Hide file tree
Showing 16 changed files with 274 additions and 50 deletions.
4 changes: 4 additions & 0 deletions apps/datagouvfr/lib/datagouvfr/client/resources.ex
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,10 @@ defmodule Datagouvfr.Client.Resources do

def get(_), do: %{}

def delete(%Plug.Conn{} = conn, %{"dataset_id" => _, "resource_id" => _} = params) do
Client.delete(conn, make_path(params))
end

@spec put_mime(map(), map()) :: map()
defp put_mime(payload, params) do
if Map.has_key?(@format_to_mime, params["format"]) do
Expand Down
9 changes: 9 additions & 0 deletions apps/transport/client/javascripts/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,15 @@ const csrfToken = document.querySelector('meta[name=\'csrf\']').getAttribute('co
const liveSocket = new LiveSocket('/live', Socket, { hooks: Hooks, params: { _csrf_token: csrfToken } })
liveSocket.connect()

// Track analytics events for DOM elements by a `data-tracking-category`.
// The event will be recorded on a click event
document.querySelectorAll('[data-tracking-category]').forEach(el => {
el.addEventListener('click', function (event) {
const name = event.dataset.trackingName || ''
window._paq.push(['trackEvent', event.dataset.trackingCategory, event.dataset.trackingAction, name])
})
})

// expose liveSocket on window for web console debug logs and latency simulation:
// >> liveSocket.enableDebug()
// >> liveSocket.enableLatencySim(1000) // enabled for duration of browser session
Expand Down
4 changes: 2 additions & 2 deletions apps/transport/client/stylesheets/espace_producteur.scss
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,8 @@
}
}
.dataset-item {
a:nth-child(1) {
margin-right: 12px;
.button-outline {
margin-right: 5px;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,10 @@ defmodule TransportWeb.ResourceController do
|> render("list.html")
end

@doc """
List resources for a dataset, prompting the user to choose a resource.
Used to either update OR delete a resource afterwards.
"""
@spec resources_list(Plug.Conn.t(), map()) :: Plug.Conn.t()
def resources_list(conn, %{"dataset_id" => dataset_id}) do
conn
Expand All @@ -201,27 +205,53 @@ defmodule TransportWeb.ResourceController do
end

@spec form(Plug.Conn.t(), map()) :: Plug.Conn.t()
def form(conn, %{"dataset_id" => dataset_id} = args) do
def form(conn, %{"dataset_id" => dataset_id} = params) do
conn
|> assign_or_flash(
fn -> Datasets.get(dataset_id) end,
:dataset,
"Unable to get resources, please retry."
)
|> get_resource(args)
|> get_resource(params)
|> render("form.html")
end

defp get_resource(conn, %{"dataset_id" => _, "resource_id" => _} = args) do
assign_or_flash(
conn,
fn -> Resources.get(args) end,
def delete_resource_confirmation(%Plug.Conn{} = conn, %{"dataset_id" => _, "resource_id" => _} = params) do
conn |> get_resource(params) |> render("delete_resource_confirmation.html")
end

def delete(%Plug.Conn{} = conn, %{"dataset_id" => dataset_id, "resource_id" => _} = params) do
with {:ok, _} <- Resources.delete(conn, params),
dataset when not is_nil(dataset) <-
Repo.get_by(Dataset, datagouv_id: dataset_id),
{:ok, _} <- ImportData.import_dataset_logged(dataset),
{:ok, _} <- Dataset.validate(dataset) do
conn
|> put_flash(:info, dgettext("resource", "The resource has been deleted"))
|> redirect(to: page_path(conn, :espace_producteur))
else
_ ->
conn
|> put_flash(:error, dgettext("resource", "Could not delete the resource"))
|> redirect(to: page_path(conn, :espace_producteur))
end
end

defp get_resource(%Plug.Conn{} = conn, %{"dataset_id" => dataset_id, "resource_id" => _} = params) do
conn
|> assign_or_flash(
fn -> Datasets.get(dataset_id) end,
:dataset,
"Unable to get resources, please retry."
)
|> assign_or_flash(
fn -> Resources.get(params) end,
:resource,
"Unable to get resources, please retry."
)
end

defp get_resource(conn, _), do: conn
defp get_resource(%Plug.Conn{} = conn, _), do: conn

@doc """
`download` is in charge of downloading resources.
Expand Down
2 changes: 2 additions & 0 deletions apps/transport/lib/transport_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,8 @@ defmodule TransportWeb.Router do
post("/", ResourceController, :post_file)
get("/_new_resource/", ResourceController, :form)
get("/:resource_id/", ResourceController, :form)
get("/:resource_id/delete", ResourceController, :delete_resource_confirmation)
delete("/:resource_id/delete", ResourceController, :delete)
post("/:resource_id/", ResourceController, :post_file)
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,36 @@
<%= if @datasets == [] do %>
<%= dgettext("espace-producteurs", "You have no resource to update for the moment") %>
<% end %>
<%= for dataset <- @datasets do %>
<%= for dataset <- Enum.sort_by(@datasets, & &1.datagouv_title) do %>
<% dataset_path = dataset_path(@conn, :details, dataset.id)
nb_resources = dataset |> DB.Dataset.official_resources() |> Enum.count() %>
<div class="pt-24 panel dataset-item">
<strong><%= dataset.datagouv_title %></strong>
<h5>
<a href={dataset_path} target="_blank"><i class="icon fa fa-external-link" aria-hidden="true"></i></a>
<%= dataset.datagouv_title %>
</h5>
<hr class="mb-0" />
<div class="pt-6">
<%= dngettext("espace-producteurs", "1 resource", "%{count} resources", nb_resources) %>
</div>
<div class="pt-12">
<%= link(dgettext("espace-producteurs", "Update a resource"),
<%= link(dgettext("espace-producteurs", "Update"),
to: resource_path(@conn, :resources_list, dataset.datagouv_id),
class: "button-outline primary small"
class: "button-outline primary small",
"data-tracking-category": "espace_producteur",
"data-tracking-action": "update_resource_button"
) %>
<%= link(dgettext("espace-producteurs", "Add a resource"),
<%= link(dgettext("espace-producteurs", "Add"),
to: resource_path(@conn, :form, dataset.datagouv_id),
class: "button-outline secondary small"
class: "button-outline secondary small",
"data-tracking-category": "espace_producteur",
"data-tracking-action": "add_resource_button"
) %>
<%= link(dgettext("espace-producteurs", "Delete"),
to: resource_path(@conn, :resources_list, dataset.datagouv_id, %{"mode" => "delete"}),
class: "button-outline warning small",
"data-tracking-category": "espace_producteur",
"data-tracking-action": "delete_resource_button"
) %>
</div>
</div>
Expand Down Expand Up @@ -193,3 +212,5 @@
</div>
</section>
</div>

<script defer type="text/javascript" src={static_path(@conn, "/js/app.js")} />
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<% dataset_id = Map.fetch!(@conn.params, "dataset_id")
resource_id = Map.fetch!(@conn.params, "resource_id") %>
<section class="pt-48 pb-24">
<div class="container">
<%= breadcrumbs([@conn, :delete_resource, dataset_id]) %>
</div>
</section>
<section class="resource-update-section">
<div class="container pt-24">
<strong><%= @dataset["title"] %> > <%= @resource["title"] %></strong>
<%= form_for @conn, resource_path(@conn, :delete, dataset_id, resource_id), [method: "delete", class: "pt-48"], fn _ -> %>
<p class="notification warning">
<%= dgettext("resource", "Do you want to update the resource or delete it definitely?") %>
</p>
<div class="form-group">
<button
class="button warning"
type="submit"
data-tracking-category="espace_producteur"
data-tracking-action="confirm_delete_resource"
>
<%= dgettext("resource", "Delete the resource") %>
</button>
<a href={resource_path(@conn, :form, dataset_id, resource_id)}>
<button
class="button-outline primary"
type="button"
data-tracking-category="espace_producteur"
data-tracking-action="abort_delete_update_resource"
>
<%= dgettext("resource", "Update the resource") %>
</button>
</a>
</div>
<% end %>
</div>
</section>

<script defer type="text/javascript" src={static_path(@conn, "/js/app.js")} />
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
<% mode = Map.get(@conn.params, "mode", "update") %>
<section class="pt-48">
<div class="container pb-24">
<%= breadcrumbs([@conn, :select_resource, @dataset["id"]]) %>
Expand All @@ -6,24 +7,28 @@
<section class="resource-update-section">
<div class="container">
<div class="pt-24">
<strong>
<%= @dataset["datagouv_title"] %>
</strong>
<div>
<%= link(dgettext("resource", "Visit the dataset page"), to: "/datasets/#{@dataset["id"]}") %>
</div>
<strong><%= @dataset["title"] %></strong>
<div class="pt-24">
<%= dgettext("resource", "Choose the resource you want to update") %> :
<p :if={mode == "update"}><%= dgettext("resource", "Choose the resource you want to update") %></p>
<p :if={mode == "delete"}><%= dgettext("resource", "Choose the resource you want to delete") %></p>
</div>
</div>
<div class="resources-update-list pt-24">
<%= for resource <- @dataset["resources"] do %>
<a href={resource_path(@conn, :form, @conn.params["dataset_id"], resource["id"])}>
<%= for resource <- Enum.sort_by(@dataset["resources"], & &1["title"]) do %>
<a :if={mode == "update"} href={resource_path(@conn, :form, @conn.params["dataset_id"], resource["id"])}>
<div class="panel">
<img height="20" src={static_path(@conn, "/images/producteurs/picto-maj.png")} alt="" />
<strong><%= resource["title"] %></strong>
</div>
</a>
<a
:if={mode == "delete"}
href={resource_path(@conn, :delete_resource_confirmation, @conn.params["dataset_id"], resource["id"])}
>
<div class="panel">
<strong><%= resource["title"] %></strong>
</div>
</a>
<% end %>
</div>
</div>
Expand Down
9 changes: 9 additions & 0 deletions apps/transport/lib/transport_web/views/bread_crumbs.ex
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,15 @@ defmodule TransportWeb.BreadCrumbs do
]
end

def crumbs(conn, :delete_resource, id) do
crumbs(conn, :espace_producteur) ++
[
{dgettext("espace-producteurs", "Select a resource"),
resource_path(conn, :resources_list, id, %{"mode" => "delete"})},
{dgettext("espace-producteurs", "Delete a resource"), nil}
]
end

def crumbs(conn, :update_resource, id) do
crumbs(conn, :select_resource, id) ++
[
Expand Down
26 changes: 22 additions & 4 deletions apps/transport/priv/gettext/en/LC_MESSAGES/espace-producteurs.po
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,6 @@ msgstr ""
"Language: en\n"
"Plural-Forms: nplurals=2; plural=(n != 1);"

#, elixir-autogen, elixir-format
msgid "Add a resource"
msgstr ""

#, elixir-autogen, elixir-format
msgid "Adding a dataset guidelines"
msgstr ""
Expand Down Expand Up @@ -186,3 +182,25 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Your proxy statistics"
msgstr ""

#, elixir-autogen, elixir-format, fuzzy
msgid "Delete a resource"
msgstr ""

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

#, elixir-autogen, elixir-format, fuzzy
msgid "Delete"
msgstr ""

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

#, elixir-autogen, elixir-format, fuzzy
msgid "1 resource"
msgid_plural "%{count} resources"
msgstr[0] ""
msgstr[1] ""
24 changes: 20 additions & 4 deletions apps/transport/priv/gettext/en/LC_MESSAGES/resource.po
Original file line number Diff line number Diff line change
Expand Up @@ -109,10 +109,6 @@ msgstr ""
msgid "Example : Paris GTFS dataset"
msgstr ""

#, elixir-autogen, elixir-format
msgid "Visit the dataset page"
msgstr ""

#, elixir-autogen, elixir-format
msgid "Resource is not available on remote server"
msgstr ""
Expand Down Expand Up @@ -172,3 +168,23 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "If you haven’t done it yet, think about <a href=\"%{link}\">validating your data</a> before publishing it."
msgstr ""

#, elixir-autogen, elixir-format, fuzzy
msgid "Choose the resource you want to delete"
msgstr ""

#, elixir-autogen, elixir-format
msgid "Could not delete the resource"
msgstr ""

#, elixir-autogen, elixir-format
msgid "Delete the resource"
msgstr ""

#, elixir-autogen, elixir-format
msgid "Do you want to update the resource or delete it definitely?"
msgstr ""

#, elixir-autogen, elixir-format
msgid "The resource has been deleted"
msgstr ""
26 changes: 22 additions & 4 deletions apps/transport/priv/gettext/espace-producteurs.pot
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,6 @@
msgid ""
msgstr ""

#, elixir-autogen, elixir-format
msgid "Add a resource"
msgstr ""

#, elixir-autogen, elixir-format
msgid "Adding a dataset guidelines"
msgstr ""
Expand Down Expand Up @@ -185,3 +181,25 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "Your proxy statistics"
msgstr ""

#, elixir-autogen, elixir-format
msgid "Delete a resource"
msgstr ""

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

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

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

#, elixir-autogen, elixir-format
msgid "1 resource"
msgid_plural "%{count} resources"
msgstr[0] ""
msgstr[1] ""
Loading

0 comments on commit c296972

Please sign in to comment.