Added controller actions and UI for editing a media item
This commit is contained in:
parent
6e0bdee5b6
commit
2c30615c89
7 changed files with 105 additions and 1 deletions
|
|
@ -16,6 +16,27 @@ defmodule PinchflatWeb.MediaItems.MediaItemController do
|
||||||
render(conn, :show, media_item: media_item)
|
render(conn, :show, media_item: media_item)
|
||||||
end
|
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
|
def delete(conn, %{"id" => id} = params) do
|
||||||
prevent_download = Map.get(params, "prevent_download", false)
|
prevent_download = Map.get(params, "prevent_download", false)
|
||||||
media_item = Media.get_media_item!(id)
|
media_item = Media.get_media_item!(id)
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,14 @@ defmodule PinchflatWeb.MediaItems.MediaItemHTML do
|
||||||
|
|
||||||
embed_templates "media_item_html/*"
|
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
|
def media_file_exists?(media_item) do
|
||||||
!!media_item.media_filepath and File.exists?(media_item.media_filepath)
|
!!media_item.media_filepath and File.exists?(media_item.media_filepath)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
<div class="mb-6 flex gap-3 flex-row items-center">
|
||||||
|
<h2 class="text-title-md2 font-bold text-black dark:text-white ml-4">
|
||||||
|
Editing "<%= StringUtils.truncate(@media_item.title, 35) %>"
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="rounded-sm border border-stroke bg-white px-5 pb-2.5 pt-6 shadow-default dark:border-strokedark dark:bg-boxdark sm:px-7.5 xl:pb-1">
|
||||||
|
<div class="max-w-full overflow-x-auto">
|
||||||
|
<div class="flex flex-col gap-10">
|
||||||
|
<.media_item_form changeset={@changeset} action={~p"/sources/#{@media_item.source_id}/media/#{@media_item}"} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
@ -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.
|
||||||
|
</.error>
|
||||||
|
|
||||||
|
<h3 class=" text-2xl text-black dark:text-white">
|
||||||
|
General Options
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<.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</.button>
|
||||||
|
</.simple_form>
|
||||||
|
|
@ -7,6 +7,14 @@
|
||||||
<%= StringUtils.truncate(@media_item.title, 35) %>
|
<%= StringUtils.truncate(@media_item.title, 35) %>
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<nav>
|
||||||
|
<.link href={~p"/sources/#{@media_item.source_id}/media/#{@media_item}/edit"}>
|
||||||
|
<.button color="bg-primary" rounding="rounded-lg">
|
||||||
|
<.icon name="hero-pencil-square" class="mr-2" /> Edit
|
||||||
|
</.button>
|
||||||
|
</.link>
|
||||||
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
<div class="rounded-sm border border-stroke bg-white py-5 pt-6 shadow-default dark:border-strokedark dark:bg-boxdark px-7.5">
|
<div class="rounded-sm border border-stroke bg-white py-5 pt-6 shadow-default dark:border-strokedark dark:bg-boxdark px-7.5">
|
||||||
<div class="max-w-full overflow-x-auto">
|
<div class="max-w-full overflow-x-auto">
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ defmodule PinchflatWeb.Router do
|
||||||
resources "/search", Searches.SearchController, only: [:show], singleton: true
|
resources "/search", Searches.SearchController, only: [:show], singleton: true
|
||||||
|
|
||||||
resources "/sources", Sources.SourceController do
|
resources "/sources", Sources.SourceController do
|
||||||
resources "/media", MediaItems.MediaItemController, only: [:show, :delete]
|
resources "/media", MediaItems.MediaItemController, only: [:show, :edit, :update, :delete]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,36 @@ defmodule PinchflatWeb.MediaItemControllerTest do
|
||||||
end
|
end
|
||||||
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
|
describe "delete media" do
|
||||||
setup do
|
setup do
|
||||||
media_item = media_item_with_attachments()
|
media_item = media_item_with_attachments()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue