|
221 | 221 | </div> |
222 | 222 | } |
223 | 223 |
|
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"> |
225 | 226 | @{ |
226 | 227 | string? commonTitle = selectedEvents |
227 | 228 | .Select(e => e.ModifiedEvent.Title) |
|
345 | 346 | return @<text><del>@original</del> @modified</text>; |
346 | 347 | } |
347 | 348 |
|
| 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 | + |
348 | 361 | private static RenderFragment RenderDateDiff(EventContext eventContext) |
349 | 362 | { |
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>; |
354 | 386 | } |
355 | 387 |
|
356 | | - private static string Format(LocalDate localDate) |
| 388 | + private static RenderFragment Render(OriginalAndModified<Interval<LocalTime>> times) |
357 | 389 | { |
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>; |
360 | 395 | } |
| 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>; |
361 | 409 |
|
362 | | - private static string Format(LocalTime localTime) |
| 410 | + private static string Render(LocalTime localTime) |
363 | 411 | { |
364 | 412 | return localTime.ToString("HH:mm", SharedUtils.HungarianCulture); |
365 | 413 | } |
|
0 commit comments