Calendar rendering implementation.
This commit is contained in:
@@ -1,26 +0,0 @@
|
||||
using System;
|
||||
using Itenso.TimePeriod;
|
||||
using Wino.Core.Domain.Collections;
|
||||
|
||||
namespace Wino.Core.Domain.Models.Calendar;
|
||||
|
||||
/// <summary>
|
||||
/// Represents a day in the calendar.
|
||||
/// Can hold events, appointments, wheather status etc.
|
||||
/// </summary>
|
||||
public class CalendarDayModel
|
||||
{
|
||||
public ITimePeriod Period { get; }
|
||||
public CalendarEventCollection EventsCollection { get; }
|
||||
|
||||
public CalendarDayModel(DateTime representingDate, CalendarRenderOptions calendarRenderOptions)
|
||||
{
|
||||
RepresentingDate = representingDate;
|
||||
Period = new TimeRange(representingDate, representingDate.AddDays(1));
|
||||
CalendarRenderOptions = calendarRenderOptions;
|
||||
EventsCollection = new CalendarEventCollection(Period, calendarRenderOptions.CalendarSettings);
|
||||
}
|
||||
|
||||
public DateTime RepresentingDate { get; }
|
||||
public CalendarRenderOptions CalendarRenderOptions { get; }
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
namespace Wino.Core.Domain.Models.Calendar;
|
||||
|
||||
public class CalendarRenderOptions
|
||||
{
|
||||
public CalendarRenderOptions(DateRange dateRange, CalendarSettings calendarSettings)
|
||||
{
|
||||
DateRange = dateRange;
|
||||
CalendarSettings = calendarSettings;
|
||||
}
|
||||
public int TotalDayCount => DateRange.TotalDays;
|
||||
public DateRange DateRange { get; }
|
||||
public CalendarSettings CalendarSettings { get; }
|
||||
}
|
||||
@@ -13,7 +13,8 @@ public record CalendarSettings(DayOfWeek FirstDayOfWeek,
|
||||
TimeSpan WorkingHourEnd,
|
||||
double HourHeight,
|
||||
DayHeaderDisplayType DayHeaderDisplayType,
|
||||
CultureInfo CultureInfo)
|
||||
CultureInfo CultureInfo,
|
||||
string TimedDayHeaderDateFormat = "ddd dd")
|
||||
{
|
||||
public int WorkWeekDayCount
|
||||
{
|
||||
@@ -65,4 +66,35 @@ public record CalendarSettings(DayOfWeek FirstDayOfWeek,
|
||||
var dateTime = DateTime.Today.Add(timeSpan);
|
||||
return dateTime.ToString(format, CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
public string GetTimedDayHeaderText(DateOnly date)
|
||||
{
|
||||
var format = string.IsNullOrWhiteSpace(TimedDayHeaderDateFormat) ? "ddd dd" : TimedDayHeaderDateFormat;
|
||||
|
||||
try
|
||||
{
|
||||
return date.ToDateTime(TimeOnly.MinValue).ToString(format, CultureInfo);
|
||||
}
|
||||
catch (FormatException)
|
||||
{
|
||||
return date.ToDateTime(TimeOnly.MinValue).ToString("ddd dd", CultureInfo);
|
||||
}
|
||||
}
|
||||
|
||||
public string GetTimedHourLabelText(int hour)
|
||||
{
|
||||
if (hour < 0 || hour > 24)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException(nameof(hour));
|
||||
}
|
||||
|
||||
if (DayHeaderDisplayType == DayHeaderDisplayType.TwentyFourHour)
|
||||
{
|
||||
return hour.ToString(CultureInfo);
|
||||
}
|
||||
|
||||
var displayHour = hour % 24;
|
||||
var dateTime = DateTime.Today.AddHours(displayHour);
|
||||
return dateTime.ToString("h tt", CultureInfo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
namespace Wino.Core.Domain.Models.Calendar;
|
||||
|
||||
public class DayHeaderRenderModel
|
||||
{
|
||||
public DayHeaderRenderModel(string dayHeader, double hourHeight)
|
||||
{
|
||||
DayHeader = dayHeader;
|
||||
HourHeight = hourHeight;
|
||||
}
|
||||
|
||||
public string DayHeader { get; }
|
||||
public double HourHeight { get; }
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Itenso.TimePeriod;
|
||||
using Wino.Core.Domain.Enums;
|
||||
|
||||
namespace Wino.Core.Domain.Models.Calendar;
|
||||
|
||||
/// <summary>
|
||||
/// Represents a range of days in the calendar.
|
||||
/// Corresponds to 1 view of the FlipView in CalendarPage.
|
||||
/// </summary>
|
||||
public class DayRangeRenderModel
|
||||
{
|
||||
public ITimePeriod Period { get; }
|
||||
public List<CalendarDayModel> CalendarDays { get; } = [];
|
||||
|
||||
// TODO: Get rid of this at some point.
|
||||
public List<DayHeaderRenderModel> DayHeaders { get; } = [];
|
||||
public CalendarRenderOptions CalendarRenderOptions { get; }
|
||||
|
||||
public int TotalDays => CalendarRenderOptions.TotalDayCount;
|
||||
|
||||
public DayRangeRenderModel(CalendarRenderOptions calendarRenderOptions)
|
||||
{
|
||||
CalendarRenderOptions = calendarRenderOptions;
|
||||
|
||||
for (var i = 0; i < CalendarRenderOptions.TotalDayCount; i++)
|
||||
{
|
||||
var representingDate = calendarRenderOptions.DateRange.StartDate.AddDays(i);
|
||||
var calendarDayModel = new CalendarDayModel(representingDate, calendarRenderOptions);
|
||||
|
||||
CalendarDays.Add(calendarDayModel);
|
||||
}
|
||||
|
||||
Period = new TimeRange(CalendarDays.First().RepresentingDate, CalendarDays.Last().RepresentingDate.AddDays(1));
|
||||
|
||||
// Create day headers based on culture info.
|
||||
|
||||
for (var i = 0; i < 24; i++)
|
||||
{
|
||||
var representingDate = calendarRenderOptions.DateRange.StartDate.Date.AddHours(i);
|
||||
|
||||
string dayHeader = calendarRenderOptions.CalendarSettings.DayHeaderDisplayType switch
|
||||
{
|
||||
DayHeaderDisplayType.TwelveHour => representingDate.ToString("h tt", calendarRenderOptions.CalendarSettings.CultureInfo),
|
||||
DayHeaderDisplayType.TwentyFourHour => representingDate.ToString("HH", calendarRenderOptions.CalendarSettings.CultureInfo),
|
||||
_ => "N/A"
|
||||
};
|
||||
|
||||
DayHeaders.Add(new DayHeaderRenderModel(dayHeader, calendarRenderOptions.CalendarSettings.HourHeight));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user