defmodule MoonWeb.Examples.Design.DropdownExample.Datepicker do @moduledoc false use Moon.StatefulComponent use MoonWeb, :example alias Moon.Design.Dropdown alias Moon.Components.Chip import Date, only: [new: 3, day_of_week: 1, add: 2] prop(value, :date, default: Date.utc_today()) prop(month, :date, default: Date.utc_today()) prop(is_open, :boolean) def handle_event("set_value", %{"value" => value}, socket) do {:noreply, assign(socket, value: Date.from_iso8601!(value), is_open: false)} end def handle_event("change_month", %{"value" => value}, socket) do {:noreply, assign(socket, month: Date.from_iso8601!(value), is_open: true)} end defp month_weeks(date) do import Enum, only: [map: 2] {:ok, month_start} = new(date.year, date.month, 1) start = month_start |> add(1 - day_of_week(month_start)) # no more than 5 weeks in month 0..4 |> map(fn week_nr -> 0..6 |> map(&add(start, week_nr * 7 + &1)) end) end defp months() do [""] ++ ~w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) end def render(assigns) do ~F"""
{@value || "Choose date..."}
{Enum.at(months(), @month.month)} {@month.year}
{#for day <- ~w(m t w t f s s)} {day} {/for}
{#for week <- month_weeks(@month)}
{#for day <- week} {/for}
{/for}
""" end def code() do """ alias Moon.Design.Dropdown alias Moon.Components.Chip import Date, only: [new: 3, day_of_week: 1, add: 2] prop(value, :date, default: Date.utc_today()) prop(month, :date, default: Date.utc_today()) prop(is_open, :boolean) def handle_event("set_value", %{"value" => value}, socket) do {:noreply, assign(socket, value: Date.from_iso8601!(value), is_open: false)} end def handle_event("change_month", %{"value" => value}, socket) do {:noreply, assign(socket, month: Date.from_iso8601!(value), is_open: true)} end defp month_weeks(date) do import Enum, only: [to_list: 1, map: 2] {:ok, month_start} = new(date.year, date.month, 1) start = month_start |> add(1 - day_of_week(month_start)) 0..4 |> to_list |> map(fn week_nr -> 0..6 |> to_list |> map(&add(start, week_nr * 7 + &1)) end) end defp months() do [""] ++ ~w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) end def render(assigns) do ~F\"""
{@value || "Choose date..."}
{Enum.at(months(), @month.month)} {@month.year}
{#for day <- ~w(m t w t f s s)} {day} {/for}
{#for week <- month_weeks(@month)}
{#for day <- week} {/for}
{/for}
\""" end """ end end