247 lines
6.7 KiB
C#
247 lines
6.7 KiB
C#
using Microsoft.AspNetCore.Components;
|
|
using System.Drawing;
|
|
using EgwCoreLib.Razor.Data;
|
|
|
|
namespace EgwCoreLib.Razor
|
|
{
|
|
public partial class CalendarWeek
|
|
{
|
|
#region Public Properties
|
|
|
|
/// <summary>
|
|
/// Evento x ritorno click
|
|
/// </summary>
|
|
[Parameter]
|
|
public EventCallback<bool> backToCalendar { get; set; }
|
|
|
|
/// <summary>
|
|
/// Periodo da mostrare (tipicamente 1 settimana)
|
|
/// </summary>
|
|
[Parameter]
|
|
public List<DateTime> DateList { get; set; } = new List<DateTime>();
|
|
|
|
/// <summary>
|
|
/// Evento selezione data valida (= entro il periodo selezionato)
|
|
/// </summary>
|
|
[Parameter]
|
|
public EventCallback<DateTime> DateSelected { get; set; }
|
|
|
|
/// <summary>
|
|
/// Evento selezione data singola giornata da header
|
|
/// </summary>
|
|
[Parameter]
|
|
public EventCallback<DateTime> EC_HeadDateSel { get; set; }
|
|
|
|
/// <summary>
|
|
/// Ora fine visualizzazione calendario
|
|
/// </summary>
|
|
[Parameter]
|
|
public int EndHour { get; set; } = 20;
|
|
|
|
/// <summary>
|
|
/// Eventi da inserire
|
|
/// </summary>
|
|
[Parameter]
|
|
public List<CalendarEvent> EventList { get; set; } = new List<CalendarEvent>();
|
|
|
|
/// <summary>
|
|
/// Css titolo
|
|
/// default: color: red
|
|
/// </summary>
|
|
[Parameter]
|
|
public string HeadStyle { get; set; } = "color: #E67E22";
|
|
|
|
/// <summary>
|
|
/// Altezza di ogni blocco ora da mostrare
|
|
/// </summary>
|
|
[Parameter]
|
|
public int HeightHour { get; set; } = 20;
|
|
|
|
/// <summary>
|
|
/// Larghezza calcolata delle etichette, minimo tra
|
|
/// </summary>
|
|
[Parameter]
|
|
public int labelWidth { get; set; } = 15;
|
|
|
|
/// <summary>
|
|
/// Fattore di shift in X, se 0 = nessuno shift, se > 0 è percentuale moltiplica il
|
|
/// gradino calcolato
|
|
/// Default: 100 (poi riportato a intero, quindi 100/100 = 1.0)
|
|
/// </summary>
|
|
[Parameter]
|
|
public int PercX { get; set; } = 100;
|
|
|
|
/// <summary>
|
|
/// Fattore di shift in Y, se 0 = nessuno shift, se > 0 è percentuale moltiplica il
|
|
/// gradino calcolato
|
|
/// Default: 90 (poi riportato a intero, quindi 90/100 = 0.9)
|
|
/// </summary>
|
|
[Parameter]
|
|
public int PercY { get; set; } = 90;
|
|
|
|
[Parameter]
|
|
public int StartHour { get; set; } = 8;
|
|
|
|
/// <summary>
|
|
/// Dimensioni viewbox GLOBALE
|
|
/// </summary>
|
|
[Parameter]
|
|
public Size vBox { get; set; } = new Size(1200, 1600);
|
|
|
|
/// <summary>
|
|
/// Evento richiesta modifica settimana
|
|
/// </summary>
|
|
[Parameter]
|
|
public EventCallback<int> WeekChanged { get; set; }
|
|
|
|
#endregion Public Properties
|
|
|
|
#region Protected Fields
|
|
|
|
protected List<int> HourSlot = new List<int>();
|
|
|
|
#endregion Protected Fields
|
|
|
|
#region Protected Properties
|
|
|
|
protected int calcColSpan
|
|
{
|
|
get => numDays + 1;
|
|
}
|
|
|
|
protected int contWidth
|
|
{
|
|
get => (vBox.Width * 2) / (2 * numDays + 1);
|
|
//get => numDays > 1 ? (vBox.Width * 2) / (2 * numDays + 1) : vBox.Width * 90 / 100;
|
|
}
|
|
|
|
protected DateTime DtRif
|
|
{
|
|
get
|
|
{
|
|
DateTime answ = DateTime.Today;
|
|
if (DateList != null && DateList.Count > 0)
|
|
{
|
|
answ = DateList[0];
|
|
}
|
|
return answ;
|
|
}
|
|
}
|
|
|
|
protected int numDays
|
|
{
|
|
get => DateList.Count;
|
|
}
|
|
|
|
protected Size vBoxCont
|
|
{
|
|
get
|
|
{
|
|
// label e' MENO di 1/tot columns
|
|
Size answ = new Size(contWidth, vBox.Height);
|
|
return answ;
|
|
}
|
|
}
|
|
|
|
protected Size vBoxLabel
|
|
{
|
|
get
|
|
{
|
|
// label e' MENO di 1/tot columns
|
|
Size answ = new Size(contWidth / 2, vBox.Height);
|
|
//Size answ = new Size(labelWidth, vBox.Height);
|
|
return answ;
|
|
}
|
|
}
|
|
|
|
#endregion Protected Properties
|
|
|
|
#region Protected Methods
|
|
|
|
/// <summary>
|
|
/// Richiesta cambio sett di riferimento --> riporta evento
|
|
/// </summary>
|
|
/// <param name="delta"></param>
|
|
/// <returns></returns>
|
|
protected async Task changeWeek(int delta)
|
|
{
|
|
await WeekChanged.InvokeAsync(delta);
|
|
}
|
|
|
|
protected List<CalendarEvent> DayEvent(DateTime DtReq)
|
|
{
|
|
List<CalendarEvent> answ = new List<CalendarEvent>();
|
|
if (EventList != null)
|
|
{
|
|
answ = EventList.Where(x => x.Inizio.Date == DtReq.Date).ToList();
|
|
}
|
|
return answ;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Genera etichette orarie (1 x ora)
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
protected List<CalendarEvent> LabelList()
|
|
{
|
|
int idx = 0;
|
|
List<CalendarEvent> answ = HourSlot.Select(x => new CalendarEvent()
|
|
{
|
|
id = idx++,
|
|
Inizio = DtRif.AddHours(x),
|
|
Fine = DtRif.AddHours(x),
|
|
CssClass = "text-light",
|
|
Title = $"{x:00}:00",
|
|
Description = $"{x:00}:00"
|
|
}).ToList();
|
|
return answ;
|
|
}
|
|
|
|
protected override async Task OnParametersSetAsync()
|
|
{
|
|
HourSlot = new List<int>();
|
|
for (int i = StartHour; i <= EndHour; i++)
|
|
{
|
|
HourSlot.Add(i);
|
|
}
|
|
await InvokeAsync(StateHasChanged);
|
|
}
|
|
|
|
protected async Task OpenCalendarMonth()
|
|
{
|
|
await backToCalendar.InvokeAsync(true);
|
|
}
|
|
|
|
protected async Task SelectDate(DateTime selDate)
|
|
{
|
|
await EC_HeadDateSel.InvokeAsync(selDate);
|
|
}
|
|
|
|
/// <summary>
|
|
/// GetIso8601WeekOfYear
|
|
/// </summary>
|
|
/// <param name="DtReq"></param>
|
|
/// <returns></returns>
|
|
protected int weekNum(DateTime DtReq)
|
|
{
|
|
int wNum = WeekData.GetIso8601WeekOfYear(DtReq);
|
|
return wNum;
|
|
}
|
|
|
|
#endregion Protected Methods
|
|
|
|
#region Private Properties
|
|
|
|
private string dataWidth
|
|
{
|
|
get => $"{(double)contWidth / vBox.Width:P2}".Replace(",", ".");
|
|
}
|
|
|
|
private string lblWidth
|
|
{
|
|
get => $"{(double)(vBox.Width - (contWidth * numDays)) / vBox.Width:P2}".Replace(",", ".");
|
|
}
|
|
|
|
#endregion Private Properties
|
|
}
|
|
} |