Neuer Dialog "Deckblätter…" bei Klausuren, Punktetabelle als Drawing mit festen Spaltenbreiten, FLOWDRAWBOX-Attribut fit=content, Stapel-Rendering mit Seitenzahl je Datensatz, Kursbezeichnung und konfigurierbares Kürzel. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
69 lines
2.9 KiB
C#
69 lines
2.9 KiB
C#
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using CommunityToolkit.Mvvm.Input;
|
|
using LehrerApp.Desktop.Services;
|
|
using LehrerApp.Templating;
|
|
using System.Collections.ObjectModel;
|
|
|
|
namespace LehrerApp.Desktop.ViewModels.Settings;
|
|
|
|
public partial class SettingsViewModel
|
|
{
|
|
private readonly TeacherSettingsService? _teacherSettings;
|
|
|
|
/// <summary>Eigenes Kürzel für Formulare (Platzhalter <c>Teacher.Abbreviation</c> auf dem
|
|
/// Klausur-Deckblatt). Wird sofort gespeichert; im Deckblatt-Dialog je Druck überschreibbar.</summary>
|
|
[ObservableProperty] private string _teacherAbbreviation = "";
|
|
partial void OnTeacherAbbreviationChanged(string value) => _teacherSettings?.SaveAbbreviation(value);
|
|
|
|
[ObservableProperty] private string _worksheetTemplateStatus = "";
|
|
public ObservableCollection<LetterTemplateListItem> WorksheetTemplateList { get; } = [];
|
|
|
|
private void LoadWorksheetTemplates()
|
|
{
|
|
WorksheetTemplateList.Clear();
|
|
foreach (var template in _worksheetTemplates.Store.GetTemplates()) WorksheetTemplateList.Add(CreateWorksheetItem(template));
|
|
}
|
|
|
|
public void ImportWorksheetTemplate(string path)
|
|
{
|
|
WorksheetTemplateStatus = "";
|
|
try
|
|
{
|
|
var template = _worksheetTemplates.Store.Import(path);
|
|
LoadWorksheetTemplates();
|
|
WorksheetTemplateStatus = $"„{template.Name}“ wurde geprüft und lokal importiert.";
|
|
}
|
|
catch (Exception ex) when (ex is IOException or InvalidDataException or UnauthorizedAccessException or TemplateValidationException)
|
|
{ WorksheetTemplateStatus = $"Import fehlgeschlagen: {ex.Message}"; }
|
|
}
|
|
|
|
[RelayCommand]
|
|
private void ValidateWorksheetTemplate(LetterTemplateListItem? item)
|
|
{
|
|
if (item is null) return;
|
|
try
|
|
{
|
|
var refreshed = CreateWorksheetItem(item.Model);
|
|
var index = WorksheetTemplateList.IndexOf(item);
|
|
if (index >= 0) WorksheetTemplateList[index] = refreshed;
|
|
WorksheetTemplateStatus = $"„{item.Name}“ ist gültig (Schema {refreshed.SchemaVersion}).";
|
|
}
|
|
catch (Exception ex) when (ex is IOException or InvalidDataException or TemplateValidationException)
|
|
{ WorksheetTemplateStatus = $"„{item.Name}“ ist ungültig: {ex.Message}"; }
|
|
}
|
|
|
|
[RelayCommand]
|
|
private void DeleteWorksheetTemplate(LetterTemplateListItem? item)
|
|
{
|
|
if (item is null) return;
|
|
_worksheetTemplates.Store.Delete(item.Id); WorksheetTemplateList.Remove(item); WorksheetTemplateStatus = "Vorlage gelöscht.";
|
|
}
|
|
|
|
private LetterTemplateListItem CreateWorksheetItem(InstalledTemplate template)
|
|
{
|
|
var loaded = _worksheetTemplates.Store.Load(template);
|
|
return new(template, loaded.Manifest.SchemaVersion, loaded.Manifest.Placeholders.Count(x => !x.IsConstant),
|
|
loaded.Manifest.Placeholders.Count(x => !x.IsConstant && x.Required));
|
|
}
|
|
}
|