81 lines
3.2 KiB
C#
81 lines
3.2 KiB
C#
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using CommunityToolkit.Mvvm.Input;
|
|
using LehrerApp.Templating;
|
|
using System.Collections.ObjectModel;
|
|
|
|
namespace LehrerApp.Desktop.ViewModels.Settings;
|
|
|
|
public partial class SettingsViewModel
|
|
{
|
|
[ObservableProperty] private string _letterTemplateStatus = "";
|
|
public ObservableCollection<LetterTemplateListItem> LetterTemplateList { get; } = [];
|
|
|
|
private void LoadLetterTemplates()
|
|
{
|
|
LetterTemplateList.Clear();
|
|
foreach (var template in _letterTemplates.GetTemplates()) LetterTemplateList.Add(CreateItem(template));
|
|
}
|
|
|
|
public void ImportLetterTemplate(string path)
|
|
{
|
|
LetterTemplateStatus = "";
|
|
try
|
|
{
|
|
var template = _letterTemplates.Import(path);
|
|
LoadLetterTemplates();
|
|
LetterTemplateStatus = $"„{template.Name}“ wurde geprüft und lokal importiert.";
|
|
}
|
|
catch (Exception ex) when (ex is IOException or InvalidDataException or UnauthorizedAccessException or TemplateValidationException)
|
|
{ LetterTemplateStatus = $"Import fehlgeschlagen: {ex.Message}"; }
|
|
}
|
|
|
|
[RelayCommand]
|
|
private void ValidateLetterTemplate(LetterTemplateListItem? item)
|
|
{
|
|
if (item is null) return;
|
|
try
|
|
{
|
|
var refreshed = CreateItem(item.Model);
|
|
var index = LetterTemplateList.IndexOf(item);
|
|
if (index >= 0) LetterTemplateList[index] = refreshed;
|
|
LetterTemplateStatus = $"„{item.Name}“ ist gültig (Schema {refreshed.SchemaVersion}).";
|
|
}
|
|
catch (Exception ex) when (ex is IOException or InvalidDataException or TemplateValidationException)
|
|
{ LetterTemplateStatus = $"„{item.Name}“ ist ungültig: {ex.Message}"; }
|
|
}
|
|
|
|
[RelayCommand]
|
|
private void DeleteLetterTemplate(LetterTemplateListItem? item)
|
|
{
|
|
if (item is null) return;
|
|
_letterTemplates.Delete(item.Id); LetterTemplateList.Remove(item); LetterTemplateStatus = "Vorlage gelöscht.";
|
|
}
|
|
|
|
private LetterTemplateListItem CreateItem(InstalledTemplate template)
|
|
{
|
|
var loaded = _letterTemplates.Load(template);
|
|
return new(template, loaded.Manifest.SchemaVersion, loaded.Manifest.Placeholders.Count,
|
|
loaded.Manifest.Placeholders.Count(x => x.Required));
|
|
}
|
|
}
|
|
|
|
public sealed class LetterTemplateListItem(InstalledTemplate model, int schemaVersion, int fieldCount, int requiredCount)
|
|
{
|
|
public InstalledTemplate Model { get; } = model;
|
|
public string Id => Model.Id;
|
|
public string Name => Model.Name;
|
|
public string PackageFileName => Path.GetFileName(Model.PackagePath);
|
|
public int SchemaVersion { get; } = schemaVersion;
|
|
public bool HasIssues => false;
|
|
public bool HasNoIssues => true;
|
|
public string ValidationSummary => $"Schema {SchemaVersion} · {fieldCount} Felder ({requiredCount} Pflicht)";
|
|
public ObservableCollection<LetterTemplateIssueItem> Issues { get; } = [];
|
|
}
|
|
|
|
public sealed class LetterTemplateIssueItem(ValidationIssue issue)
|
|
{
|
|
public string Icon => issue.Severity == ValidationSeverity.Error ? "⛔" : "ⓘ";
|
|
public string Message => issue.Message;
|
|
public string Color => issue.Severity == ValidationSeverity.Error ? "#DC2626" : "#6B7280";
|
|
}
|