diff --git a/lib/pinchflat_web/controllers/media_items/media_item_controller.ex b/lib/pinchflat_web/controllers/media_items/media_item_controller.ex index 2aac648..d054564 100644 --- a/lib/pinchflat_web/controllers/media_items/media_item_controller.ex +++ b/lib/pinchflat_web/controllers/media_items/media_item_controller.ex @@ -16,6 +16,27 @@ defmodule PinchflatWeb.MediaItems.MediaItemController do render(conn, :show, media_item: media_item) end + def edit(conn, %{"id" => id}) do + media_item = Media.get_media_item!(id) + changeset = Media.change_media_item(media_item) + + render(conn, :edit, media_item: media_item, changeset: changeset) + end + + def update(conn, %{"id" => id, "media_item" => params}) do + media_item = Media.get_media_item!(id) + + case Media.update_media_item(media_item, params) do + {:ok, media_item} -> + conn + |> put_flash(:info, "Media Item updated successfully.") + |> redirect(to: ~p"/sources/#{media_item.source_id}/media/#{media_item}") + + {:error, %Ecto.Changeset{} = changeset} -> + render(conn, :edit, media_item: media_item, changeset: changeset) + end + end + def delete(conn, %{"id" => id} = params) do prevent_download = Map.get(params, "prevent_download", false) media_item = Media.get_media_item!(id) diff --git a/lib/pinchflat_web/controllers/media_items/media_item_html.ex b/lib/pinchflat_web/controllers/media_items/media_item_html.ex index 12d7ffa..659e742 100644 --- a/lib/pinchflat_web/controllers/media_items/media_item_html.ex +++ b/lib/pinchflat_web/controllers/media_items/media_item_html.ex @@ -3,6 +3,14 @@ defmodule PinchflatWeb.MediaItems.MediaItemHTML do embed_templates "media_item_html/*" + @doc """ + Renders a media item form. + """ + attr :changeset, Ecto.Changeset, required: true + attr :action, :string, required: true + + def media_item_form(assigns) + def media_file_exists?(media_item) do !!media_item.media_filepath and File.exists?(media_item.media_filepath) end diff --git a/lib/pinchflat_web/controllers/media_items/media_item_html/edit.html.heex b/lib/pinchflat_web/controllers/media_items/media_item_html/edit.html.heex new file mode 100644 index 0000000..5b1818c --- /dev/null +++ b/lib/pinchflat_web/controllers/media_items/media_item_html/edit.html.heex @@ -0,0 +1,13 @@ +
+

+ Editing "<%= StringUtils.truncate(@media_item.title, 35) %>" +

+
+ +
+
+
+ <.media_item_form changeset={@changeset} action={~p"/sources/#{@media_item.source_id}/media/#{@media_item}"} /> +
+
+
diff --git a/lib/pinchflat_web/controllers/media_items/media_item_html/media_item_form.html.heex b/lib/pinchflat_web/controllers/media_items/media_item_html/media_item_form.html.heex new file mode 100644 index 0000000..acfa301 --- /dev/null +++ b/lib/pinchflat_web/controllers/media_items/media_item_html/media_item_form.html.heex @@ -0,0 +1,24 @@ +<.simple_form + :let={f} + for={@changeset} + action={@action} + x-data="{ advancedMode: !!JSON.parse(localStorage.getItem('advancedMode')) }" + x-init="$watch('advancedMode', value => localStorage.setItem('advancedMode', JSON.stringify(value)))" +> + <.error :if={@changeset.action}> + Oops, something went wrong! Please check the errors below. + + +

+ General Options +

+ + <.input + field={f[:prevent_download]} + type="toggle" + label="Prevent Download" + help="Checking excludes this media item from being downloaded" + /> + + <.button class="my-10 sm:mb-7.5 w-full sm:w-auto" rounding="rounded-lg">Save Media Item + diff --git a/lib/pinchflat_web/controllers/media_items/media_item_html/show.html.heex b/lib/pinchflat_web/controllers/media_items/media_item_html/show.html.heex index d325f6f..6de101f 100644 --- a/lib/pinchflat_web/controllers/media_items/media_item_html/show.html.heex +++ b/lib/pinchflat_web/controllers/media_items/media_item_html/show.html.heex @@ -7,6 +7,14 @@ <%= StringUtils.truncate(@media_item.title, 35) %> + +
diff --git a/lib/pinchflat_web/router.ex b/lib/pinchflat_web/router.ex index 202f460..e56a4f2 100644 --- a/lib/pinchflat_web/router.ex +++ b/lib/pinchflat_web/router.ex @@ -32,7 +32,7 @@ defmodule PinchflatWeb.Router do resources "/search", Searches.SearchController, only: [:show], singleton: true resources "/sources", Sources.SourceController do - resources "/media", MediaItems.MediaItemController, only: [:show, :delete] + resources "/media", MediaItems.MediaItemController, only: [:show, :edit, :update, :delete] end end diff --git a/test/pinchflat_web/controllers/media_item_controller_test.exs b/test/pinchflat_web/controllers/media_item_controller_test.exs index c1beed0..e8e035a 100644 --- a/test/pinchflat_web/controllers/media_item_controller_test.exs +++ b/test/pinchflat_web/controllers/media_item_controller_test.exs @@ -15,6 +15,36 @@ defmodule PinchflatWeb.MediaItemControllerTest do end end + describe "edit media" do + setup [:create_media_item] + + test "renders form for editing chosen media_item", %{conn: conn, media_item: media_item} do + conn = get(conn, ~p"/sources/#{media_item.source_id}/media/#{media_item}/edit") + + assert html_response(conn, 200) =~ "Editing" + end + end + + describe "update media" do + setup [:create_media_item] + + test "redirects when data is valid", %{conn: conn, media_item: media_item} do + update_attrs = %{title: "New Title"} + + conn = put(conn, ~p"/sources/#{media_item.source_id}/media/#{media_item}", media_item: update_attrs) + assert redirected_to(conn) == ~p"/sources/#{media_item.source_id}/media/#{media_item}" + + conn = get(conn, ~p"/sources/#{media_item.source_id}/media/#{media_item}") + assert html_response(conn, 200) =~ update_attrs[:title] + end + + test "renders errors when data is invalid", %{conn: conn, media_item: media_item} do + conn = put(conn, ~p"/sources/#{media_item.source_id}/media/#{media_item}", media_item: %{title: nil}) + + assert html_response(conn, 200) =~ "Editing" + end + end + describe "delete media" do setup do media_item = media_item_with_attachments()