Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

13 test drive phx live #14

Open
wants to merge 11 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions config/config.exs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ config :logger, :console,
# Use Jason for JSON parsing in Phoenix
config :phoenix, :json_library, Jason

config :phoenix,
template_engines: [leex: Phoenix.LiveView.Engine]

# Import environment specific config. This must remain at the bottom
# of this file so it overrides the configuration defined above.
import_config "#{Mix.env()}.exs"
33 changes: 33 additions & 0 deletions lib/re_tither/accounts/accounts.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
defmodule ReTither.Accounts do
@moduledoc """
Accounts context
"""
alias ReTither.Accounts.User
alias ReTither.Repo

def create_user(attrs \\ %{}) do
%User{}
|> User.changeset(attrs)
|> Repo.insert()
end

def change_user(%User{} = user, attrs \\ %{}) do
User.changeset(user, attrs)
end

def list_users do
Repo.all(User)
end

def update_user(%User{} = user, attrs) do
user
|> User.changeset(attrs)
|> Repo.update()
end

def get_user!(id), do: Repo.get!(User, id)

def delete_user(%User{} = user) do
Repo.delete(user)
end
end
24 changes: 24 additions & 0 deletions lib/re_tither/accounts/user.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
defmodule ReTither.Accounts.User do
@moduledoc """
User Schema
"""
use Ecto.Schema
import Ecto.Changeset

schema "users" do
field :user_name, :string
field :email, :string
field :phone_number, :string
timestamps()
end

def changeset(user, attrs \\ %{}) do
user
|> cast(attrs, [
:user_name,
:email,
:phone_number
])
|> validate_required([:phone_number, :user_name, :email])
end
end
45 changes: 45 additions & 0 deletions lib/re_tither_web/live/edit.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
defmodule ReTitherWeb.UserLive.Edit do
@moduledoc """
Edit User LiveView Module
"""
use Phoenix.LiveView

alias ReTither.Accounts
alias ReTitherWeb.Router.Helpers, as: Routes
alias ReTitherWeb.UserLive
alias ReTitherWeb.UserView

def mount(%{path_params: %{"id" => id}}, socket) do
user = Accounts.get_user!(id)

{:ok,
assign(socket, %{
user: user,
changeset: Accounts.change_user(user)
})}
end

def render(assigns), do: UserView.render("edit.html", assigns)

def handle_event("validate", %{"user" => params}, socket) do
changeset =
socket.assigns.user
|> Accounts.change_user(params)
|> Map.put(:action, :update)

{:noreply, assign(socket, changeset: changeset)}
end

def handle_event("save", %{"user" => user_params}, socket) do
case Accounts.update_user(socket.assigns.user, user_params) do
{:ok, user} ->
{:stop,
socket
|> put_flash(:info, "User updated successfully.")
|> redirect(to: Routes.live_path(socket, UserLive.Show, user))}

{:error, %Ecto.Changeset{} = changeset} ->
{:noreply, assign(socket, changeset: changeset)}
end
end
end
25 changes: 25 additions & 0 deletions lib/re_tither_web/live/index.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
defmodule ReTitherWeb.UserLive.Index do
@moduledoc """
List all Users LiveView Module
"""
use Phoenix.LiveView

alias ReTither.Accounts
alias ReTitherWeb.UserView

def mount(_session, socket) do
{:ok, fetch(socket)}
end

def render(assigns), do: UserView.render("index.html", assigns)

defp fetch(socket) do
assign(socket, users: Accounts.list_users())
end

def handle_event("delete_user", id, socket) do
user = Accounts.get_user!(id)
{:ok, _user} = Accounts.delete_user(user)
{:noreply, fetch(socket)}
end
end
43 changes: 43 additions & 0 deletions lib/re_tither_web/live/new.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
defmodule ReTitherWeb.UserLive.New do
@moduledoc """
New User LiveView Module
"""
use Phoenix.LiveView

alias ReTither.Accounts
alias ReTither.Accounts.User
alias ReTitherWeb.Router.Helpers, as: Routes
alias ReTitherWeb.UserLive
alias ReTitherWeb.UserView

def mount(_session, socket) do
{:ok,
assign(socket, %{
changeset: Accounts.change_user(%User{})
})}
end

def render(assigns), do: UserView.render("new.html", assigns)

def handle_event("validate", %{"user" => params}, socket) do
changeset =
%User{}
|> Accounts.change_user(params)
|> Map.put(:action, :insert)

{:noreply, assign(socket, changeset: changeset)}
end

def handle_event("save", %{"user" => user_params}, socket) do
case Accounts.create_user(user_params) do
{:ok, user} ->
{:stop,
socket
|> put_flash(:info, "User created successfully.")
|> redirect(to: Routes.live_path(socket, UserLive.Show, user))}

{:error, %Ecto.Changeset{} = changeset} ->
{:noreply, assign(socket, changeset: changeset)}
end
end
end
21 changes: 21 additions & 0 deletions lib/re_tither_web/live/show.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
defmodule ReTitherWeb.UserLive.Show do
@moduledoc """
Show User LiveView Module
"""
use Phoenix.LiveView
use Phoenix.HTML

alias Phoenix.LiveView.Socket
alias ReTither.Accounts
alias ReTitherWeb.UserView

def render(assigns), do: UserView.render("show.html", assigns)

def mount(%{path_params: %{"id" => id}}, socket) do
{:ok, fetch(assign(socket, id: id))}
end

defp fetch(%Socket{assigns: %{id: id}} = socket) do
assign(socket, user: Accounts.get_user!(id))
end
end
4 changes: 4 additions & 0 deletions lib/re_tither_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ defmodule ReTitherWeb.Router do
pipe_through :browser

get "/", PageController, :index
live "/users/new", UserLive.New
live "/user/index", UserLive.Index
live "/users/:id", UserLive.Show
live "/users/:id/edit", UserLive.Edit
end

# Other scopes may use custom stacks.
Expand Down
5 changes: 5 additions & 0 deletions lib/re_tither_web/templates/user/edit.html.leex
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<h1>Edit User</h1>

<%= render "form.html", assigns %>

<span><%= link "Back", to: Routes.live_path(@socket, UserLive.Index) %></span>
17 changes: 17 additions & 0 deletions lib/re_tither_web/templates/user/form.html.leex
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<%= f = form_for @changeset, "#", [phx_change: :validate, phx_submit: :save] %>
<%= label f, :User_Name %>
<%= text_input f, :user_name %>
<%= error_tag f, :user_name %>

<%= label f, :Email %>
<%= text_input f, :email%>
<%= error_tag f, :email%>

<%= label f, :phone_number %>
<%= text_input f, :phone_number %>
<%= error_tag f, :phone_number %>

<div>
<%= submit "Save", phx_disable_with: "Saving..." %>
</div>
</form>
33 changes: 33 additions & 0 deletions lib/re_tither_web/templates/user/index.html.leex
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<h1>All Users</h1>

<table>
<thead>
<tr>
<th>User name</th>
<th>Email</th>
<th>Phone number</th>

<th></th>
</tr>
</thead>
<tbody>
<%= for user <- @users do %>
<tr>
<td><%= user.user_name %></td>
<td><%= user.email %></td>
<td><%= user.phone_number %></td>

<td>
<%= link "Show", to: Routes.live_path(@socket, UserLive.Show, user) %>
<%= link "Edit", to: Routes.live_path(@socket, UserLive.Edit, user) %>
<%= link "Delete", to: '#',
phx_click: "delete_user",
phx_value: user.id,
data: [confirm: "Are you sure?"] %>
</td>
</tr>
<% end %>
</tbody>
</table>

<span><%= link "New User", to: Routes.live_path(@socket, UserLive.New) %></span>
5 changes: 5 additions & 0 deletions lib/re_tither_web/templates/user/new.html.leex
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<h2 phx-click="here">Create Your Account</h2>

<%= render "form.html", assigns %>

<span><%= link "All User", to: Routes.live_path(@socket, UserLive.Index) %></span>
23 changes: 23 additions & 0 deletions lib/re_tither_web/templates/user/show.html.leex
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<h1>User Details</h1>

<ul>

<li>
<strong>User Name:</strong>
<%= @user.user_name %>
</li>

<li>
<strong>User name:</strong>
<%= @user.email %>
</li>

<li>
<strong>Phone number:</strong>
<%= @user.phone_number %>
</li>

</ul>

<span><%= link "Edit", to: Routes.live_path(@socket, UserLive.Edit, @user) %></span>
<span><%= link "Back", to: Routes.live_path(@socket, UserLive.Index) %></span>
5 changes: 5 additions & 0 deletions lib/re_tither_web/views/user_view.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
defmodule ReTitherWeb.UserView do
use ReTitherWeb, :view

alias ReTitherWeb.UserLive
end
13 changes: 13 additions & 0 deletions priv/repo/migrations/20190522115413_create_user.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
defmodule ReTither.Repo.Migrations.CreateUser do
use Ecto.Migration

def change do
create table(:users) do
add(:user_name, :string, null: false)
add(:email, :string, null: false)
add(:phone_number, :string, null: false)

timestamps()
end
end
end