@@ -2,25 +2,26 @@
|
||||
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
|
||||
namespace Wino.Core.Domain.Models.Calendar
|
||||
{
|
||||
public ITimePeriod Period { get; }
|
||||
public CalendarEventCollection EventsCollection { get; }
|
||||
|
||||
public CalendarDayModel(DateTime representingDate, CalendarRenderOptions calendarRenderOptions)
|
||||
/// <summary>
|
||||
/// Represents a day in the calendar.
|
||||
/// Can hold events, appointments, wheather status etc.
|
||||
/// </summary>
|
||||
public class CalendarDayModel
|
||||
{
|
||||
RepresentingDate = representingDate;
|
||||
Period = new TimeRange(representingDate, representingDate.AddDays(1));
|
||||
CalendarRenderOptions = calendarRenderOptions;
|
||||
EventsCollection = new CalendarEventCollection(Period, calendarRenderOptions.CalendarSettings);
|
||||
}
|
||||
public ITimePeriod Period { get; }
|
||||
public CalendarEventCollection EventsCollection { get; }
|
||||
|
||||
public DateTime RepresentingDate { get; }
|
||||
public CalendarRenderOptions CalendarRenderOptions { 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,6 +1,7 @@
|
||||
using Wino.Core.Domain.Entities.Calendar;
|
||||
using Wino.Core.Domain.Enums;
|
||||
|
||||
namespace Wino.Core.Domain.Models.Calendar;
|
||||
|
||||
public record CalendarItemTarget(CalendarItem Item, CalendarEventTargetType TargetType);
|
||||
namespace Wino.Core.Domain.Models.Calendar
|
||||
{
|
||||
public record CalendarItemTarget(CalendarItem Item, CalendarEventTargetType TargetType);
|
||||
}
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
using System;
|
||||
|
||||
namespace Wino.Core.Domain.Models.Calendar;
|
||||
|
||||
public class CalendarPageNavigationArgs
|
||||
namespace Wino.Core.Domain.Models.Calendar
|
||||
{
|
||||
/// <summary>
|
||||
/// When the app launches, automatically request the default calendar navigation options.
|
||||
/// </summary>
|
||||
public bool RequestDefaultNavigation { get; set; }
|
||||
public class CalendarPageNavigationArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// When the app launches, automatically request the default calendar navigation options.
|
||||
/// </summary>
|
||||
public bool RequestDefaultNavigation { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Display the calendar view for the specified date.
|
||||
/// </summary>
|
||||
public DateTime NavigationDate { get; set; }
|
||||
/// <summary>
|
||||
/// Display the calendar view for the specified date.
|
||||
/// </summary>
|
||||
public DateTime NavigationDate { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
namespace Wino.Core.Domain.Models.Calendar;
|
||||
|
||||
public class CalendarRenderOptions
|
||||
namespace Wino.Core.Domain.Models.Calendar
|
||||
{
|
||||
public CalendarRenderOptions(DateRange dateRange, CalendarSettings calendarSettings)
|
||||
public class CalendarRenderOptions
|
||||
{
|
||||
DateRange = dateRange;
|
||||
CalendarSettings = calendarSettings;
|
||||
public CalendarRenderOptions(DateRange dateRange, CalendarSettings calendarSettings)
|
||||
{
|
||||
DateRange = dateRange;
|
||||
CalendarSettings = calendarSettings;
|
||||
}
|
||||
public int TotalDayCount => DateRange.TotalDays;
|
||||
public DateRange DateRange { get; }
|
||||
public CalendarSettings CalendarSettings { get; }
|
||||
}
|
||||
public int TotalDayCount => DateRange.TotalDays;
|
||||
public DateRange DateRange { get; }
|
||||
public CalendarSettings CalendarSettings { get; }
|
||||
}
|
||||
|
||||
@@ -3,45 +3,46 @@ using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using Wino.Core.Domain.Enums;
|
||||
|
||||
namespace Wino.Core.Domain.Models.Calendar;
|
||||
|
||||
public record CalendarSettings(DayOfWeek FirstDayOfWeek,
|
||||
List<DayOfWeek> WorkingDays,
|
||||
TimeSpan WorkingHourStart,
|
||||
TimeSpan WorkingHourEnd,
|
||||
double HourHeight,
|
||||
DayHeaderDisplayType DayHeaderDisplayType,
|
||||
CultureInfo CultureInfo)
|
||||
namespace Wino.Core.Domain.Models.Calendar
|
||||
{
|
||||
public TimeSpan? GetTimeSpan(string selectedTime)
|
||||
public record CalendarSettings(DayOfWeek FirstDayOfWeek,
|
||||
List<DayOfWeek> WorkingDays,
|
||||
TimeSpan WorkingHourStart,
|
||||
TimeSpan WorkingHourEnd,
|
||||
double HourHeight,
|
||||
DayHeaderDisplayType DayHeaderDisplayType,
|
||||
CultureInfo CultureInfo)
|
||||
{
|
||||
// Regardless of the format, we need to parse the time to a TimeSpan.
|
||||
// User may list as 14:00 but enters 2:00 PM by input.
|
||||
// Be flexible, not annoying.
|
||||
|
||||
if (DateTime.TryParse(selectedTime, out DateTime parsedTime))
|
||||
public TimeSpan? GetTimeSpan(string selectedTime)
|
||||
{
|
||||
return parsedTime.TimeOfDay;
|
||||
// Regardless of the format, we need to parse the time to a TimeSpan.
|
||||
// User may list as 14:00 but enters 2:00 PM by input.
|
||||
// Be flexible, not annoying.
|
||||
|
||||
if (DateTime.TryParse(selectedTime, out DateTime parsedTime))
|
||||
{
|
||||
return parsedTime.TimeOfDay;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
public string GetTimeString(TimeSpan timeSpan)
|
||||
{
|
||||
return null;
|
||||
// Here we don't need to be flexible cuz we're saving back the value to the combos.
|
||||
// They are populated based on the format and must be returned with the format.
|
||||
|
||||
var format = DayHeaderDisplayType switch
|
||||
{
|
||||
DayHeaderDisplayType.TwelveHour => "h:mm tt",
|
||||
DayHeaderDisplayType.TwentyFourHour => "HH:mm",
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(DayHeaderDisplayType))
|
||||
};
|
||||
|
||||
var dateTime = DateTime.Today.Add(timeSpan);
|
||||
return dateTime.ToString(format, CultureInfo.InvariantCulture);
|
||||
}
|
||||
}
|
||||
|
||||
public string GetTimeString(TimeSpan timeSpan)
|
||||
{
|
||||
// Here we don't need to be flexible cuz we're saving back the value to the combos.
|
||||
// They are populated based on the format and must be returned with the format.
|
||||
|
||||
var format = DayHeaderDisplayType switch
|
||||
{
|
||||
DayHeaderDisplayType.TwelveHour => "h:mm tt",
|
||||
DayHeaderDisplayType.TwentyFourHour => "HH:mm",
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(DayHeaderDisplayType))
|
||||
};
|
||||
|
||||
var dateTime = DateTime.Today.Add(timeSpan);
|
||||
return dateTime.ToString(format, CultureInfo.InvariantCulture);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,36 +2,37 @@
|
||||
using Wino.Core.Domain.Enums;
|
||||
using Wino.Core.Domain.Models.Calendar;
|
||||
|
||||
namespace Wino.Core.Domain.Models.Calendar.CalendarTypeStrategies;
|
||||
|
||||
public abstract class BaseCalendarTypeDrawingStrategy
|
||||
namespace Wino.Core.Domain.Models.Calendar.CalendarTypeStrategies
|
||||
{
|
||||
public CalendarSettings Settings { get; }
|
||||
public CalendarDisplayType HandlingType { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Day range of the pre-rendered items.
|
||||
/// </summary>
|
||||
public abstract DateRange GetRenderDateRange(DateTime DisplayDate, int DayDisplayCount);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the previous date range for rendering.
|
||||
/// For example, 1 week view with 7 days will return -7 <> 0 days.
|
||||
/// </summary>
|
||||
/// <param name="CurrentDateRange">Current displayed date range.</param>
|
||||
/// <param name="DayDisplayCount">Day display count/</param>
|
||||
public abstract DateRange GetPreviousDateRange(DateRange CurrentDateRange, int DayDisplayCount);
|
||||
|
||||
public abstract DateRange GetNextDateRange(DateRange CurrentDateRange, int DayDisplayCount);
|
||||
|
||||
/// <summary>
|
||||
/// How many items should be placed in 1 FlipViewItem.
|
||||
/// </summary>
|
||||
public abstract int GetRenderDayCount(DateTime DisplayDate, int DayDisplayCount);
|
||||
|
||||
protected BaseCalendarTypeDrawingStrategy(CalendarSettings settings, CalendarDisplayType handlingType)
|
||||
public abstract class BaseCalendarTypeDrawingStrategy
|
||||
{
|
||||
Settings = settings;
|
||||
HandlingType = handlingType;
|
||||
public CalendarSettings Settings { get; }
|
||||
public CalendarDisplayType HandlingType { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Day range of the pre-rendered items.
|
||||
/// </summary>
|
||||
public abstract DateRange GetRenderDateRange(DateTime DisplayDate, int DayDisplayCount);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the previous date range for rendering.
|
||||
/// For example, 1 week view with 7 days will return -7 <> 0 days.
|
||||
/// </summary>
|
||||
/// <param name="CurrentDateRange">Current displayed date range.</param>
|
||||
/// <param name="DayDisplayCount">Day display count/</param>
|
||||
public abstract DateRange GetPreviousDateRange(DateRange CurrentDateRange, int DayDisplayCount);
|
||||
|
||||
public abstract DateRange GetNextDateRange(DateRange CurrentDateRange, int DayDisplayCount);
|
||||
|
||||
/// <summary>
|
||||
/// How many items should be placed in 1 FlipViewItem.
|
||||
/// </summary>
|
||||
public abstract int GetRenderDayCount(DateTime DisplayDate, int DayDisplayCount);
|
||||
|
||||
protected BaseCalendarTypeDrawingStrategy(CalendarSettings settings, CalendarDisplayType handlingType)
|
||||
{
|
||||
Settings = settings;
|
||||
HandlingType = handlingType;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,34 +2,35 @@
|
||||
using Wino.Core.Domain.Enums;
|
||||
using Wino.Core.Domain.Models.Calendar;
|
||||
|
||||
namespace Wino.Core.Domain.Models.Calendar.CalendarTypeStrategies;
|
||||
|
||||
public class DayCalendarDrawingStrategy : BaseCalendarTypeDrawingStrategy
|
||||
namespace Wino.Core.Domain.Models.Calendar.CalendarTypeStrategies
|
||||
{
|
||||
public DayCalendarDrawingStrategy(CalendarSettings settings) : base(settings, CalendarDisplayType.Day)
|
||||
public class DayCalendarDrawingStrategy : BaseCalendarTypeDrawingStrategy
|
||||
{
|
||||
public DayCalendarDrawingStrategy(CalendarSettings settings) : base(settings, CalendarDisplayType.Day)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override DateRange GetNextDateRange(DateRange CurrentDateRange, int DayDisplayCount)
|
||||
{
|
||||
return new DateRange(CurrentDateRange.EndDate, CurrentDateRange.EndDate.AddDays(DayDisplayCount * 5));
|
||||
}
|
||||
|
||||
public override DateRange GetPreviousDateRange(DateRange CurrentDateRange, int DayDisplayCount)
|
||||
{
|
||||
return new DateRange(CurrentDateRange.StartDate.AddDays(-DayDisplayCount * 5), CurrentDateRange.StartDate);
|
||||
}
|
||||
|
||||
public override DateRange GetRenderDateRange(DateTime DisplayDate, int DayDisplayCount)
|
||||
{
|
||||
// Add good amount of days to the left and right of the DisplayDate.
|
||||
|
||||
var start = DisplayDate.AddDays(-4 * DayDisplayCount);
|
||||
var end = DisplayDate.AddDays(4 * DayDisplayCount);
|
||||
|
||||
return new DateRange(start, end);
|
||||
}
|
||||
|
||||
public override int GetRenderDayCount(DateTime DisplayDate, int DayDisplayCount) => DayDisplayCount;
|
||||
}
|
||||
|
||||
public override DateRange GetNextDateRange(DateRange CurrentDateRange, int DayDisplayCount)
|
||||
{
|
||||
return new DateRange(CurrentDateRange.EndDate, CurrentDateRange.EndDate.AddDays(DayDisplayCount * 5));
|
||||
}
|
||||
|
||||
public override DateRange GetPreviousDateRange(DateRange CurrentDateRange, int DayDisplayCount)
|
||||
{
|
||||
return new DateRange(CurrentDateRange.StartDate.AddDays(-DayDisplayCount * 5), CurrentDateRange.StartDate);
|
||||
}
|
||||
|
||||
public override DateRange GetRenderDateRange(DateTime DisplayDate, int DayDisplayCount)
|
||||
{
|
||||
// Add good amount of days to the left and right of the DisplayDate.
|
||||
|
||||
var start = DisplayDate.AddDays(-4 * DayDisplayCount);
|
||||
var end = DisplayDate.AddDays(4 * DayDisplayCount);
|
||||
|
||||
return new DateRange(start, end);
|
||||
}
|
||||
|
||||
public override int GetRenderDayCount(DateTime DisplayDate, int DayDisplayCount) => DayDisplayCount;
|
||||
}
|
||||
|
||||
@@ -2,31 +2,32 @@
|
||||
using Wino.Core.Domain.Enums;
|
||||
using Wino.Core.Domain.Extensions;
|
||||
|
||||
namespace Wino.Core.Domain.Models.Calendar.CalendarTypeStrategies;
|
||||
|
||||
public class MonthCalendarDrawingStrategy : BaseCalendarTypeDrawingStrategy
|
||||
namespace Wino.Core.Domain.Models.Calendar.CalendarTypeStrategies
|
||||
{
|
||||
public MonthCalendarDrawingStrategy(CalendarSettings settings)
|
||||
: base(settings, CalendarDisplayType.Month)
|
||||
public class MonthCalendarDrawingStrategy : BaseCalendarTypeDrawingStrategy
|
||||
{
|
||||
}
|
||||
public MonthCalendarDrawingStrategy(CalendarSettings settings)
|
||||
: base(settings, CalendarDisplayType.Month)
|
||||
{
|
||||
}
|
||||
|
||||
public override DateRange GetNextDateRange(DateRange CurrentDateRange, int DayDisplayCount)
|
||||
{
|
||||
return new DateRange(CurrentDateRange.EndDate, CurrentDateRange.EndDate.AddDays(35));
|
||||
}
|
||||
public override DateRange GetNextDateRange(DateRange CurrentDateRange, int DayDisplayCount)
|
||||
{
|
||||
return new DateRange(CurrentDateRange.EndDate, CurrentDateRange.EndDate.AddDays(35));
|
||||
}
|
||||
|
||||
public override DateRange GetPreviousDateRange(DateRange CurrentDateRange, int DayDisplayCount)
|
||||
{
|
||||
return new DateRange(CurrentDateRange.StartDate.AddDays(-35), CurrentDateRange.StartDate);
|
||||
}
|
||||
public override DateRange GetPreviousDateRange(DateRange CurrentDateRange, int DayDisplayCount)
|
||||
{
|
||||
return new DateRange(CurrentDateRange.StartDate.AddDays(-35), CurrentDateRange.StartDate);
|
||||
}
|
||||
|
||||
public override DateRange GetRenderDateRange(DateTime DisplayDate, int DayDisplayCount)
|
||||
{
|
||||
// Get the first day of the month.
|
||||
var firstDayOfMonth = new DateTime(DisplayDate.Year, DisplayDate.Month, 1);
|
||||
return DateTimeExtensions.GetMonthDateRangeStartingWeekday(firstDayOfMonth, Settings.FirstDayOfWeek);
|
||||
}
|
||||
public override DateRange GetRenderDateRange(DateTime DisplayDate, int DayDisplayCount)
|
||||
{
|
||||
// Get the first day of the month.
|
||||
var firstDayOfMonth = new DateTime(DisplayDate.Year, DisplayDate.Month, 1);
|
||||
return DateTimeExtensions.GetMonthDateRangeStartingWeekday(firstDayOfMonth, Settings.FirstDayOfWeek);
|
||||
}
|
||||
|
||||
public override int GetRenderDayCount(DateTime DisplayDate, int DayDisplayCount) => 35;
|
||||
public override int GetRenderDayCount(DateTime DisplayDate, int DayDisplayCount) => 35;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,34 +1,35 @@
|
||||
using System;
|
||||
using Wino.Core.Domain.Models.Calendar;
|
||||
|
||||
namespace Wino.Core.Domain.Models.Calendar.CalendarTypeStrategies;
|
||||
|
||||
public class WeekCalendarDrawingStrategy : BaseCalendarTypeDrawingStrategy
|
||||
namespace Wino.Core.Domain.Models.Calendar.CalendarTypeStrategies
|
||||
{
|
||||
public WeekCalendarDrawingStrategy(CalendarSettings settings) : base(settings, Enums.CalendarDisplayType.Week) { }
|
||||
|
||||
public override DateRange GetNextDateRange(DateRange CurrentDateRange, int DayDisplayCount)
|
||||
=> new DateRange(CurrentDateRange.EndDate, CurrentDateRange.EndDate.AddDays(7 * 2));
|
||||
|
||||
public override DateRange GetPreviousDateRange(DateRange CurrentDateRange, int DayDisplayCount)
|
||||
=> new DateRange(CurrentDateRange.StartDate.AddDays(-7 * 2), CurrentDateRange.StartDate);
|
||||
|
||||
public override DateRange GetRenderDateRange(DateTime DisplayDate, int DayDisplayCount)
|
||||
public class WeekCalendarDrawingStrategy : BaseCalendarTypeDrawingStrategy
|
||||
{
|
||||
// Detect the first day of the week that contains the selected date.
|
||||
DayOfWeek firstDayOfWeek = Settings.FirstDayOfWeek;
|
||||
public WeekCalendarDrawingStrategy(CalendarSettings settings) : base(settings, Enums.CalendarDisplayType.Week) { }
|
||||
|
||||
int diff = (7 + (DisplayDate.DayOfWeek - Settings.FirstDayOfWeek)) % 7;
|
||||
public override DateRange GetNextDateRange(DateRange CurrentDateRange, int DayDisplayCount)
|
||||
=> new DateRange(CurrentDateRange.EndDate, CurrentDateRange.EndDate.AddDays(7 * 2));
|
||||
|
||||
// Start loading from this date instead of visible date.
|
||||
var weekStartDate = DisplayDate.AddDays(-diff).Date;
|
||||
public override DateRange GetPreviousDateRange(DateRange CurrentDateRange, int DayDisplayCount)
|
||||
=> new DateRange(CurrentDateRange.StartDate.AddDays(-7 * 2), CurrentDateRange.StartDate);
|
||||
|
||||
// Load -+ 14 days
|
||||
var startDate = weekStartDate.AddDays(-14);
|
||||
var endDte = weekStartDate.AddDays(14);
|
||||
public override DateRange GetRenderDateRange(DateTime DisplayDate, int DayDisplayCount)
|
||||
{
|
||||
// Detect the first day of the week that contains the selected date.
|
||||
DayOfWeek firstDayOfWeek = Settings.FirstDayOfWeek;
|
||||
|
||||
return new DateRange(startDate, endDte);
|
||||
int diff = (7 + (DisplayDate.DayOfWeek - Settings.FirstDayOfWeek)) % 7;
|
||||
|
||||
// Start loading from this date instead of visible date.
|
||||
var weekStartDate = DisplayDate.AddDays(-diff).Date;
|
||||
|
||||
// Load -+ 14 days
|
||||
var startDate = weekStartDate.AddDays(-14);
|
||||
var endDte = weekStartDate.AddDays(14);
|
||||
|
||||
return new DateRange(startDate, endDte);
|
||||
}
|
||||
|
||||
public override int GetRenderDayCount(DateTime DisplayDate, int DayDisplayCount) => 7;
|
||||
}
|
||||
|
||||
public override int GetRenderDayCount(DateTime DisplayDate, int DayDisplayCount) => 7;
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
using System;
|
||||
|
||||
namespace Wino.Core.Domain.Models.Calendar;
|
||||
|
||||
/// <summary>
|
||||
/// Contains the clicked date on the calendar view.
|
||||
/// </summary>
|
||||
/// <param name="ClickedDate">Requested date.</param>
|
||||
public record CalendarViewDayClickedEventArgs(DateTime ClickedDate);
|
||||
namespace Wino.Core.Domain.Models.Calendar
|
||||
{
|
||||
/// <summary>
|
||||
/// Contains the clicked date on the calendar view.
|
||||
/// </summary>
|
||||
/// <param name="ClickedDate">Requested date.</param>
|
||||
public record CalendarViewDayClickedEventArgs(DateTime ClickedDate);
|
||||
}
|
||||
|
||||
@@ -1,41 +1,42 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace Wino.Core.Domain.Models.Calendar;
|
||||
|
||||
public class DateRange
|
||||
namespace Wino.Core.Domain.Models.Calendar
|
||||
{
|
||||
public DateRange(DateTime startDate, DateTime endDate)
|
||||
public class DateRange
|
||||
{
|
||||
StartDate = startDate;
|
||||
EndDate = endDate;
|
||||
}
|
||||
public DateRange(DateTime startDate, DateTime endDate)
|
||||
{
|
||||
StartDate = startDate;
|
||||
EndDate = endDate;
|
||||
}
|
||||
|
||||
public DateTime StartDate { get; }
|
||||
public DateTime EndDate { get; }
|
||||
public DateTime StartDate { get; }
|
||||
public DateTime EndDate { get; }
|
||||
|
||||
public int TotalDays => (EndDate - StartDate).Days;
|
||||
public int TotalDays => (EndDate - StartDate).Days;
|
||||
|
||||
public override string ToString() => $"{StartDate.ToString("dd MMMM")} - {EndDate.ToString("dd MMMM")}";
|
||||
public override string ToString() => $"{StartDate.ToString("dd MMMM")} - {EndDate.ToString("dd MMMM")}";
|
||||
|
||||
public bool IsInRange(DateTime date)
|
||||
{
|
||||
return date >= StartDate && date <= EndDate;
|
||||
}
|
||||
public bool IsInRange(DateTime date)
|
||||
{
|
||||
return date >= StartDate && date <= EndDate;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the most visible month index in the visible date range.
|
||||
/// </summary>
|
||||
public int GetMostVisibleMonthIndex()
|
||||
{
|
||||
var dateRange = Enumerable.Range(0, (EndDate - StartDate).Days + 1).Select(offset => StartDate.AddDays(offset));
|
||||
/// <summary>
|
||||
/// Gets the most visible month index in the visible date range.
|
||||
/// </summary>
|
||||
public int GetMostVisibleMonthIndex()
|
||||
{
|
||||
var dateRange = Enumerable.Range(0, (EndDate - StartDate).Days + 1).Select(offset => StartDate.AddDays(offset));
|
||||
|
||||
var groupedByMonth = dateRange.GroupBy(date => date.Month)
|
||||
.Select(g => new { Month = g.Key, DayCount = g.Count() });
|
||||
var groupedByMonth = dateRange.GroupBy(date => date.Month)
|
||||
.Select(g => new { Month = g.Key, DayCount = g.Count() });
|
||||
|
||||
// Find the month with the maximum count of days
|
||||
var mostVisibleMonth = groupedByMonth.OrderByDescending(g => g.DayCount).FirstOrDefault();
|
||||
// Find the month with the maximum count of days
|
||||
var mostVisibleMonth = groupedByMonth.OrderByDescending(g => g.DayCount).FirstOrDefault();
|
||||
|
||||
return mostVisibleMonth?.Month ?? -1;
|
||||
return mostVisibleMonth?.Month ?? -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
namespace Wino.Core.Domain.Models.Calendar;
|
||||
|
||||
public class DayHeaderRenderModel
|
||||
namespace Wino.Core.Domain.Models.Calendar
|
||||
{
|
||||
public DayHeaderRenderModel(string dayHeader, double hourHeight)
|
||||
public class DayHeaderRenderModel
|
||||
{
|
||||
DayHeader = dayHeader;
|
||||
HourHeight = hourHeight;
|
||||
}
|
||||
public DayHeaderRenderModel(string dayHeader, double hourHeight)
|
||||
{
|
||||
DayHeader = dayHeader;
|
||||
HourHeight = hourHeight;
|
||||
}
|
||||
|
||||
public string DayHeader { get; }
|
||||
public double HourHeight { get; }
|
||||
public string DayHeader { get; }
|
||||
public double HourHeight { get; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,49 +3,50 @@ 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
|
||||
namespace Wino.Core.Domain.Models.Calendar
|
||||
{
|
||||
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 DayRangeRenderModel(CalendarRenderOptions calendarRenderOptions)
|
||||
/// <summary>
|
||||
/// Represents a range of days in the calendar.
|
||||
/// Corresponds to 1 view of the FlipView in CalendarPage.
|
||||
/// </summary>
|
||||
public class DayRangeRenderModel
|
||||
{
|
||||
CalendarRenderOptions = calendarRenderOptions;
|
||||
public ITimePeriod Period { get; }
|
||||
public List<CalendarDayModel> CalendarDays { get; } = [];
|
||||
|
||||
for (var i = 0; i < CalendarRenderOptions.TotalDayCount; i++)
|
||||
// TODO: Get rid of this at some point.
|
||||
public List<DayHeaderRenderModel> DayHeaders { get; } = [];
|
||||
public CalendarRenderOptions CalendarRenderOptions { get; }
|
||||
|
||||
public DayRangeRenderModel(CalendarRenderOptions calendarRenderOptions)
|
||||
{
|
||||
var representingDate = calendarRenderOptions.DateRange.StartDate.AddDays(i);
|
||||
var calendarDayModel = new CalendarDayModel(representingDate, calendarRenderOptions);
|
||||
CalendarRenderOptions = 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
|
||||
for (var i = 0; i < CalendarRenderOptions.TotalDayCount; i++)
|
||||
{
|
||||
DayHeaderDisplayType.TwelveHour => representingDate.ToString("h tt", calendarRenderOptions.CalendarSettings.CultureInfo),
|
||||
DayHeaderDisplayType.TwentyFourHour => representingDate.ToString("HH", calendarRenderOptions.CalendarSettings.CultureInfo),
|
||||
_ => "N/A"
|
||||
};
|
||||
var representingDate = calendarRenderOptions.DateRange.StartDate.AddDays(i);
|
||||
var calendarDayModel = new CalendarDayModel(representingDate, calendarRenderOptions);
|
||||
|
||||
DayHeaders.Add(new DayHeaderRenderModel(dayHeader, calendarRenderOptions.CalendarSettings.HourHeight));
|
||||
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