CI / build-and-test (push) Waiting to run
Die DrawingValue-Builder gingen bisher immer von einer festen Breite (170) aus, unabhängig davon, wie breit die DRAWBOX/FLOWDRAWBOX in der jeweiligen Vorlage tatsächlich deklariert ist. Bei einer breiteren Box (oder einer in "pt" statt "mm" deklarierten Seite, wie im echten Fehlzeitenbrief-Template) blieb dadurch ein Großteil der eigentlich verfügbaren Fläche ungenutzt leer - sichtbar als "Luft" rechts und unterhalb des Kalenders im generierten PDF. CreateLetterDialogViewModel/LetterTemplateTools ermitteln jetzt die real deklarierte Boxbreite samt Maßeinheit aus dem geladenen Template (LetterPlaceholderBuilder.FindDeclaredDrawingBox) und reichen sie an die Builder durch, die ihr mm-entworfenes Raster entsprechend skalieren. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
50 lines
2.9 KiB
C#
50 lines
2.9 KiB
C#
using Avalonia.Controls;
|
|
using LehrerApp.Core.Interfaces;
|
|
using LehrerApp.Core.Models;
|
|
using LehrerApp.Desktop.ViewModels.Students;
|
|
using LehrerApp.Desktop.Views.Students;
|
|
using LehrerApp.Templating;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
namespace LehrerApp.Desktop.Services;
|
|
|
|
/// <summary>Öffnet den bestehenden Elternbrief-Dialog für einen Schüler, egal ob der Aufruf aus
|
|
/// der Schülerdetailansicht (Student schon im DataContext) oder aus dem Formulare-Menü (Student
|
|
/// erst per Picker gewählt) kommt.</summary>
|
|
public static class LetterDialogs
|
|
{
|
|
public static async Task ShowCreateLetterDialogAsync(Window owner, Student student)
|
|
{
|
|
var vm = new CreateLetterDialogViewModel(student,
|
|
App.Services.GetRequiredService<TemplateStore>(),
|
|
App.Services.GetRequiredService<ITemplateRenderer>(),
|
|
App.Services.GetRequiredService<IGroupMembershipRepository>(),
|
|
App.Services.GetRequiredService<IGroupRepository>(),
|
|
(options, contentWidth, millimeterScale) => App.Services.GetRequiredService<StudentAttendanceCalendarService>()
|
|
.Build(student, options, contentWidth, millimeterScale),
|
|
(options, contentWidth, millimeterScale) => App.Services.GetRequiredService<StudentAttendanceCalendarService>()
|
|
.BuildAbsenceDayList(student, options, contentWidth, millimeterScale),
|
|
RefreshAttendanceDataAsync);
|
|
var dialog = new CreateLetterDialog { DataContext = vm };
|
|
var path = await dialog.ShowDialog<string?>(owner);
|
|
if (!string.IsNullOrEmpty(path) && File.Exists(path))
|
|
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(path) { UseShellExecute = true });
|
|
}
|
|
|
|
/// <summary>Holt genau den im Anwesenheitskalender-Dialog gewählten Zeitraum gezielt per
|
|
/// WebUntis nach (ausgelöst durch den expliziten "Konfigurieren…"-Klick, kein Hintergrundabruf
|
|
/// beim bloßen Öffnen des Briefdialogs). Damit sieht <see cref="StudentAttendanceCalendarService"/>
|
|
/// anschließend frische Daten im lokalen Cache, statt stillschweigend "keine Fehltage" zu
|
|
/// melden, nur weil die Klassenlehrer-Übersicht für diesen Zeitraum noch nie geöffnet wurde.</summary>
|
|
private static async Task RefreshAttendanceDataAsync(AttendanceCalendarOptions options, CancellationToken token)
|
|
{
|
|
var className = App.Services.GetRequiredService<WebUntisSettingsService>().HomeroomClassName;
|
|
if (string.IsNullOrWhiteSpace(className)) return;
|
|
var cache = App.Services.GetRequiredService<UntisReportCacheService>();
|
|
var start = options.NormalizedStartMonth;
|
|
var end = start.AddMonths(options.NormalizedMonthCount).AddDays(-1);
|
|
await cache.GetAbsencesAsync(className, start, end, token: token);
|
|
await cache.GetClassRegisterEventsAsync(className, start, end, token: token);
|
|
}
|
|
}
|