150 lines
5.0 KiB
Plaintext
150 lines
5.0 KiB
Plaintext
@using Template.Shared.Core.Dto
|
|
@using Template.Shared.Core.Interface
|
|
@inject IManageDataService manageData
|
|
|
|
<div class="calendar-activity">
|
|
<div class="calendar">
|
|
@foreach (var nomeGiorno in _giorniSettimana)
|
|
{
|
|
<div class="calendar-header">@nomeGiorno</div>
|
|
}
|
|
|
|
@for (var i = 0; i < StartDays; i++)
|
|
{
|
|
<div class="calendar-day disabled @(i == 0 ? "radiusTopLeft" : "")"></div>
|
|
}
|
|
|
|
@for (var day = 1; day <= DaysInMonth; day++)
|
|
{
|
|
var currentDate = new DateTime(Date.Year, Date.Month, day);
|
|
var events = GetEventsForDay(currentDate);
|
|
var daySelected = SelectedDate == currentDate;
|
|
var isToday = currentDate == DateTime.Today;
|
|
|
|
var topRight = StartDays == 0 ? 7 : 7 - StartDays;
|
|
var bottomLeft = DaysInMonth - (6 - EndDays);
|
|
|
|
var categoryActivityCount = events.Select(x => x.Category).Distinct().ToList();
|
|
|
|
<div @onclick="() => SelectDay(currentDate)" class="calendar-day @(isToday ? "today" : daySelected ? "selectedDay" : "")
|
|
@(StartDays == 0 && day == 1 ? "radiusTopLeft" : "")
|
|
@(EndDays == 0 && day == DaysInMonth ? "radiusBottomRight" : "")
|
|
@(bottomLeft == day ? "radiusBottomLeft" : "")
|
|
@(topRight == day ? "radiusTopRight" : "")">
|
|
|
|
<div class="calendar-day-wrapper">
|
|
<span class="titleDay">@day</span>
|
|
@if (events.Any())
|
|
{
|
|
<div class="event-dot-container">
|
|
@foreach (var activityCategory in categoryActivityCount)
|
|
{
|
|
<div class="event-dot @activityCategory.ConvertToHumanReadable()"></div>
|
|
}
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
}
|
|
|
|
@for (var i = 0; i < EndDays; i++)
|
|
{
|
|
<div class="calendar-day disabled @(i + 1 == EndDays ? "radiusBottomRight" : "")"></div>
|
|
}
|
|
</div>
|
|
|
|
<div class="activityContainer">
|
|
@if (!FilteredActivityList.IsNullOrEmpty())
|
|
{
|
|
@foreach (var activity in FilteredActivityList!)
|
|
{
|
|
<ActivityCard Activity="activity"/>
|
|
}
|
|
}
|
|
</div>
|
|
</div>
|
|
|
|
@code
|
|
{
|
|
[Parameter] public required DateTime Date { get; set; }
|
|
[Parameter] public EventCallback<DateTime> DateChanged { get; set; }
|
|
|
|
private List<ActivityDTO> ActivityList { get; set; } = [];
|
|
private List<ActivityDTO> FilteredActivityList { get; set; } = [];
|
|
private DateTime SelectedDate { get; set; } = DateTime.Today;
|
|
|
|
private int DaysInMonth { get; set; }
|
|
private int StartDays { get; set; }
|
|
private int EndDays { get; set; }
|
|
|
|
readonly string[] _giorniSettimana = ["Lu", "Ma", "Me", "Gi", "Ve", "Sa", "Do"];
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
await ChangeMonth();
|
|
}
|
|
|
|
protected override async Task OnParametersSetAsync()
|
|
{
|
|
await ChangeMonth();
|
|
}
|
|
|
|
private async Task ChangeMonth()
|
|
{
|
|
var firstDay = Date;
|
|
DaysInMonth = DateTime.DaysInMonth(firstDay.Year, firstDay.Month);
|
|
|
|
var dayOfWeek = (int)firstDay.DayOfWeek;
|
|
StartDays = dayOfWeek == 0 ? 6 : dayOfWeek - 1;
|
|
|
|
var tempTotalCell = (int)Math.Ceiling((double)(DaysInMonth + StartDays) / 7);
|
|
var totalCell = tempTotalCell * 7;
|
|
EndDays = totalCell - (DaysInMonth + StartDays);
|
|
|
|
await LoadData();
|
|
}
|
|
|
|
private async Task LoadData()
|
|
{
|
|
// Load = true;
|
|
// StateHasChanged();
|
|
|
|
await Task.Delay(500);
|
|
var refreshActivity = await RefreshActivity();
|
|
ActivityList = refreshActivity;
|
|
// Load = false;
|
|
StateHasChanged();
|
|
}
|
|
|
|
private async Task<List<ActivityDTO>> RefreshActivity()
|
|
{
|
|
var startDate = Date;
|
|
var endDate = Date.AddDays(DateTime.DaysInMonth(startDate.Year, startDate.Month) - 1);
|
|
|
|
var dateRange = new DateRange(Date, endDate);
|
|
|
|
var activityDto = await Task.Run(async () =>
|
|
{
|
|
return (await manageData.GetActivity(x =>
|
|
(x.EffectiveDate == null && x.EstimatedDate >= dateRange.Start && x.EstimatedDate <= dateRange.End) ||
|
|
(x.EffectiveDate >= dateRange.Start && x.EffectiveDate <= dateRange.End)
|
|
))
|
|
.OrderBy(x => x.EffectiveDate ?? x.EstimatedDate)
|
|
.ToList();
|
|
});
|
|
|
|
return activityDto;
|
|
}
|
|
|
|
private List<ActivityDTO> GetEventsForDay(DateTime day)
|
|
{
|
|
return ActivityList.IsNullOrEmpty() ? [] : ActivityList.Where(x => (x.EffectiveDate ?? x.EstimatedDate) == day.Date).ToList();
|
|
}
|
|
|
|
private void SelectDay(DateTime currentDate)
|
|
{
|
|
SelectedDate = currentDate;
|
|
StateHasChanged();
|
|
FilteredActivityList = GetEventsForDay(currentDate);
|
|
}
|
|
} |