using Microsoft.AspNetCore.Components; using Microsoft.Extensions; using System.Formats.Asn1; using System.Text; using Egw.Core.Razor.Comp.Data; namespace Egw.Core.Razor.Comp.Components { public partial class CalendarMonth { #region Public Properties /// /// Css giorno mese corrente /// default: text-danger /// [Parameter] public string CurrMonthCss { get; set; } = "text-light"; /// /// Dizionario configurazione date (per check colori su data) /// [Parameter] public Dictionary? DateCheck { get; set; } /// /// Dizionario configurazione date tipo BLOCK (es feste, chiusure aziendali) /// [Parameter] public Dictionary? DateCheckBlock { get; set; } /// /// Evento selezione data valida (= entro il mese corrente/selezionato) /// [Parameter] public EventCallback DateSelected { get; set; } [Parameter] public EventCallback backToCal { get; set; } /// /// Day di riferimento (tipicamente = oggi) per disegnare calendario alla data corrente /// [Parameter] public DateTime DtRif { get; set; } = DateTime.Today; /// /// Elenco eventi da mostrare sul calendario /// [Parameter] public List? EventList { get; set; } /// /// Css titolo /// default: color: red /// [Parameter] public string HeadStyle { get; set; } = "color: red"; /// /// Css sfondo principale /// default: table table-dark table-borderless opt alt: table-striped, table-responsive /// [Parameter] public string MainCss { get; set; } = "table table-dark table-borderless"; /// /// Evento cambio di mese /// [Parameter] public EventCallback MonthChanged { get; set; } /// /// Css giorno tipico /// default: text-danger /// [Parameter] public string OtherMonthCss { get; set; } = "text-secondary"; /// /// Css giorno selezionato /// default: bg-danger text-warning /// [Parameter] public string SelDayCss { get; set; } = "bg-danger text-warning rounded-top p-2"; /// /// Css dei giorni della settimana selezionata /// default: bg-danger text-warning /// [Parameter] public string SelWeekCss { get; set; } = "text-light m-0 px-0"; /// /// Imposta di mostrare SOLO una singola settimana (per selezione data) /// default: false /// [Parameter] public bool SingleWeek { get; set; } = false; /// /// Css per giorni weekend (sab-dom) /// default: text-danger /// [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 /// /// Elenco date da mostrare /// private List DateList { get; set; } = new List(); private DateTime dtCurr { get; set; } = DateTime.Today; private DateTime MonthEnd { get; set; } = DateTime.Today.AddMonths(1); private DateTime MonthStart { get; set; } = DateTime.Today; /// /// Singola riga in caso di selezione... /// private List SingleWeekRow { get { List answ = new List(); foreach (var item in WeekRows) { if (item.Contains(DtRif)) { answ = item; break; } } return answ; } } /// /// Righe da disegnare nel calendario /// private List> WeekRows { get; set; } = new List>(); #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 � 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 � 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(); } /// /// Sistemazione date x disegnare controlli /// /// 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(); for (int i = 0; i < numDD; i++) { DateList.Add(calStart.AddDays(i)); } // ora sistemo le righe da disegnare... WeekRows = new List>(); 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 } }