daily-tracker

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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