diff --git a/apps/datagouvfr/lib/datagouvfr/client/resources.ex b/apps/datagouvfr/lib/datagouvfr/client/resources.ex index 667ce4d8db..aced411baa 100644 --- a/apps/datagouvfr/lib/datagouvfr/client/resources.ex +++ b/apps/datagouvfr/lib/datagouvfr/client/resources.ex @@ -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 diff --git a/apps/transport/client/javascripts/app.js b/apps/transport/client/javascripts/app.js index 545b561aab..1b5b0797ee 100644 --- a/apps/transport/client/javascripts/app.js +++ b/apps/transport/client/javascripts/app.js @@ -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 diff --git a/apps/transport/client/stylesheets/espace_producteur.scss b/apps/transport/client/stylesheets/espace_producteur.scss index b7cb14225c..b7a624aa4b 100644 --- a/apps/transport/client/stylesheets/espace_producteur.scss +++ b/apps/transport/client/stylesheets/espace_producteur.scss @@ -109,8 +109,8 @@ } } .dataset-item { - a:nth-child(1) { - margin-right: 12px; + .button-outline { + margin-right: 5px; } } } diff --git a/apps/transport/lib/transport_web/controllers/resource_controller.ex b/apps/transport/lib/transport_web/controllers/resource_controller.ex index 2e482c90ed..33f598624f 100644 --- a/apps/transport/lib/transport_web/controllers/resource_controller.ex +++ b/apps/transport/lib/transport_web/controllers/resource_controller.ex @@ -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 @@ -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. diff --git a/apps/transport/lib/transport_web/router.ex b/apps/transport/lib/transport_web/router.ex index 8c565073f8..499099739e 100644 --- a/apps/transport/lib/transport_web/router.ex +++ b/apps/transport/lib/transport_web/router.ex @@ -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 diff --git a/apps/transport/lib/transport_web/templates/page/espace_producteur.html.heex b/apps/transport/lib/transport_web/templates/page/espace_producteur.html.heex index aa04a7face..597a821382 100644 --- a/apps/transport/lib/transport_web/templates/page/espace_producteur.html.heex +++ b/apps/transport/lib/transport_web/templates/page/espace_producteur.html.heex @@ -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() %>
- <%= dataset.datagouv_title %> +
+ + <%= dataset.datagouv_title %> +
+
+
+ <%= dngettext("espace-producteurs", "1 resource", "%{count} resources", nb_resources) %> +
- <%= 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" ) %>
@@ -193,3 +212,5 @@ + +