CI / build-and-test (push) Waiting to run
Nachdem die Kalender-Breite jetzt an die reale DRAWBOX/FLOWDRAWBOX-Breite gekoppelt ist, konnte das (korrekt größer werdende) Raster die von der Vorlage deklarierte Höhe überschreiten - eine DRAWBOX bricht anders als eine FLOWDRAWBOX nicht automatisch auf Folgeseiten um, überschüssiger Inhalt wird von QuestTemplateRenderer stillschweigend am unteren Rand abgeschnitten. StudentAttendanceCalendarDrawingBuilder ermittelt jetzt vorab, wie viele Wochen die gewählten Monate brauchen, und verkleinert "Größe" automatisch so weit, dass der Kalender innerhalb der deklarierten Höhe bleibt (nur bei DRAWBOX/IsFixed - eine FLOWDRAWBOX darf weiterhin frei wachsen, da sie bei Bedarf auf weitere Seiten fließt statt abzuschneiden). 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, contentHeight) => App.Services.GetRequiredService<StudentAttendanceCalendarService>()
|
|
.Build(student, options, contentWidth, millimeterScale, contentHeight),
|
|
(options, contentWidth, millimeterScale, contentHeight) => 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);
|
|
}
|
|
}
|