In Power Apps non esiste nativamente un controllo calendario, ma può comunque essere realizzato tramite un componente.Calendariovediamo come.
Component
Per prima cosa creiamo un nuovo componenteNew componentVanno aggiunte due gallery blank vertical, una per l'header delle colonne e uno per i giorni del mese:Gallery blank verticalIl nuovo componente avrà questa struttura:
CompSgartCalendar
lblCopyright
glryHeader
lblHeader
rectHeader
glryDays
lblDay
icnEvent
icnToday
rectDay
Ogni componente dovrà avere le proprietà impostate in modo appropriato, vedi dopo.
Custom properties
Perchè funzioni, vanno aggiunte delle custom properties al componente:Custom properties
#class=table-striped
Display name;Name;Property Type;Data Type;Rise OnReset;DefaultValue
Current date;CurrentDate;Input;Date andTime;true;Today()
Current day color;CurrentDayColor;Input;Color;false;RGBA(128, 0, 0, 1)
Event dates;EventDates;Input;Table;false;[Today(), Today()+1]
Event color;eventColor;Input;Color;false;RGBA(255, 0, 0, 1)
Header labels;HeaderLabels;Input;Table;false;["Lun", "Mar", "Mer", "Gio", "Ven","Sab", "Dom"]
Header fill;HeaderFill;Input;Color;false;RGBA(255, 119, 40, 1)
Header color;HeaderColor;Input;Color;false;RGBA(250, 250,250, 1)
Day fill;DayFill;Input;Color;false;RGBA(246, 239, 221, 1)
Day color;DayColor;Input;Color;false;RGBA(0, 0, 0, 1)
Selectedcolor;SelectedColor;Input;Color;false;RGBA(255, 119, 40, .5)
Selected date;SelectedDate;Output;Date and time;false;_selectedDate
i valori di default delle proprietà possono essere impostate andando nella scheda AdvancedAdvanced default propertyLe proprietà permettono di impostare la data del mese da visualizzare, i colori dei vari elementi, oltre a poter ottenere la proprietà di uscita (SelectedDate).
Set componente
Il passo successivo è fare alcune inizializzazioni nell'evento OnResetOnReset
Power Apps
/* giorno corrente */
Set(_currentDate, Today());
If(IsBlank(CompSgartCalendar.CurrentDate) = false, Set(_currentDate, CompSgartCalendar.CurrentDate));
/* data scelta dall'utente di output */
Set(_selectedDate, _currentDate);
/* anno, mese, giorno corrente */
Set(_year, Year(_currentDate));
Set(_month, Month(_currentDate));
Set(_day, Day(_currentDate));
/* primo giorno del mese */
Set(_date1, DateAdd(_currentDate, -_day + 1, Days));
/* determino il gioro della sittimana */
Set(_dayOffset, Weekday(_date1, StartOfWeek.Monday)-1);
/* primo giorno visualizzato sul calenario */
Set(_firstDate, DateAdd(_date1, -_dayOffset,Days));
/* calcolo l'ultimo indice da visualizzare */
Set(_lastDay, Day(DateAdd(DateAdd(_date1, 1, Months), -1, Days)));
Set(_lastIndex, If(_dayOffset + _lastDay > 34, 41, 34));
A questo punto si possono impostare le proprietà dei controlli per:
rendere il controllo responsive
visualizzare il giorno corrente (Today)
visualizzare un segno di spunta se la data è una di quelle passate nella proprietà EventDates
evidenziare il giorno selezionato tramite click (valore che verrà riportato nella property di output SelectedDate)
Entrando nel dettaglio, le proprietà dei controlli andranno impostate nel modo seguente:
In particolare la gallery glryDays dovrà avere la proprietà Items impostata con una collection fissa che copra il numero di giorni visualizzabili: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41].
Sia glryHeader che glryDays dovranno avere la proprietà WrapCount uguale a 7 per fare in modo che le colonne si ripetano orizzontalmente.
La proprietà Text della label lblDay dovrà visualizzare il giorno corretto: Day(DateAdd(_firstDate, ThisItem.Value, Days)).
Il background del rettangolo rectDay, proprietà Fill, evidenzierà se il giorno fa parte o meno del mese selezionato:If(_month = Month(DateAdd(_firstDate, ThisItem.Value, Days)) ,CompSgartCalendar.DayFill, RGBA(0,0,0,0))
Screen
Una volta realizzato il componente può essere aggiunto alla pagina (screen):componente in paginaNell'esempio i controlli hanno questa struttura:
ScrnCalendar
icnright
icnLeft
lblMontYear
lblTitleEvents
lblSelected
lblTitleSelected
DatePicker1
CompSgartCalendar_1 (il componente appena realizzato)
glryDates
lblDate
lblDay
icnEvent
icnToday
rectDay
dove le proprietà principali vanno impostate in questo modo:
La collection TableDates contiene le date degli eventi da visualizzare sul calendario. La label lblSelected visualizza il parametro di output del calendario SelectedDate.
Realizzare questo controllo è un buon esercizio didattico che aiuta a prendere familiarità con il mondo Power Apps e i componenti.
Alternativa
Come dicevo all'inizio, non esiste un controllo calendario nativo, ma esiste un template di schermo di tipo calendario.Template screen calendarQuesto template aggiunge un calendario con tutti i controlli di navigazione e un data source collegato al calendario dell'utente:Screen con calendarpuò essere un ottima base di partenza per eventuali personalizzazioni, come ad esempio cambiare il data source e farlo puntare a un data source diverso.