Packages
moon
2.89.0
2.90.5
retired
2.90.4
2.90.3
2.90.2
2.90.1
2.90.0
2.89.4
2.89.1
2.89.0
2.88.0
2.87.11
2.87.10
2.87.9
2.87.8
2.87.7
2.87.6
2.87.5
2.87.4
2.87.3
2.87.2
2.87.1
2.87.0
2.86.1
2.86.0
2.85.1
2.85.0
2.84.0
2.83.0
2.82.0
2.81.4
2.81.3
2.81.2
2.81.1
2.81.0
2.80.2
2.80.1
2.80.0
2.79.13
2.79.12
2.79.11
2.79.10
2.79.9
2.79.8
2.79.7
2.79.6
2.79.5
2.79.4
2.79.3
2.79.2
2.79.1
2.79.0
2.78.4
2.78.3
2.78.2
2.78.1
2.78.0
2.77.0
2.76.5
2.76.4
2.76.3
2.76.2
2.76.1
2.76.0
2.75.0
2.74.1
2.74.0
2.73.8
2.73.7
2.73.6
2.73.5
2.73.4
2.73.3
2.73.2
2.73.1
2.73.0
2.72.5
2.72.4
2.72.3
2.72.2
2.72.1
2.72.0
2.71.1
2.71.0
2.70.0
2.69.2
2.69.1
2.69.0
2.68.11
2.68.10
Components-based design system written in elixir
Current section
Files
Jump to
Current section
Files
lib/moon/components/calendar/month.ex
defmodule Moon.Components.Calendar.Month do
@moduledoc false
use Moon.StatelessComponent
alias Moon.Components.Calendar.Day
prop(date, :datetime, required: true)
prop(week_starts_on, :integer, default: 1)
prop(events, :list, default: [])
def render(assigns) do
~F"""
<div class="grid gap-1" style="grid-template-columns: repeat(7, minmax(2rem, auto));">
<Day
:for={day <- previous_month_days(@date, @week_starts_on)}
day={day}
text_color="text-trunks"
events={filtered_events(@events, day)}
/>
<Day
:for={day <- month_days(@date)}
day={day}
text_color={if Timex.to_date(day) == Timex.today(), do: "text-piccolo"}
events={filtered_events(@events, day)}
/>
<Day
:for={day <- next_month_days(@date, @week_starts_on)}
day={day}
text_color="text-trunks"
events={filtered_events(@events, day)}
/>
</div>
"""
end
defp month_days(date) do
Timex.Interval.new(
from: Timex.beginning_of_month(date),
until: Timex.end_of_month(date),
left_open: false,
right_open: false
)
end
defp previous_month_days(date, weekstart) do
month_starts_at = Timex.beginning_of_month(date)
week_starts_at = Timex.beginning_of_week(month_starts_at, weekstart)
if month_starts_at == week_starts_at do
[]
else
Timex.Interval.new(
from: week_starts_at,
until: month_starts_at,
left_open: false,
right_open: true
)
end
end
defp next_month_days(date, weekstart) do
month_ends_at = Timex.end_of_month(date)
week_ends_at = Timex.end_of_week(month_ends_at, weekstart)
if month_ends_at == week_ends_at do
[]
else
Timex.Interval.new(
from: month_ends_at,
until: week_ends_at,
left_open: true,
right_open: false
)
end
end
defp filtered_events([], _), do: []
defp filtered_events(events, day) do
events
|> Enum.filter(fn event ->
Timex.to_date(event.started_at) == Timex.to_date(day)
end)
|> Enum.sort_by(& &1.started_at, {:asc, NaiveDateTime})
end
end