defmodule KatzenplanWeb.AdminLive do
use KatzenplanWeb, :live_view
alias Phoenix.PubSub
alias Katzenplan.Accounts
alias Katzenplan.Account.Benutzer
alias Katzenplan.Dto.ErstelleUrlaub
def mount(_params, _session, socket) do
dates = Katzenplan.Plan.list_dateranges()
erstelle_urlaub = ErstelleUrlaub.changeset(%ErstelleUrlaub{}, %{})
if connected?(socket) do
PubSub.subscribe(Katzenplan.PubSub, "katzenplan")
end
{:ok,
socket
|> assign(collapsed_dates: dates)
|> assign(new_form: to_form(erstelle_urlaub))
|> assign(alle_benutzer: Accounts.alle_benutzer())
|> assign(benutzer: nil)
|> assign(benutzer_form: nil)
}
end
def handle_params(%{"id" => benutzer_id}, _url, socket) do
benutzer = Accounts.hole_benutzer(benutzer_id)
benutzer_form =
benutzer
|> Benutzer.changeset(%{})
|> to_form()
{:noreply, assign(socket, benutzer: benutzer, benutzer_form: benutzer_form)}
end
def handle_params(_params, _url, socket),
do: {:noreply, socket}
def render(assigns) do
~H"""
Katzendienst
-
<%= format_daterange(range) %>
Neu erstellen
<.simple_form for={@new_form} phx-change="validate" phx-submit="save" class="mb-5">
<.input field={@new_form[:start]} type="date" />
<.input field={@new_form[:ende]} type="date" />
<:actions>
<.button disabled={not @new_form.source.valid?}>Speichern
<%= @dienst_tage %> <%= if @dienst_tage == 1, do: "Tag", else: "Tage" %>
Benutzer
Name |
Aktion |
<%= benutzer.name %> |
<.button class="text-xs" phx-click={JS.patch(~p"/admin/user/#{benutzer.id}/edit")}>
Bearbeiten
|
<.modal :if={@live_action in [:edit_user]} on_cancel={JS.patch(~p"/admin")}
id="benutzer-bearbeiten" show
>
Bearbeite <%= @benutzer.name %>...
<.simple_form for={@benutzer_form} phx-submit="edit_user">
<.input field={@benutzer_form[:name]} />
<:actions>
<.button>Speichern
"""
end
def handle_info({:benutzer_geaendert, _benutzer}, socket) do
socket = assign(socket, alle_benutzer: Accounts.alle_benutzer())
{:noreply, socket}
end
def handle_event("save", %{"erstelle_urlaub" => form}, socket) do
changeset = ErstelleUrlaub.changeset(%ErstelleUrlaub{}, form)
if changeset.valid? do
changeset
|> Ecto.Changeset.apply_changes()
|> ErstelleUrlaub.to_daterange()
|> Enum.each(
fn day ->
Katzenplan.Plan.create_tag(%{datum: day, verantwortlicher_mittags: "", verantwortlicher_abends: ""})
end)
{:noreply, put_flash(socket, :info, "Tage wurden angelegt...")}
else
form = to_form(changeset, action: :save)
{:noreply, put_flash(socket, :error, "Keine gültige Eingabe!")}
end
end
def handle_event("validate", %{"erstelle_urlaub" => form}, socket) do
changeset =
%ErstelleUrlaub{}
|> ErstelleUrlaub.changeset(form)
{start, ende} = {Ecto.Changeset.get_field(changeset, :start), Ecto.Changeset.get_field(changeset, :ende)}
dienst_tage =
case {start, ende} do
{%Date{}, nil} -> 1
{%Date{}, %Date{}} -> Enum.count(Date.range(start, ende))
_ -> nil
end
{:noreply,
socket
|> assign(
new_form: to_form(changeset, action: :validate),
dienst_tage: dienst_tage)
}
end
def handle_event("edit_user", %{"benutzer" => benutzer}, socket) do
changeset =
socket.assigns.benutzer
|> Benutzer.changeset(benutzer)
socket =
if changeset.valid? do
{:ok, benutzer} = Katzenplan.Repo.update(changeset)
PubSub.broadcast(Katzenplan.PubSub, "katzenplan", {:benutzer_geaendert, benutzer})
push_patch(socket, to: ~p"/admin")
else
put_flash(socket, :error, "Fehlerhaft...")
end
{:noreply, socket}
end
defp format_date(date), do: Calendar.strftime(date, "%d.%m.%Y")
defp format_minimal_date(date, ctx) do
equal_components = [
date.day == ctx.day,
date.month == ctx.month,
date.year == ctx.year]
case equal_components do
[false, true, true] ->
Calendar.strftime(date, "%d.")
[false, false, true] ->
Calendar.strftime(date, "%d.%m.")
_ ->
Calendar.strftime(date, "%d.%m.%Y")
end
end
defp format_daterange({date, date}), do: format_date(date)
defp format_daterange({first, last}) do
[
format_minimal_date(first, last),
format_date(last)
]
|> Enum.join(" – ")
end
end