Skip to content

Commit

Permalink
Add lists to group
Browse files Browse the repository at this point in the history
Create group_list_controller to add lists to groups
  • Loading branch information
SimonLab committed Oct 10, 2022
1 parent 8eced81 commit 3f66294
Show file tree
Hide file tree
Showing 7 changed files with 94 additions and 12 deletions.
15 changes: 15 additions & 0 deletions lib/app/group.ex
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,14 @@ defmodule App.Group do
|> validate_required([:name])
end

def changeset_with_lists(group, list_ids) do
lists = Repo.all(from l in List, where: l.id in ^list_ids)

group
|> change()
|> put_assoc(:lists, lists)
end

def create_group(person_id, attrs) do
person = Person.get_person!(person_id)

Expand All @@ -38,5 +46,12 @@ defmodule App.Group do
Group
|> Repo.get!(id)
|> Repo.preload(people: from(p in Person, order_by: p.name))
|> Repo.preload(lists: from(l in List, order_by: l.name))
end

def update_group_with_lists(%Group{} = group, list_ids) do
group
|> Group.changeset_with_lists(list_ids)
|> Repo.update()
end
end
47 changes: 47 additions & 0 deletions lib/app_web/controllers/group_list_controller.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
defmodule AppWeb.GroupListController do
use AppWeb, :controller
alias App.{Group, List}

def index(conn, %{"group_id" => group_id}) do
person_id = conn.assigns[:person][:id]
group = Group.get_group!(group_id)

lists =
List.list_person_lists(person_id)
|> Enum.concat(group.lists)
|> Enum.uniq_by(& &1.id)
|> Enum.map(&{&1.name, &1.id})

selected_list_ids = Enum.map(group.lists, & &1.id)

data = %{}
types = %{selected_lists: {:array, :string}}
params = %{selected_lists: selected_list_ids}

changeset =
{data, types}
|> Ecto.Changeset.cast(params, Map.keys(types))

render(conn, "index.html",
group: group,
lists: lists,
changeset: changeset
)
end

def create(conn, %{"group_id" => group_id} = params) do
group = Group.get_group!(group_id)

list_ids =
case params["group_lists"]["selected_lists"] do
"" -> []
ids -> ids
end

{:ok, _group} = Group.update_group_with_lists(group, list_ids)

conn
|> put_flash(:info, "Group's lists updated successfully.")
|> redirect(to: Routes.group_path(conn, :index))
end
end
13 changes: 7 additions & 6 deletions lib/app_web/controllers/group_member_controller.ex
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
defmodule AppWeb.GroupMemberController do
use AppWeb, :controller
alias App.{Group, Person}
alias App.{Group, Person, Repo}
import Ecto.Changeset

# plug :permission_tag when action in [:edit, :update, :delete]

def index(conn, %{"group_id" => group_id}) do
group = Group.get_group!(group_id)
changeset = Person.changeset(%Person{})
# person_id = conn.assigns[:person][:id] || 0
# tags = Tag.list_person_tags(person_id)

render(conn, "index.html", changeset: changeset, group: group)
end
Expand All @@ -22,12 +18,17 @@ defmodule AppWeb.GroupMemberController do
changeset =
%Person{name: name}
|> change()
|> add_error(:name, "This name doesn't seem to exist")
|> add_error(:name, "Person's name not found")
|> Map.put(:action, :insert)

render(conn, "index.html", changeset: changeset, group: group)

person ->
group
|> change()
|> put_assoc(:people, [person | group.people])
|> Repo.update()

redirect(conn,
to: Routes.group_group_member_path(conn, :index, group_id)
)
Expand Down
6 changes: 1 addition & 5 deletions lib/app_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,10 @@ defmodule AppWeb.Router do
# manage groups
resources "/groups", GroupController, except: [:show]

# edit and update list to group
resources "/groups", GroupController, only: [:show] do
resources "/lists", GroupListController, only: [:edit, :update]
end

# edit and update group members
resources "/groups", GroupController, only: [:show] do
resources "/members", GroupMemberController, only: [:index, :create]
resources "/lists", GroupListController, only: [:index, :create]
end
end

Expand Down
2 changes: 1 addition & 1 deletion lib/app_web/templates/group/index.html.heex
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<%= link "Members", to: Routes.group_group_member_path(@conn, :index, group) %>
</.td>
<.td>
<%= link "Lists", to: Routes.group_path(@conn, :edit, group) %>
<%= link "Lists", to: Routes.group_group_list_path(@conn, :index, group) %>
</.td>
<.td>
<%= link "Edit", to: Routes.group_path(@conn, :edit, group) %>
Expand Down
20 changes: 20 additions & 0 deletions lib/app_web/templates/group_list/index.html.heex
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<.container>
<.h2 class="text-center mt-3">Edit Group's lists</.h2>

<.form let={f} for={@changeset} action={Routes.group_group_list_path(@conn, :create, @group)} as={:group_lists} class="py-3">
<%= if @changeset.action do %>
<div class="alert alert-danger">
<p>Oops, something went wrong! Please check the errors below.</p>
</div>
<% end %>

<.form_field
type="checkbox_group"
form={f}
field={:selected_lists}
label="Lists"
options={@lists}
/>
<.button type="submit" label="Save" />
</.form>
</.container>
3 changes: 3 additions & 0 deletions lib/app_web/views/group_list_view.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
defmodule AppWeb.GroupListView do
use AppWeb, :view
end

0 comments on commit 3f66294

Please sign in to comment.