form.ex (3519B)
1 defmodule DailyTrackerWeb.EntryLive.Form do 2 use DailyTrackerWeb, :live_view 3 4 alias DailyTracker.Tracker 5 alias DailyTracker.Tracker.Entry 6 7 @impl true 8 def render(assigns) do 9 ~H""" 10 <Layouts.app flash={@flash}> 11 <.header> 12 {@page_title} 13 <:subtitle>Use this form to manage entry records in your database.</:subtitle> 14 </.header> 15 16 <.form for={@form} id="entry-form" phx-change="validate" phx-submit="save"> 17 <.input field={@form[:date]} type="date" label="Date" /> 18 <.input field={@form[:mood]} type="text" label="Mood" /> 19 <.input field={@form[:headache]} type="checkbox" label="Headache" /> 20 <.input field={@form[:water_glasses]} type="number" label="Water glasses" /> 21 <.input field={@form[:worked_out]} type="checkbox" label="Worked out" /> 22 <.input field={@form[:bowel_movement]} type="checkbox" label="Bowel movement" /> 23 <.input field={@form[:hunger_level]} type="number" label="Hunger level" /> 24 <.input field={@form[:period]} type="checkbox" label="Period" /> 25 <.input field={@form[:notes]} type="textarea" label="Notes" /> 26 <footer> 27 <.button phx-disable-with="Saving..." variant="primary">Save Entry</.button> 28 <.button navigate={return_path(@return_to, @entry)}>Cancel</.button> 29 </footer> 30 </.form> 31 </Layouts.app> 32 """ 33 end 34 35 @impl true 36 def mount(params, _session, socket) do 37 {:ok, 38 socket 39 |> assign(:return_to, return_to(params["return_to"])) 40 |> apply_action(socket.assigns.live_action, params)} 41 end 42 43 defp return_to("show"), do: "show" 44 defp return_to(_), do: "index" 45 46 defp apply_action(socket, :edit, %{"id" => id}) do 47 entry = Tracker.get_entry!(socket.assigns.current_scope, id) 48 49 socket 50 |> assign(:page_title, "Edit Entry") 51 |> assign(:entry, entry) 52 |> assign(:form, to_form(Tracker.change_entry(entry))) 53 end 54 55 defp apply_action(socket, :new, _params) do 56 entry = %Entry{} 57 58 socket 59 |> assign(:page_title, "New Entry") 60 |> assign(:entry, entry) 61 |> assign(:form, to_form(Tracker.change_entry(entry))) 62 end 63 64 @impl true 65 def handle_event("validate", %{"entry" => entry_params}, socket) do 66 changeset = Tracker.change_entry(socket.assigns.entry, entry_params) 67 {:noreply, assign(socket, form: to_form(changeset, action: :validate))} 68 end 69 70 def handle_event("save", %{"entry" => entry_params}, socket) do 71 save_entry(socket, socket.assigns.live_action, entry_params) 72 end 73 74 defp save_entry(socket, :edit, entry_params) do 75 case Tracker.update_entry(socket.assigns.entry, entry_params) do 76 {:ok, entry} -> 77 {:noreply, 78 socket 79 |> put_flash(:info, "Entry updated successfully") 80 |> push_navigate(to: return_path(socket.assigns.return_to, entry))} 81 82 {:error, %Ecto.Changeset{} = changeset} -> 83 {:noreply, assign(socket, form: to_form(changeset))} 84 end 85 end 86 87 defp save_entry(socket, :new, entry_params) do 88 case Tracker.create_entry(socket.assigns.current_scope, entry_params) do 89 {:ok, entry} -> 90 {:noreply, 91 socket 92 |> put_flash(:info, "Entry created successfully") 93 |> push_navigate(to: return_path(socket.assigns.return_to, entry))} 94 95 {:error, %Ecto.Changeset{} = changeset} -> 96 {:noreply, assign(socket, form: to_form(changeset))} 97 end 98 end 99 100 defp return_path("index", _entry), do: ~p"/entries" 101 defp return_path("show", entry), do: ~p"/entries/#{entry}" 102 end