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()