From 3f7c055489d9327a476b81f72588f44dfb1250a3 Mon Sep 17 00:00:00 2001 From: Baddi86 Date: Wed, 28 Oct 2026 14:46:34 +0100 Subject: [PATCH] Fix visibility of existing documentation links in cases --- .../StudentVorgaengeViewModelTests.cs | 40 +++++++++++++++++++ .../ClassTeacher/VorgangViewModels.cs | 3 ++ 2 files changed, 43 insertions(+) diff --git a/LehrerApp.Desktop.Tests/StudentVorgaengeViewModelTests.cs b/LehrerApp.Desktop.Tests/StudentVorgaengeViewModelTests.cs index 7029bfa..8eb5ffc 100644 --- a/LehrerApp.Desktop.Tests/StudentVorgaengeViewModelTests.cs +++ b/LehrerApp.Desktop.Tests/StudentVorgaengeViewModelTests.cs @@ -11,6 +11,46 @@ namespace LehrerApp.Desktop.Tests; /// Roster-/WebUntis-Abhängigkeit, deshalb reine In-Memory-Fakes ohne Untis-Cache-Setup. public sealed class StudentVorgaengeViewModelTests { + [Fact] + public async Task BestehenderAkteneintrag_KannNachtraeglichVerknuepftUndWiederGeloestWerden() + { + var student = new Student { FirstName = "Anna", LastName = "Beispiel" }; + var doc = new Documentation { StudentId = student.Id, Title = "Bericht" }; + var documentation = new FakeDocumentation(); + documentation.Add(doc); + var vorgaenge = new FakeVorgangRepository(); + var vorgang = new Vorgang { Title = "Vorgang", StudentIds = [student.Id] }; + vorgaenge.Add(vorgang); + var vm = BuildVm(vorgaenge, documentation, new FakeStudents([student])); + vm.Load(student.Id); + var item = Assert.Single(vm.Cases); + item.IsRevealed = true; + var available = Assert.Single(item.AvailableDocumentation); + var notifications = new List(); + item.PropertyChanged += (_, e) => notifications.Add(e.PropertyName); + + // Die View bindet schon vor dem Befuellen der Collections an diese Eigenschaften. + item.AvailableDocumentation.Clear(); + Assert.Contains(nameof(VorgangItem.HasAvailableDocumentation), notifications); + Assert.False(item.HasAvailableDocumentation); + item.AvailableDocumentation.Add(available); + Assert.True(item.HasAvailableDocumentation); + + await item.LinkCommand.ExecuteAsync(available); + var linked = Assert.Single(vm.Cases); + Assert.True(linked.IsRevealed); + Assert.True(linked.HasLinkedDocumentation); + Assert.False(linked.HasAvailableDocumentation); + Assert.Equal(doc.Id, Assert.Single(linked.LinkedDocumentation).Model.Id); + Assert.Contains(doc.Id, vorgaenge.GetById(vorgang.Id)!.DocumentationIds); + + await linked.UnlinkCommand.ExecuteAsync(linked.LinkedDocumentation[0]); + var unlinked = Assert.Single(vm.Cases); + Assert.False(unlinked.HasLinkedDocumentation); + Assert.True(unlinked.HasAvailableDocumentation); + Assert.Empty(vorgaenge.GetById(vorgang.Id)!.DocumentationIds); + Assert.Equal(doc.Id, Assert.Single(documentation.GetByStudent(student.Id)).Id); + } private static StudentVorgaengeViewModel BuildVm(FakeVorgangRepository? vorgaenge = null, FakeDocumentation? documentation = null, FakeStudents? students = null) => new(vorgaenge ?? new FakeVorgangRepository(), documentation ?? new FakeDocumentation(), diff --git a/LehrerApp.Desktop/ViewModels/ClassTeacher/VorgangViewModels.cs b/LehrerApp.Desktop/ViewModels/ClassTeacher/VorgangViewModels.cs index d5d1619..a7a0e5e 100644 --- a/LehrerApp.Desktop/ViewModels/ClassTeacher/VorgangViewModels.cs +++ b/LehrerApp.Desktop/ViewModels/ClassTeacher/VorgangViewModels.cs @@ -90,6 +90,9 @@ public partial class VorgangItem : ObservableObject _onUnlink = onUnlink; _onRemoveClassRegisterEntry = onRemoveClassRegisterEntry; _onEditDocumentation = onEditDocumentation; + LinkedDocumentation.CollectionChanged += (_, _) => OnPropertyChanged(nameof(HasLinkedDocumentation)); + AvailableDocumentation.CollectionChanged += (_, _) => OnPropertyChanged(nameof(HasAvailableDocumentation)); + ClassRegisterRows.CollectionChanged += (_, _) => OnPropertyChanged(nameof(HasClassRegisterRows)); } [RelayCommand] private void Reveal() => IsRevealed = !IsRevealed;