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() %>
+ <%= dgettext("resource", "Do you want to update the resource or delete it definitely?") %> +
+<%= dgettext("resource", "Choose the resource you want to update") %>
+<%= dgettext("resource", "Choose the resource you want to delete") %>
validating your data before publishing it."
msgstr "Si vous ne l’avez pas encore fait, pensez à valider vos données avant de les publier."
+
+#, elixir-autogen, elixir-format
+msgid "Choose the resource you want to delete"
+msgstr "Choisissez la ressource à supprimer"
+
+#, elixir-autogen, elixir-format
+msgid "Could not delete the resource"
+msgstr "Impossible de supprimer la ressource"
+
+#, elixir-autogen, elixir-format
+msgid "Delete the resource"
+msgstr "Supprimer la ressource"
+
+#, elixir-autogen, elixir-format
+msgid "Do you want to update the resource or delete it definitely?"
+msgstr "Souhaitez-vous mettre à jour la ressource ou la supprimer définitivement ?"
+
+#, elixir-autogen, elixir-format
+msgid "The resource has been deleted"
+msgstr "La ressource a été supprimée"
diff --git a/apps/transport/priv/gettext/resource.pot b/apps/transport/priv/gettext/resource.pot
index ffa8e9dc57..839acd7974 100644
--- a/apps/transport/priv/gettext/resource.pot
+++ b/apps/transport/priv/gettext/resource.pot
@@ -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 ""
@@ -172,3 +168,23 @@ msgstr ""
#, elixir-autogen, elixir-format
msgid "If you haven’t done it yet, think about validating your data before publishing it."
msgstr ""
+
+#, elixir-autogen, elixir-format
+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 ""
diff --git a/apps/transport/test/transport_web/controllers/page_controller_test.exs b/apps/transport/test/transport_web/controllers/page_controller_test.exs
index a974eb8975..5aad78009d 100644
--- a/apps/transport/test/transport_web/controllers/page_controller_test.exs
+++ b/apps/transport/test/transport_web/controllers/page_controller_test.exs
@@ -81,7 +81,10 @@ defmodule TransportWeb.PageControllerTest do
{:ok, doc} = conn |> html_response(200) |> Floki.parse_document()
assert Floki.find(doc, ".message--error") == []
- assert doc |> Floki.find(".dataset-item strong") |> Enum.map(&Floki.text(&1)) == [datagouv_title]
+
+ assert doc |> Floki.find(".dataset-item h5") |> Enum.map(&(&1 |> Floki.text() |> String.trim())) == [
+ datagouv_title
+ ]
end
test "with an OAuth2 error", %{conn: conn} do