Skip to content

Commit 3c3e83c

Browse files
committed
Add item endpoint
Create item controller to link items to lists
1 parent 13e3c6b commit 3c3e83c

6 files changed

Lines changed: 40 additions & 1 deletion

File tree

lib/app/item.ex

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ defmodule App.Item do
33
import Ecto.Changeset
44
import Ecto.Query
55
alias App.{Repo, Tag, ItemTag, Person}
6+
alias App.List, as: L
67
alias __MODULE__
78

89
schema "items" do
@@ -11,12 +12,13 @@ defmodule App.Item do
1112

1213
belongs_to :people, Person, references: :person_id, foreign_key: :person_id
1314
many_to_many(:tags, Tag, join_through: ItemTag, on_replace: :delete)
15+
many_to_many(:lists, L, join_through: "items_lists", on_replace: :delete)
1416

1517
timestamps()
1618
end
1719

1820
@doc false
19-
def changeset(item, attrs) do
21+
def changeset(item, attrs \\ %{}) do
2022
item
2123
|> cast(attrs, [:person_id, :status, :text])
2224
|> validate_required([:text, :person_id])
@@ -69,6 +71,7 @@ defmodule App.Item do
6971
Item
7072
|> Repo.get!(id)
7173
|> Repo.preload(tags: from(t in Tag, order_by: t.text))
74+
|> Repo.preload(lists: from(l in L, order_by: l.name))
7275
end
7376

7477
@doc """
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
defmodule AppWeb.ItemController do
2+
use AppWeb, :controller
3+
alias App.{Item, List}
4+
# plug :permission_tag when action in [:edit, :update, :delete]
5+
6+
def edit(conn, %{"id" => id}) do
7+
person_id = conn.assigns[:person][:id] || 0
8+
9+
item = Item.get_item!(id)
10+
lists = List.list_person_lists(person_id)
11+
12+
changeset = Item.changeset(item)
13+
render(conn, "edit.html", item: item, lists: lists, changeset: changeset)
14+
end
15+
end

lib/app_web/live/app_live.html.heex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,10 @@
258258
<%= live_patch tag.text, to: Routes.live_path(@socket, AppWeb.AppLive, %{filter_by: @filter, filter_by_tag: tag.text}), style: "background-color:#{tag.color}", class: " text-white font-bold py-1 px-2 rounded-full" %>
259259
<% end %>
260260
</div>
261+
262+
<div class="ml-2 my-2">
263+
<.a to={Routes.item_path(@socket, :edit, item.id)} class="" label="Edit lists" />
264+
</div>
261265
<% end %>
262266
<% end %><!-- end for item <- @items -->
263267
</ul>

lib/app_web/router.ex

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ defmodule AppWeb.Router do
3434
resources "/lists", ListController, except: [:show]
3535
get "/login", AuthController, :login
3636
get "/logout", AuthController, :logout
37+
38+
# edit item lists
39+
resources "/items", ItemController, only: [:edit, :update]
3740
end
3841

3942
# assign to conn the loggedin value used in templates
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
edit item
2+
3+
<.form let={f} for={@changeset} action="" method="patch" class="py-3">
4+
<%= if @changeset.action do %>
5+
<div class="alert alert-danger">
6+
<p>Oops, something went wrong! Please check the errors below.</p>
7+
</div>
8+
<% end %>
9+
10+
<.button type="submit" label="Save" />
11+
</.form>

lib/app_web/views/item_view.ex

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
defmodule AppWeb.ItemView do
2+
use AppWeb, :view
3+
end

0 commit comments

Comments
 (0)