@Value.ToString("yyyy / MM / dd")
@if (isCalendarOpen) {
@currentMonthDisplay.ToString("MMMM yyyy")
Su
Mo
Tu
We
Th
Fr
Sa
@foreach (var day in paddingDays) {
} @foreach (var day in currentMonthDays) { var loopDay = day; }
} @code { [Parameter] public DateTime Value { get; set; } = DateTime.Today; [Parameter] public EventCallback ValueChanged { get; set; } private bool isCalendarOpen = false; private DateTime currentMonthDisplay; private List paddingDays = new(); private List currentMonthDays = new(); protected override void OnParametersSet() { if (currentMonthDisplay == DateTime.MinValue) { currentMonthDisplay = new DateTime(Value.Year, Value.Month, 1); GenerateCalendarMatrix(); } } private void ToggleCalendar() => isCalendarOpen = !isCalendarOpen; private async Task SelectDate(DateTime date) { Value = date; isCalendarOpen = false; await ValueChanged.InvokeAsync(Value); } private void NavigateMonthPrevious() { currentMonthDisplay = currentMonthDisplay.AddMonths(-1); GenerateCalendarMatrix(); } private void NavigateMonthNext() { currentMonthDisplay = currentMonthDisplay.AddMonths(1); GenerateCalendarMatrix(); } private void GenerateCalendarMatrix() { currentMonthDays.Clear(); paddingDays.Clear(); int daysInMonth = DateTime.DaysInMonth(currentMonthDisplay.Year, currentMonthDisplay.Month); DayOfWeek firstDayOfWeek = currentMonthDisplay.DayOfWeek; for (int i = 0; i < (int)firstDayOfWeek; i++) { paddingDays.Add(DateTime.MinValue); } for (int day = 1; day <= daysInMonth; day++) { currentMonthDays.Add(new DateTime(currentMonthDisplay.Year, currentMonthDisplay.Month, day)); } } private bool IsToday(DateTime date) => date.Date == DateTime.Today; private bool IsSelected(DateTime date) => date.Date == Value.Date; }