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

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