Fix Kompetenzlisten ansicht
CI / build-and-test (push) Canceled after 0s

This commit is contained in:
admin committed 2026-09-19 23:52:46 +02:00
1 parent 0942a8ebcf
commit 0f2a25feb5
4 files changed
+78 -1

No files matched your search

@@ -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()
{
@@ -31,6 +31,10 @@ public partial class SettingsViewModel
public ObservableCollection<DomainEditItem> Domains { get; } = [];
public ObservableCollection<CompetencyCatalogVersion> 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) =>
@@ -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;
@@ -149,6 +149,9 @@
IsEnabled="{Binding CatalogSubject, Converter={x:Static ObjectConverters.IsNotNull}}"
ToolTip.Tip="Katalog in eine andere Klassenstufe (derselben Version) kopieren"/>
</Grid>
<Button Content="Katalog aktualisieren" Command="{Binding RefreshCompetencyCatalogCommand}"
HorizontalAlignment="Right"
ToolTip.Tip="Fächer, Versionen und Kompetenzen neu aus der Datenbank laden"/>
<!-- Bildungsplan-Versionen verwalten -->
<Border BorderBrush="{DynamicResource SystemControlForegroundBaseLowBrush}"
@@ -193,6 +196,8 @@
<!-- Leerer Zustand -->
<TextBlock Text="Kein Fach ausgewählt." Classes="emptyhint"
IsVisible="{Binding CatalogSubject, Converter={x:Static ObjectConverters.IsNull}}"/>
<TextBlock Text="{Binding EmptyCatalogMessage}" Classes="emptyhint" TextWrapping="Wrap"
IsVisible="{Binding HasNoCatalogDomains}"/>
<!-- Domain-Liste -->
<ItemsControl ItemsSource="{Binding Domains}"