Files
Wino-Mail/Wino.Core.Domain/Models/Calendar/CalendarSettings.cs
T
2026-03-23 14:56:36 +01:00

101 lines
3.1 KiB
C#

using System;
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,
DayOfWeek WorkWeekStart,
DayOfWeek WorkWeekEnd,
TimeSpan WorkingHourStart,
TimeSpan WorkingHourEnd,
double HourHeight,
DayHeaderDisplayType DayHeaderDisplayType,
CultureInfo CultureInfo,
string TimedDayHeaderDateFormat = "ddd dd")
{
public int WorkWeekDayCount
{
get
{
var startOffset = GetWeekOffset(WorkWeekStart);
var endOffset = GetWeekOffset(WorkWeekEnd);
if (endOffset < startOffset)
{
endOffset += 7;
}
return (endOffset - startOffset) + 1;
}
}
public int GetWeekOffset(DayOfWeek dayOfWeek)
=> ((int)dayOfWeek - (int)FirstDayOfWeek + 7) % 7;
public TimeSpan? GetTimeSpan(string selectedTime)
{
// 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;
}
}
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);
}
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);
}
}