Skip to content

Commit 938ab2e

Browse files
authored
Implement calendar editor date formatting (#204)
1 parent 7e7d09b commit 938ab2e

3 files changed

Lines changed: 63 additions & 10 deletions

File tree

StartSch.Wasm/Components/EventSettingsDialog.razor

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,8 @@
221221
</div>
222222
}
223223

224-
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(360px, 1fr)); margin-top: 16px; gap: 8px">
224+
<div
225+
style="display: grid; grid-template-columns: repeat(auto-fit, minmax(360px, 1fr)); margin-top: 16px; gap: 8px">
225226
@{
226227
string? commonTitle = selectedEvents
227228
.Select(e => e.ModifiedEvent.Title)
@@ -345,21 +346,68 @@
345346
return @<text><del>@original</del> @modified</text>;
346347
}
347348

349+
private readonly record struct Interval<T>(T Start, T End)
350+
{
351+
public Interval<TResult> Convert<TResult>(Func<T, TResult> convert)
352+
=> new(convert(Start), convert(End));
353+
}
354+
355+
private readonly record struct OriginalAndModified<T>(T Original, T Modified)
356+
{
357+
public OriginalAndModified<TResult> Convert<TResult>(Func<T, TResult> convert)
358+
=> new(convert(Original), convert(Modified));
359+
}
360+
348361
private static RenderFragment RenderDateDiff(EventContext eventContext)
349362
{
350-
Instant currentInstant = SystemClock.Instance.GetCurrentInstant();
351-
string original = DateFormatter.Format(eventContext.OriginalEvent.Start, eventContext.OriginalEvent.End, currentInstant);
352-
string modified = DateFormatter.Format(eventContext.ModifiedEvent.Start, eventContext.ModifiedEvent.End, currentInstant);
353-
return RenderStringDiff(original, modified);
363+
OriginalAndModified<Interval<Instant>> instants = new(
364+
new(eventContext.OriginalEvent.Start, eventContext.OriginalEvent.End),
365+
new(eventContext.ModifiedEvent.Start, eventContext.ModifiedEvent.End)
366+
);
367+
var dateTimes = instants.Convert(interval => interval.Convert(instant =>
368+
instant.InZone(SharedUtils.HungarianTimeZone).LocalDateTime
369+
));
370+
if (dateTimes.Original == dateTimes.Modified)
371+
return Render(dateTimes.Original);
372+
var dates = dateTimes.Convert(interval => interval.Convert(zonedDateTime => zonedDateTime.Date));
373+
var times = dateTimes.Convert(interval => interval.Convert(zonedDateTime => zonedDateTime.TimeOfDay));
374+
if (dates.Original == dates.Modified && dates.Original.Start == dates.Original.End)
375+
return @<text>@Render(dates.Original.Start)@Render(times)</text>;
376+
return @<text><del>@Render(dateTimes.Original)</del> @Render(dateTimes.Modified)</text>;
377+
}
378+
379+
private static RenderFragment Render(Interval<LocalDateTime> dateTimeInterval)
380+
{
381+
if (dateTimeInterval.Start == dateTimeInterval.End)
382+
return @<text>@Render(dateTimeInterval.Start)</text>;
383+
if (dateTimeInterval.Start.Date == dateTimeInterval.End.Date)
384+
return @<text>@Render(dateTimeInterval.Start.Date) @Render(dateTimeInterval.Start.TimeOfDay)@DateFormatter.EnDashString@Render(dateTimeInterval.End.TimeOfDay)</text>;
385+
return @<text>@Render(dateTimeInterval.Start)@DateFormatter.EnDashWithSpaces@Render(dateTimeInterval.End)</text>;
354386
}
355387

356-
private static string Format(LocalDate localDate)
388+
private static RenderFragment Render(OriginalAndModified<Interval<LocalTime>> times)
357389
{
358-
return localDate.ToString("yyyy. MM. dd., ", SharedUtils.HungarianCulture)
359-
+ SharedUtils.GetHungarianName(localDate.DayOfWeek);
390+
if (times.Original == times.Modified && times.Original.Start == times.Original.End)
391+
return @<text>@Render(times.Original.Start)</text>;
392+
if (times.Original == times.Modified)
393+
return @<text>@Render(times.Original)</text>;
394+
return @<text><del>@Render(times.Original)</del> @Render(times.Modified)</text>;
360395
}
396+
397+
private static RenderFragment Render(Interval<LocalTime> interval)
398+
{
399+
if (interval.Start == interval.End)
400+
return @<text>@Render(interval.Start)</text>;
401+
return @<text>@Render(interval.Start)@DateFormatter.EnDashString@Render(interval.End)</text>;
402+
}
403+
404+
private static RenderFragment Render(LocalDateTime localDateTime) =>
405+
@<text>@Render(localDateTime.Date) @Render(localDateTime.TimeOfDay)</text>;
406+
407+
private static RenderFragment Render(LocalDate localDate) =>
408+
@<text>@localDate.ToString("MM. dd., ", SharedUtils.HungarianCulture)@SharedUtils.GetHungarianName(localDate.DayOfWeek)</text>;
361409

362-
private static string Format(LocalTime localTime)
410+
private static string Render(LocalTime localTime)
363411
{
364412
return localTime.ToString("HH:mm", SharedUtils.HungarianCulture);
365413
}

StartSch.Wasm/DateFormatter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ namespace StartSch.Wasm;
1010
public static class DateFormatter
1111
{
1212
private const char EnDash = '–'; // "nagykötőjel"
13-
private static readonly string EnDashWithSpaces = $" {EnDash} ";
13+
public const string EnDashString = "–";
14+
public static string EnDashWithSpaces { get; } = $" {EnDash} ";
1415

1516
public static string Format(Instant date, Instant? end, Instant now)
1617
{

StartSch/js/components/calendar-view.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ export class CalendarView extends LitElement {
5050
--fc-highlight-color: color-mix(in srgb, var(--md-sys-color-primary) 10%, transparent);
5151
--fc-today-bg-color: color-mix(in srgb, var(--md-sys-color-primary) 5%, transparent);
5252
--fc-now-indicator-color: var(--md-sys-color-error);
53+
54+
a {
55+
cursor: pointer;
56+
}
5357
}
5458
`;
5559

0 commit comments

Comments
 (0)