# πŸ† Modul 08: Master-Abschlussprojekt – Interaktive Task-App (MVC) > **Leitgedanke:** *β€žEin wahrer Software-Engineer zeichnet sich nicht nur dadurch aus, einzelne Funktionen zu schreiben, sondern komplexe Systeme mit klarer Model-View-Architektur, State-Management und 100% testgetriebener Logik zu strukturieren.β€œ* --- ## πŸ“š Übersicht & Projektziel Herzlichen GlΓΌckwunsch zum Erreichen des **Master-Abschlussprojekts** des JavaScript & TypeScript Kurses! In diesem Abschlussprojekt entwickelst du eine vollstΓ€ndige, professionelle Aufgaben- und Projektmanagement-Web-Applikation. ### Kernanforderungen: 1. **Saubere Model-View-Trennung (MVC / Clean Architecture)**: - Die GeschΓ€ftslogik (`TaskManager`) ist zu 100% unabhΓ€ngig vom DOM und lΓ€uft headless in jedem Test-Runner. - Die View (`TaskApp`) reagiert reaktiv auf State-Γ„nderungen und visualisiert Tasks mit PrioritΓ€ts-Badges und FΓ€lligkeitsdaten. 2. **Umfassende Aufgabenverwaltung**: - Aufgaben hinzufΓΌgen mit Titel, PrioritΓ€t (`high`, `medium`, `low`) und FΓ€lligkeitsdatum (`dueDate`). - Status umschalten (Toggle: Offen <-> Erledigt). - Aufgaben lΓΆschen und abgeschlossene Aufgaben gesammelt aufrΓ€umen. - Dynamische Filterung (`all`, `active`, `completed`) und Volltextsuche (Live Search). - Aggregat-Statistiken in Echtzeit (Gesamtzahl, Offen, Erledigt, Hohe PrioritΓ€t). 3. **100% Unittest-Abdeckung** mit automatisierter Testsuite. --- ## πŸ›οΈ 1. Architektur: Model-View-Controller (MVC) ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ BENUTZER / BROWSER UI β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Klick / Formular-Eingabe β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ VIEW / CONTROLLER (app.js) β”‚ β”‚ - Reagiert auf DOM-Events (submit, click, input) β”‚ β”‚ - Aktualisiert das DOM bei State-Γ„nderungen β”‚ β”‚ - Formatiert UI-Elemente (Badges, Datumsanzeige) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ Ruft Methoden auf β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ MODEL / STATE (TaskManager) β”‚ β”‚ - addTask(title, priority, dueDate) β”‚ β”‚ - toggleTask(id) β”‚ β”‚ - deleteTask(id) β”‚ β”‚ - getFilteredTasks(status, query) β”‚ β”‚ - getStatistics() β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## πŸ“ 2. TypeScript Datenmodell & Interfaces ```typescript type TaskPriority = "high" | "medium" | "low"; type FilterStatus = "all" | "active" | "completed"; interface Task { id: number; title: string; priority: TaskPriority; completed: boolean; dueDate: string | null; createdAt: string; } interface TaskStatistics { total: number; active: number; completed: number; highPriorityCount: number; } ``` --- ## 🎯 3. Deine Aufgaben in `aufgabe.js` Implementiere die Klasse `TaskManager`: ### 🎯 TODO 1: `constructor(initialTasks = [])` & `addTask(title, priority = 'medium', dueDate = null)` - Erzeugt eine neue Aufgabe mit fortlaufender ID (1, 2, 3, ...). - Validiert den Titel (muss ein nicht-leerer String sein; wirft sonst einen `Error`). - Setzt Standardwerte fΓΌr `priority` ('medium') und `dueDate` (null). - Gibt das neu erstellte `Task`-Objekt zurΓΌck. ### 🎯 TODO 2: `toggleTask(id)` - Schaltet `completed` fΓΌr die Aufgabe mit der angegebenen ID um (`true` <-> `false`). - Liefert den aktualisierten Task zurΓΌck, oder `null` falls die ID nicht gefunden wurde. ### 🎯 TODO 3: `deleteTask(id)` - Entfernt die Aufgabe mit der ID aus der internen Liste. - Gibt `true` bei erfolgreichem LΓΆschen zurΓΌck, sonst `false`. ### 🎯 TODO 4: `getFilteredTasks(filterStatus = 'all', searchQuery = '')` - Filtert nach Status: `'all'` (alle), `'active'` (nur unerledigte), `'completed'` (nur erledigte). - Filtert optional case-insensitive nach TeilΓΌbereinstimmung im Titel (`searchQuery`). - Gibt eine Kopie des gefilterten Arrays zurΓΌck. ### 🎯 TODO 5: `getStatistics()` - Liefert ein Objekt mit `{ total, active, completed, highPriorityCount }`. --- ## πŸ§ͺ 4. Verifikation & AusfΓΌhrung ### Unittests ausfΓΌhren: Γ–ffne das Modul in der integrierten Web-IDE oder fΓΌhre `test_aufgabe.js` aus. ### Interaktive Browser-App testen: Γ–ffne `index.html` direkt im Browser, um die live gerenderte Task-App auszuprobieren!