Fix emoji rendering in PDF (#48)

This commit is contained in:
Copilot 2025-09-06 14:39:29 +02:00 committed by GitHub
parent a1f9f1313e
commit 3ed54f51ad
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -28,7 +28,7 @@ namespace ShiftScheduler.Services
{ {
container.Page(page => container.Page(page =>
{ {
page.Margin(30); page.Margin(15);
page.Size(PageSizes.A4.Landscape()); page.Size(PageSizes.A4.Landscape());
page.DefaultTextStyle(x => x.FontSize(10)); page.DefaultTextStyle(x => x.FontSize(10));
@ -98,26 +98,20 @@ namespace ShiftScheduler.Services
foreach (var day in Enumerable.Range(0, dayInWeek)) foreach (var day in Enumerable.Range(0, dayInWeek))
{ {
var shiftWithTransport = shiftsWithTransport.GetValueOrDefault(weekDates.ElementAtOrDefault(day)); var shiftWithTransport = shiftsWithTransport.GetValueOrDefault(weekDates.ElementAtOrDefault(day));
var shift = shiftWithTransport?.Shift; if (shiftWithTransport != null)
{
var shift = shiftWithTransport.Shift;
if (shift.IsPngIcon)
{
var iconPath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "icons", shift.Icon);
if (File.Exists(iconPath))
{
table.Cell().Height(24).Element(CellStyleMiddle).Image(iconPath).FitArea();
continue;
}
}
if (shift != null && shift.IsPngIcon) table.Cell().Element(CellStyleMiddle).Text(shift.Name);
{
// For PNG icons, embed the image
var iconPath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "icons", shift.Icon);
if (File.Exists(iconPath))
{
table.Cell().Height(24).Element(CellStyleMiddle).Image(iconPath).FitArea();
}
else
{
table.Cell().Element(CellStyleMiddle).Text(shift.Name);
}
}
else
{
// For text/emoji icons, render as text
var icon = shift?.Icon ?? shift?.Name;
table.Cell().Element(CellStyleMiddle).Text(icon);
} }
} }
foreach (var day in Enumerable.Range(dayInWeek, 7 - dayInWeek)) foreach (var day in Enumerable.Range(dayInWeek, 7 - dayInWeek))
@ -129,8 +123,14 @@ namespace ShiftScheduler.Services
foreach (var day in Enumerable.Range(0, dayInWeek)) foreach (var day in Enumerable.Range(0, dayInWeek))
{ {
var shiftWithTransport = shiftsWithTransport.GetValueOrDefault(weekDates.ElementAtOrDefault(day)); var shiftWithTransport = shiftsWithTransport.GetValueOrDefault(weekDates.ElementAtOrDefault(day));
var morningTime = shiftWithTransport?.Shift.MorningTime.Length > 0 ? $"🌅 {shiftWithTransport?.Shift.MorningTime}" : ""; if (!string.IsNullOrWhiteSpace(shiftWithTransport?.Shift.MorningTime))
table.Cell().Element(CellStyleMiddle).Text(morningTime); {
table.Cell().Element(CellStyleTimes).Text($" {shiftWithTransport.Shift.MorningTime}");
}
else
{
table.Cell().Element(CellStyleMiddle).Text("");
}
} }
foreach (var day in Enumerable.Range(dayInWeek, 7 - dayInWeek)) foreach (var day in Enumerable.Range(dayInWeek, 7 - dayInWeek))
{ {
@ -141,8 +141,14 @@ namespace ShiftScheduler.Services
foreach (var day in Enumerable.Range(0, dayInWeek)) foreach (var day in Enumerable.Range(0, dayInWeek))
{ {
var shiftWithTransport = shiftsWithTransport.GetValueOrDefault(weekDates.ElementAtOrDefault(day)); var shiftWithTransport = shiftsWithTransport.GetValueOrDefault(weekDates.ElementAtOrDefault(day));
var afternoonTime = shiftWithTransport?.Shift.AfternoonTime.Length > 0 ? $"🌆 {shiftWithTransport?.Shift.AfternoonTime}" : ""; if (!string.IsNullOrWhiteSpace(shiftWithTransport?.Shift.AfternoonTime))
table.Cell().Element(CellStyleMiddle).Text(afternoonTime); {
table.Cell().Element(CellStyleTimes).Text($" {shiftWithTransport.Shift.AfternoonTime}");
}
else
{
table.Cell().Element(CellStyleMiddle).Text("");
}
} }
foreach (var day in Enumerable.Range(dayInWeek, 7 - dayInWeek)) foreach (var day in Enumerable.Range(dayInWeek, 7 - dayInWeek))
{ {
@ -153,8 +159,14 @@ namespace ShiftScheduler.Services
foreach (var day in Enumerable.Range(0, dayInWeek)) foreach (var day in Enumerable.Range(0, dayInWeek))
{ {
var shiftWithTransport = shiftsWithTransport.GetValueOrDefault(weekDates.ElementAtOrDefault(day)); var shiftWithTransport = shiftsWithTransport.GetValueOrDefault(weekDates.ElementAtOrDefault(day));
var transportInfo = GetTransportSummary(shiftWithTransport); var transportSummary = GetTransportSummary(shiftWithTransport);
table.Cell().Element(CellStyleLast).Text(transportInfo); if (!string.IsNullOrWhiteSpace(transportSummary))
{
table.Cell().Element(CellStyleTransport).Text(transportSummary);
}
else {
table.Cell().Element(CellStyleLast).Text("");
}
} }
foreach (var day in Enumerable.Range(dayInWeek, 7 - dayInWeek)) foreach (var day in Enumerable.Range(dayInWeek, 7 - dayInWeek))
{ {
@ -172,7 +184,7 @@ namespace ShiftScheduler.Services
private static string GetTransportSummary(ShiftWithTransport? shiftWithTransport) private static string GetTransportSummary(ShiftWithTransport? shiftWithTransport)
{ {
if (shiftWithTransport == null) return "-"; if (shiftWithTransport == null) return "";
var transportLines = new List<string>(); var transportLines = new List<string>();
@ -195,7 +207,7 @@ namespace ShiftScheduler.Services
{ {
var departure = transport.DepartureTime.ToString("HH:mm"); var departure = transport.DepartureTime.ToString("HH:mm");
var arrival = transport.ArrivalTime.ToString("HH:mm"); var arrival = transport.ArrivalTime.ToString("HH:mm");
return $"🚂 {departure}→{arrival}"; return $" {transport.Platform}: {departure} → {arrival}";
} }
private static void RenderEmptyCell(TableDescriptor table) private static void RenderEmptyCell(TableDescriptor table)
@ -226,6 +238,32 @@ namespace ShiftScheduler.Services
.AlignMiddle(); .AlignMiddle();
} }
private static IContainer CellStyleTimes(IContainer container)
{
return container
.Padding(0)
.BorderLeft(boarderWidth)
.BorderRight(boarderWidth)
.BorderColor(borderColor)
.AlignCenter()
.AlignMiddle()
.Width(37, Unit.Millimetre)
.Background(Color.FromHex("#c7ffd6"));
}
private static IContainer CellStyleTransport(IContainer container)
{
return container
.Padding(0)
.BorderLeft(boarderWidth)
.BorderBottom(boarderWidth)
.BorderRight(boarderWidth)
.BorderColor(borderColor)
.AlignCenter()
.AlignMiddle().Width(37, Unit.Millimetre)
.Background(Color.FromHex("#bdccff"));
}
private static IContainer CellStyleLast(IContainer container) private static IContainer CellStyleLast(IContainer container)
{ {
return container return container