defmodule MoonWeb.Pages.Components.Date.DatepickerPage do
@moduledoc false
use MoonWeb, :live_view
import Ecto.Changeset, only: [fetch_field: 2, put_change: 3]
alias Moon.Components.Datepicker
alias Moon.Components.Form
alias MoonWeb.Components.ExampleAndCode
alias MoonWeb.Components.Page
alias MoonWeb.Components.ComponentPageDescription
alias MoonWeb.Components.PropsTable
data(breadcrumbs, :any,
default: [
%{
to: "#",
name: "Components"
},
%{
to: "/components/date/datepicker",
name: "Datepicker"
}
]
)
data(props_info_array, :list,
default: [
%{
:name => ~c"with_time",
:type => ~c"boolean ",
:required => ~c"No",
:default => ~c"false",
:description => ~c"Whether the datepicker includes time"
},
%{
:name => ~c"week_starts_on",
:type => ~c"1 | 2 | 3 | 4 | 5 | 6 | 7",
:required => ~c"No",
:default => ~c"1 (Monday)",
:description => ~c"Day of the week where the calendar starts"
},
%{
:name => ~c"start_date_field",
:type => ~c"atom",
:required => ~c"No",
:default => ~c"start_date",
:description => ~c"Field name for the start date"
},
%{
:name => ~c"end_date_field",
:type => ~c"atom",
:required => ~c"No",
:default => ~c"end_date",
:description => ~c"Field name for the end date"
},
%{
:name => ~c"button_class",
:type => ~c"css_class",
:required => ~c"No",
:default => ~c"",
:description => ~c"Css class for the date button"
},
%{
:name => ~c"show_date_inputs",
:type => ~c"boolean",
:required => ~c"No",
:default => ~c"false",
:description => ~c"Whether to display the text input fields"
},
%{
:name => ~c"ranges",
:type => ~c"list",
:required => ~c"No",
:default =>
~c"lastMonth | lastWeek | yesterday | thisWeek | thisMonth | last24hours | today",
:description => ~c"List of date ranges to choose from"
},
%{
:name => ~c"start_date",
:type => ~c"datetime",
:required => ~c"No",
:default => ~c"Timex.today()",
:description => ~c"Initial start date"
},
%{
:name => ~c"end_date",
:type => ~c"datetime",
:required => ~c"No",
:default => ~c"Timex.today()",
:description => ~c"Initial end date"
},
%{
:name => ~c"submit",
:type => ~c"event",
:required => ~c"No",
:default => ~c"update_dates",
:description => ~c"Event on date apply"
},
%{
:name => ~c"testid",
:type => ~c"string",
:required => ~c"No",
:default => ~c"-",
:description => ~c""
}
]
)
defmodule Contract do
@moduledoc false
use Ecto.Schema
import Ecto.Changeset
schema "contracts" do
field(:started_at, :date)
field(:ended_at, :date)
field(:datetime_started_at, :naive_datetime)
field(:datetime_ended_at, :naive_datetime)
end
def changeset(contract, attrs \\ %{}) do
contract
|> cast(attrs, [:started_at, :ended_at, :datetime_started_at, :datetime_ended_at])
end
end
def mount(_params, _session, socket) do
data = %Contract{started_at: Timex.today()}
socket =
assign(socket,
changeset: Contract.changeset(data),
time_changeset: Contract.changeset(%Contract{}),
range_changeset: Contract.changeset(%Contract{}),
weekstart_changeset:
Contract.changeset(%Contract{
started_at: Timex.today() |> Timex.beginning_of_week(),
ended_at: Timex.today() |> Timex.end_of_week()
})
)
{:ok, socket}
end
def handle_params(_params, uri, socket) do
{:noreply, assign(socket, uri: uri)}
end
def render(assigns) do
~F"""
Datepicker
Use
Use
Use Datepicker component has to be placed inside the Form component.
with_time (list) prop. Default value is false.
ranges (list) prop. Possible values are lastMonth, lastWeek, yesterday, last24hours, today, tomorrow, thisWeek, nextWeek, thisMonth, nextMonth.
week_starts_on prop. The weekstart can between 1..7, where 1 means Monday. Default value is 1.
@changeset = {inspect(@changeset, pretty: true)}
@changeset = {inspect(@time_changeset, pretty: true)}