diff --git a/LehrerApp.Desktop.Tests/SettingsViewModelTests.cs b/LehrerApp.Desktop.Tests/SettingsViewModelTests.cs index 5347cf5..f97691c 100644 --- a/LehrerApp.Desktop.Tests/SettingsViewModelTests.cs +++ b/LehrerApp.Desktop.Tests/SettingsViewModelTests.cs @@ -513,6 +513,35 @@ public sealed class SettingsViewModelTests Assert.Equal([0, 1], stored.Select(x => x.SortOrder)); } + [Fact] + public void Kompetenzkatalog_Aktualisieren_ZeigtNachtraeglicheMcpAenderung() + { + var subject = new Subject { Name = "Naturwissenschaften", ShortName = "Nawi" }; + var repository = new FakeCompetencyDomains(); + var versions = new FakeCompetencyCatalogVersions(); + var version = versions.GetOrCreateDefault(subject.Id); + var vm = BuildViewModel(subjects: new FakeSubjects([subject]), competencyDomains: repository, + competencyVersions: versions); + vm.CatalogSubject = vm.Subjects.Single(); + + Assert.True(vm.HasNoCatalogDomains); + + repository.Add(new CompetencyDomain + { + SubjectId = subject.Id, + GradeLevel = 10, + VersionId = version.Id, + Name = "Erkenntnisgewinnung", + Items = [new CompetencyItem { Code = "EG1", Description = "Modelle verwenden" }], + }); + + vm.RefreshCompetencyCatalogCommand.Execute(null); + + var domain = Assert.Single(vm.Domains); + Assert.Equal("Erkenntnisgewinnung", domain.Name); + Assert.False(vm.HasNoCatalogDomains); + } + [Fact] public void Kompetenzen_Umsortieren_PersistiertSortOrder() { diff --git a/LehrerApp.Desktop/ViewModels/Settings/SettingsViewModel.Competencies.cs b/LehrerApp.Desktop/ViewModels/Settings/SettingsViewModel.Competencies.cs index 58a3fee..607c1fe 100644 --- a/LehrerApp.Desktop/ViewModels/Settings/SettingsViewModel.Competencies.cs +++ b/LehrerApp.Desktop/ViewModels/Settings/SettingsViewModel.Competencies.cs @@ -31,6 +31,10 @@ public partial class SettingsViewModel public ObservableCollection Domains { get; } = []; public ObservableCollection CatalogVersions { get; } = []; + public bool HasNoCatalogDomains => CatalogSubject is not null && CatalogVersion is not null && Domains.Count == 0; + public string EmptyCatalogMessage => CatalogSubject is null || CatalogVersion is null + ? "" + : $"Keine Kompetenzbereiche für {CatalogSubject.Name}, Klasse {CatalogGradeLevel}, Version „{CatalogVersion.Name}“ hinterlegt."; // ── Katalog: Laden ──────────────────────────────────────────────────────── @@ -38,6 +42,28 @@ public partial class SettingsViewModel partial void OnCatalogGradeLevelChanged(int value) => LoadCatalog(); partial void OnCatalogVersionChanged(CompetencyCatalogVersion? value) => LoadCatalog(); + [RelayCommand] + private void RefreshCompetencyCatalog() + { + var selectedSubjectId = CatalogSubject?.Id; + var selectedVersionId = CatalogVersion?.Id; + + LoadSubjects(); + if (selectedSubjectId is not Guid subjectId) + { + LoadCatalog(); + return; + } + + CatalogSubject = Subjects.FirstOrDefault(s => s.Id == subjectId); + if (CatalogSubject is null) return; + + CatalogVersion = CatalogVersions.FirstOrDefault(v => v.Id == selectedVersionId) + ?? CatalogVersions.FirstOrDefault(v => v.IsDefault) + ?? CatalogVersions.FirstOrDefault(); + LoadCatalog(); + } + private void LoadVersions() { var selectedId = CatalogVersion?.Id; @@ -56,10 +82,17 @@ public partial class SettingsViewModel { Domains.Clear(); CatalogValidation = ""; - if (CatalogSubject is null || CatalogVersion is null) return; + if (CatalogSubject is null || CatalogVersion is null) + { + OnPropertyChanged(nameof(HasNoCatalogDomains)); + OnPropertyChanged(nameof(EmptyCatalogMessage)); + return; + } foreach (var d in _domainRepo.GetBySubjectAndGrade(CatalogSubject.Id, CatalogGradeLevel, CatalogVersion.Id)) Domains.Add(CreateDomainEditItem(d)); RefreshDomainMoveState(); + OnPropertyChanged(nameof(HasNoCatalogDomains)); + OnPropertyChanged(nameof(EmptyCatalogMessage)); } // ── Versionen (Bildungspläne) verwalten ────────────────────────────────── @@ -120,6 +153,8 @@ public partial class SettingsViewModel _domainRepo.Save(domain); Domains.Add(CreateDomainEditItem(domain)); RefreshDomainMoveState(); + OnPropertyChanged(nameof(HasNoCatalogDomains)); + OnPropertyChanged(nameof(EmptyCatalogMessage)); NewDomainName = ""; NewDomainCode = ""; CatalogValidation = ""; } @@ -130,6 +165,8 @@ public partial class SettingsViewModel _domainRepo.Delete(item.Id); Domains.Remove(item); PersistDomainOrder(); + OnPropertyChanged(nameof(HasNoCatalogDomains)); + OnPropertyChanged(nameof(EmptyCatalogMessage)); } private DomainEditItem CreateDomainEditItem(CompetencyDomain domain) => diff --git a/LehrerApp.Desktop/ViewModels/Settings/SettingsViewModel.cs b/LehrerApp.Desktop/ViewModels/Settings/SettingsViewModel.cs index ef4857f..1b78fa0 100644 --- a/LehrerApp.Desktop/ViewModels/Settings/SettingsViewModel.cs +++ b/LehrerApp.Desktop/ViewModels/Settings/SettingsViewModel.cs @@ -67,6 +67,12 @@ public partial class SettingsViewModel : ObservableObject [ObservableProperty] private int _activeTabIndex; + partial void OnActiveTabIndexChanged(int value) + { + if (value == (int)SettingsTab.Competencies) + RefreshCompetencyCatalog(); + } + // ── Konstruktor ─────────────────────────────────────────────────────────── private readonly ISchoolHolidayRepository _schoolHolidays; diff --git a/LehrerApp.Desktop/Views/Settings/SettingsView.axaml b/LehrerApp.Desktop/Views/Settings/SettingsView.axaml index cefe0fd..8489faf 100644 --- a/LehrerApp.Desktop/Views/Settings/SettingsView.axaml +++ b/LehrerApp.Desktop/Views/Settings/SettingsView.axaml @@ -149,6 +149,9 @@ IsEnabled="{Binding CatalogSubject, Converter={x:Static ObjectConverters.IsNotNull}}" ToolTip.Tip="Katalog in eine andere Klassenstufe (derselben Version) kopieren"/> +