Files
egwcorelib/EgwCoreLib.Razor/CalendarMonth.razor.cs
2023-06-28 14:46:02 +02:00

355 lines
10 KiB
C#

using Microsoft.AspNetCore.Components;
using Microsoft.Extensions;
using System.Formats.Asn1;
using System.Text;
using EgwCoreLib.Razor.Data;
namespace EgwCoreLib.Razor
{
public partial class CalendarMonth
{
#region Public Properties
/// <summary>
/// Css giorno mese corrente
/// default: text-danger
/// </summary>
[Parameter]
public string CurrMonthCss { get; set; } = "text-light";
/// <summary>
/// Dizionario configurazione date (per check colori su data)
/// </summary>
[Parameter]
public Dictionary<DateTime, string>? DateCheck { get; set; }
/// <summary>
/// Dizionario configurazione date tipo BLOCK (es feste, chiusure aziendali)
/// </summary>
[Parameter]
public Dictionary<DateTime, string>? DateCheckBlock { get; set; }
/// <summary>
/// Evento selezione data valida (= entro il mese corrente/selezionato)
/// </summary>
[Parameter]
public EventCallback<DateTime> DateSelected { get; set; }
[Parameter]
public EventCallback<bool> backToCal { get; set; }
/// <summary>
/// Day di riferimento (tipicamente = oggi) per disegnare calendario alla data corrente
/// </summary>
[Parameter]
public DateTime DtRif { get; set; } = DateTime.Today;
/// <summary>
/// Elenco eventi da mostrare sul calendario
/// </summary>
[Parameter]
public List<CalendarEvent>? EventList { get; set; }
/// <summary>
/// Css titolo
/// default: color: red
/// </summary>
[Parameter]
public string HeadStyle { get; set; } = "color: red";
/// <summary>
/// Css sfondo principale
/// default: table table-dark table-borderless opt alt: table-striped, table-responsive
/// </summary>
[Parameter]
public string MainCss { get; set; } = "table table-dark table-borderless";
/// <summary>
/// Evento cambio di mese
/// </summary>
[Parameter]
public EventCallback<DateTime> MonthChanged { get; set; }
/// <summary>
/// Css giorno tipico
/// default: text-danger
/// </summary>
[Parameter]
public string OtherMonthCss { get; set; } = "text-secondary";
/// <summary>
/// Css giorno selezionato
/// default: bg-danger text-warning
/// </summary>
[Parameter]
public string SelDayCss { get; set; } = "bg-danger text-warning rounded-top p-2";
/// <summary>
/// Css dei giorni della settimana selezionata
/// default: bg-danger text-warning
/// </summary>
[Parameter]
public string SelWeekCss { get; set; } = "text-light m-0 px-0";
/// <summary>
/// Imposta di mostrare SOLO una singola settimana (per selezione data)
/// default: false
/// </summary>
[Parameter]
public bool SingleWeek { get; set; } = false;
/// <summary>
/// Css per giorni weekend (sab-dom)
/// default: text-danger
/// </summary>
[Parameter]
public string WeekEndCss { get; set; } = "bg-secondary text-light bg-opacity-75";
#endregion Public Properties
#region Protected Methods
protected override async Task OnInitializedAsync()
{
dtCurr = DateTime.Today;
await Task.Delay(1);
}
protected override async Task OnParametersSetAsync()
{
await FixDate();
}
#endregion Protected Methods
#region Private Fields
private bool singleWeek = false;
#endregion Private Fields
#region Private Properties
/// <summary>
/// Elenco date da mostrare
/// </summary>
private List<DateTime> DateList { get; set; } = new List<DateTime>();
private DateTime dtCurr { get; set; } = DateTime.Today;
private DateTime MonthEnd { get; set; } = DateTime.Today.AddMonths(1);
private DateTime MonthStart { get; set; } = DateTime.Today;
/// <summary>
/// Singola riga in caso di selezione...
/// </summary>
private List<DateTime> SingleWeekRow
{
get
{
List<DateTime> answ = new List<DateTime>();
foreach (var item in WeekRows)
{
if (item.Contains(DtRif))
{
answ = item;
break;
}
}
return answ;
}
}
/// <summary>
/// Righe da disegnare nel calendario
/// </summary>
private List<List<DateTime>> WeekRows { get; set; } = new List<List<DateTime>>();
#endregion Private Properties
#region Private Methods
private bool hasDot(DateTime dtCurr, string type)
{
bool answ = false;
if (EventList != null)
{
foreach (var item in EventList)
{
if (item.Inizio.Date == dtCurr.Date && item.Type == type)
{
answ = true;
}
}
}
return answ;
}
private async Task clickDay(DateTime dtClick)
{
// se mese prec/successivo --> sposto data rif
if (dtClick < MonthStart)
{
DtRif = DtRif.AddMonths(-1);
await FixDate();
await MonthChanged.InvokeAsync(dtClick);
}
else if (dtClick > MonthEnd)
{
DtRif = DtRif.AddMonths(1);
await FixDate();
await MonthChanged.InvokeAsync(dtClick);
}
else
{
// altrimenti riporto evento
await DateSelected.InvokeAsync(dtClick);
if (EventList != null)
{
var eventListWeekly = EventList.Where(x => SingleWeekRow.Contains(dtClick)).ToList();
}
}
await Task.Delay(1);
}
private async Task addMonth()
{
await FixDate();
await MonthChanged.InvokeAsync(DtRif.AddMonths(1));
}
private async Task subtractMonth()
{
await FixDate();
await MonthChanged.InvokeAsync(DtRif.AddMonths(-1));
}
private string dayCss(DateTime currDay)
{
string answ = CurrMonthCss;
// se fosse fuori estremi mese --> grigio...
if (currDay < MonthStart || currDay > MonthEnd)
{
answ = OtherMonthCss;
}
else
{
// cerco prima i valori BLOCK...
if (DateCheckBlock != null && DateCheckBlock.ContainsKey(currDay))
{
answ = DateCheckBlock[currDay];
}
// se fosse weekend forzo quello
else if (currDay.DayOfWeek == DayOfWeek.Saturday || currDay.DayOfWeek == DayOfWeek.Sunday)
{
answ = WeekEndCss;
}
}
return answ;
}
private void DisplayDate(DateTime dtSel)
{
dtCurr = dtSel;
singleWeek = true;
}
private async Task backToCalendar()
{
await backToCal.InvokeAsync();
//await reloadData();
}
/// <summary>
/// Sistemazione date x disegnare controlli
/// </summary>
/// <returns></returns>
private async Task FixDate()
{
await Task.Delay(1);
// disegno sempre 6 righe = 42 gg
int numDD = 42;
MonthStart = new DateTime(DtRif.Year, DtRif.Month, 1);
MonthEnd = MonthStart.AddMonths(1).AddDays(-1);
DateTime calStart = MonthStart;
// calcolo date calendario in base al giorno dell'inizio mese...
switch (MonthStart.DayOfWeek)
{
case DayOfWeek.Sunday:
calStart = MonthStart.AddDays(-6);
break;
case DayOfWeek.Monday:
calStart = MonthStart.AddDays(-7);
break;
case DayOfWeek.Tuesday:
calStart = MonthStart.AddDays(-1);
break;
case DayOfWeek.Wednesday:
calStart = MonthStart.AddDays(-2);
break;
case DayOfWeek.Thursday:
calStart = MonthStart.AddDays(-3);
break;
case DayOfWeek.Friday:
calStart = MonthStart.AddDays(-4);
break;
case DayOfWeek.Saturday:
calStart = MonthStart.AddDays(-5);
break;
default:
break;
}
// calcolo fine mese sapendo che sono cmq 7 x 6 week...
int numEnd = numDD - MonthEnd.Subtract(calStart).Days;
DateTime calEnd = MonthEnd.AddDays(numEnd);
// calcolo elenco date (da disegnare)
DateList = new List<DateTime>();
for (int i = 0; i < numDD; i++)
{
DateList.Add(calStart.AddDays(i));
}
// ora sistemo le righe da disegnare...
WeekRows = new List<List<DateTime>>();
for (int i = 0; i < 6; i++)
{
WeekRows.Add(DateList.GetRange(i * 7, 7));
}
}
private async Task resetCal()
{
singleWeek = false;
await Task.Delay(1);
}
private string singleDayCss(DateTime currDay)
{
string answ = SelWeekCss;
return answ;
}
private string singleDaySpanCss(DateTime currDay)
{
string answ = currDay == DtRif ? SelDayCss : CurrMonthCss;
return answ;
}
private string spanCss(DateTime currDay)
{
string answ = "";
if (DateCheck != null && DateCheck.ContainsKey(currDay))
{
answ = DateCheck[currDay];
}
return answ;
}
#endregion Private Methods
}
}