Unterrichtsplanung: Einheiten, Verlaufsplan-Editor, Kürzel-Katalog (Kapitel 4.1/4.2)

Neuer Tab "Planung" in GroupDetailView ersetzt den Platzhalter: Einheiten anlegen/bearbeiten/
als Vorlage in andere Gruppe kopieren, Stunden je Einheit mit Verschieben (inkl. Nachrücken
der Folgestunden). Stundeneditor als tabellarischer Verlaufsplan (Phase/Dauer/Tätigkeit/
Material/Kurzsymbol je Zeile, Uhrzeit aus optionalem Stundenbeginn abgeleitet) statt eines
einzelnen Phase-Felds mit Methoden-/Materialien-Chips — Kurzsymbol als Freitext mit
Vorschlägen aus neuem Kürzel-Katalog (Einstellungen) plus bisher verwendeten Werten.
Schema-Migrationen v1-v3 überführen bestehende Daten verlustfrei. 4.2.5 bewusst offen
gelassen (hängt an Stundenplan, Kapitel 4.3).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-14 00:50:57 +02:00
co-authored by Claude Sonnet 5
parent 27359794f7
commit de6ea001e7
28 changed files with 2372 additions and 32 deletions
+50
View File
@@ -148,6 +148,56 @@ public class FakeAttachmentStorage : IAttachmentStorage
public void Delete(string storageId) => _blobs.Remove(storageId);
}
public class FakeUnits : IUnitRepository
{
private readonly List<Unit> _all = [];
public void Add(Unit u) => _all.Add(u);
public Unit? GetById(Guid id) => _all.FirstOrDefault(u => u.Id == id);
public List<Unit> GetByGroup(Guid groupId) =>
_all.Where(u => u.GroupId == groupId).OrderBy(u => u.StartDate).ToList();
public void Save(Unit unit) { _all.RemoveAll(u => u.Id == unit.Id); _all.Add(unit); }
public void Delete(Guid id) => _all.RemoveAll(u => u.Id == id);
}
public class FakeLessons : ILessonRepository
{
private readonly List<Lesson> _all = [];
public void Add(Lesson l) => _all.Add(l);
public List<Lesson> GetByUnit(Guid unitId) =>
_all.Where(l => l.UnitId == unitId).OrderBy(l => l.Date).ThenBy(l => l.LessonNumber).ToList();
public List<Lesson> GetByGroupAndDate(Guid groupId, DateOnly date) =>
_all.Where(l => l.GroupId == groupId && l.Date == date).ToList();
public List<Lesson> GetByGroupAndRange(Guid groupId, DateOnly from, DateOnly to) =>
_all.Where(l => l.GroupId == groupId && l.Date >= from && l.Date <= to).OrderBy(l => l.Date).ToList();
public void Save(Lesson lesson) { _all.RemoveAll(l => l.Id == lesson.Id); _all.Add(lesson); }
public void Delete(Guid id) => _all.RemoveAll(l => l.Id == id);
}
public class FakeSubjects(List<Subject> all) : ISubjectRepository
{
public List<Subject> GetAll() => all;
public Subject? GetById(Guid id) => all.FirstOrDefault(s => s.Id == id);
public Subject? GetByName(string name) => all.FirstOrDefault(s => s.Name == name);
public void Save(Subject subject) { }
public void Delete(Guid id) { }
}
public class FakeCompetencyDomains : ICompetencyDomainRepository
{
public List<CompetencyDomain> GetBySubjectAndGrade(Guid subjectId, int gradeLevel) => [];
public CompetencyDomain? GetById(Guid id) => null;
public void Save(CompetencyDomain domain) { }
public void Delete(Guid id) { }
public void DeleteBySubjectAndGrade(Guid subjectId, int gradeLevel) { }
}
public class FakeShorthandCodes(List<ShorthandCode> all) : IShorthandCodeRepository
{
public List<ShorthandCode> GetAll() => all;
public void Save(ShorthandCode code) { }
public void Delete(Guid id) { }
}
public class FakeReportGrades : IReportGradeRepository
{
private readonly List<ReportGrade> _all = [];