diff --git a/CHANGELOG.md b/CHANGELOG.md index 90f3084..e43b69d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,24 @@ All notable changes to this project are documented in this file. +## [1.118.2] - 2026-09-07 + +### Fixed +- **Kein `@ts-nocheck` mehr im Projekt.** Drei Dateien hatten die Typprüfung komplett + abgeschaltet und blieben deshalb auch von `ignoreBuildErrors: false` unberührt: + - `calendar-cache.ts` brauchte die Ausnahme überhaupt nicht — ohne sie: null Fehler. + - `microsoft-todo.ts`: vier Fälle zirkulärer Typinferenz (`url` → `data` → `response` + → `url`), aufgelöst durch explizite Annotationen. + - `outlook-calendar.ts`: Hinter der Ausnahme steckte ein möglicher Laufzeitfehler. Der + Code streute `response!`-Assertions, eine Stelle war vergessen. Statt einer weiteren + Assertion prüft der Code jetzt echt, ob nach den drei Wiederholversuchen überhaupt + eine Antwort vorliegt. + +### Added +- `TODO.md`: Block I mit zwei UI-Wünschen — Hervorhebung des aktuellen Tages auch im + Spaltenkopf, und die Symbole in Kalenderterminen nach oben rechts. Beide mit den + konkreten Fundstellen in `globals.css`. + ## [1.118.1] - 2026-09-07 ### Fixed diff --git a/TODO.md b/TODO.md index 2662630..485f04a 100644 --- a/TODO.md +++ b/TODO.md @@ -109,8 +109,10 @@ Anleitung siehe [`docs/secret-rotation.md`](docs/secret-rotation.md). - [x] `tsconfig.json`: `include` von `**/*` auf `src/**/*` eingegrenzt. **Das war die Ursache der Langsamkeit**, nicht die Dateigröße: Der Lauf dauert jetzt **19 Sekunden** statt über 30 Minuten. Meine gegenteilige Vermutung war falsch. -- [ ] **3 Dateien mit `@ts-nocheck`** aufspüren und entschärfen — die überspringen den - Typecheck vollständig, auch mit `ignoreBuildErrors: false` +- [x] **3 Dateien mit `@ts-nocheck`** entschärft — im Projekt gibt es jetzt **kein einziges + `@ts-nocheck` mehr**. `calendar-cache.ts` brauchte es gar nicht (0 Fehler), in + `microsoft-todo.ts` fehlten Typannotationen, und in `outlook-calendar.ts` steckte + ein möglicher Laufzeitfehler dahinter. - [ ] `any`-Stellen reduzieren — ESLint zählt **470** `no-explicit-any` — fortlaufend, kein Blocker - [ ] **209** ungenutzte Variablen (`no-unused-vars`) aufräumen — fortlaufend - [ ] **11** unvollständige Hook-Abhängigkeiten (`react-hooks/exhaustive-deps`) prüfen — @@ -149,6 +151,8 @@ Blindflug. Ebenso hilfreich: A2, damit es überhaupt Tests gibt. - [ ] `getWeekNumber` existiert **dreimal** im Projekt (WeeklyView, `WeekPrintModal.tsx`, `api/user/export-week-view/route.ts`) — Duplikate gegen `date-utils.ts` ersetzen, vorher die drei Implementierungen auf Gleichheit prüfen +- [ ] `calendar-cache.ts` hat mit `getWeekStart` eine **vierte** eigene Wochenlogik — + ebenfalls gegen `date-utils.ts` ersetzen - [ ] Drag & Drop in einen Hook `useTaskDragDrop.ts` - [ ] Someday-Listen in `SomedayLists.tsx` - [ ] All-Day-Leiste in `AllDayBar.tsx` @@ -275,6 +279,38 @@ Umgestellt auf `dataSources.query()`; die Suche filtert jetzt auf `data_source` --- +## Block I — UI-Wünsche + +### I1. Aktuellen Tag auch im Spaltenkopf hervorheben +- [ ] Hervorhebungsfarbe zusätzlich hinter Wochentagsname und Datum legen + +**Wunsch:** Der laufende Tag soll deutlicher auffallen. Aktuell ist nur der Spaltenkörper +eingefärbt, der Kopfbereich mit "SEP 7 / MONDAY" bleibt weiß. + +**Wo:** `globals.css:666` färbt `.weekly-day-column.is-today` mit +`var(--weekly-today-highlight)`. Der Kopf ist ein eigenes `
` +([WeeklyView.tsx:7089](src/components/WeeklyView.tsx#L7089)) und übermalt die Farbe +offenbar mit eigenem Hintergrund. Der Wochentagsname hat bereits eine eigene Regel +(`globals.css:708`, `.weekly-day-name.is-today` setzt nur die Schriftfarbe). + +**Zu klären:** Der Kopf ist vermutlich `sticky` und braucht deshalb einen deckenden +Hintergrund — die Farbe muss also gesetzt, nicht nur geerbt werden. + +### I2. Symbole in Kalenderterminen nach oben rechts +- [ ] `.event-icons-row` von unten rechts nach oben rechts verschieben + +**Wunsch:** Die kleinen Symbole (Wiederholung, Anbieter) sitzen unten rechts im Termin und +sollen nach oben rechts. + +**Wo:** `globals.css:3183` — `.event-icons-row` hat `bottom: 2px; right: 4px;`. Für oben +rechts wird daraus `top: 2px; right: 4px;`. + +**Achtung:** Der Titel beginnt oben links; bei kurzen Terminen könnten sich Symbole und +Titel überlappen. Vermutlich braucht die Titelzeile rechts etwas Freiraum +(`padding-right`), damit nichts verdeckt wird. + +--- + ## Block G — Infrastruktur (Supabase-LXC 201) ### G1. Container läuft privilegiert *(Sicherheitsthema)* diff --git a/package-lock.json b/package-lock.json index 6bbe7bc..258a9cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "my-weekly-todo-list", - "version": "1.118.1", + "version": "1.118.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "my-weekly-todo-list", - "version": "1.118.1", + "version": "1.118.2", "license": "MIT", "dependencies": { "@auth/prisma-adapter": "^2.11.1", diff --git a/package.json b/package.json index 7a14a28..47af4c4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "my-weekly-todo-list", - "version": "1.118.1", + "version": "1.118.2", "description": "A web-based weekly task management application that organizes to-dos and calendar events in a single, intuitive weekly view", "main": "index.js", "scripts": { diff --git a/src/lib/calendar-cache.ts b/src/lib/calendar-cache.ts index ab4ce92..7e88a63 100644 --- a/src/lib/calendar-cache.ts +++ b/src/lib/calendar-cache.ts @@ -1,4 +1,3 @@ -// @ts-nocheck /* eslint-disable @typescript-eslint/no-explicit-any */ import { prisma } from './prisma'; diff --git a/src/lib/microsoft-todo.ts b/src/lib/microsoft-todo.ts index 3d01a01..4d85889 100644 --- a/src/lib/microsoft-todo.ts +++ b/src/lib/microsoft-todo.ts @@ -1,4 +1,3 @@ -// @ts-nocheck /* eslint-disable @typescript-eslint/no-explicit-any */ const GRAPH_ENDPOINT = 'https://graph.microsoft.com/v1.0'; @@ -163,7 +162,7 @@ export const fetchMsTodoTasksForSync = async ( })(); while (url) { - const response = await fetch(url, { + const response: Response = await fetch(url, { headers: { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': 'application/json' @@ -176,7 +175,7 @@ export const fetchMsTodoTasksForSync = async ( throw new Error(`Failed to fetch To-Do tasks for sync: ${response.status} ${response.statusText}`); } - const data = await response.json(); + const data: any = await response.json(); allTasks.push(...((data.value || []) as MicrosoftTodoTask[])); url = data['@odata.nextLink'] || null; } @@ -212,7 +211,7 @@ export const fetchMsTodoTasksDelta = async ( let deltaToken: string | null = null; while (url) { - const response = await fetch(url, { + const response: Response = await fetch(url, { headers: { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': 'application/json' @@ -229,7 +228,7 @@ export const fetchMsTodoTasksDelta = async ( throw new Error(`Failed to fetch To-Do delta: ${response.status} ${response.statusText}`); } - const data = await response.json(); + const data: any = await response.json(); for (const item of (data.value || [])) { if (item['@removed']) { tasks.push({ ...item, _deleted: true } as any); diff --git a/src/lib/outlook-calendar.ts b/src/lib/outlook-calendar.ts index 7182083..4d4d710 100644 --- a/src/lib/outlook-calendar.ts +++ b/src/lib/outlook-calendar.ts @@ -1,4 +1,3 @@ -// @ts-nocheck /* eslint-disable @typescript-eslint/no-explicit-any */ // import { GoogleCalendarEvent as CalendarEvent } from './google-calendar'; @@ -194,10 +193,16 @@ export const getUpcomingEvents = async ( break; } - if (!response!.ok) { - const errorText = await response!.text(); - console.error(`[OUTLOOK] Failed to fetch events for calendar ${calendarId}:`, response!.status, response!.statusText, errorText); - throw new Error(`Failed to fetch events: ${response!.status} ${response!.statusText}`); + // Nach der Retry-Schleife kann response fehlen, wenn jeder Versuch abbrach. Eine echte + // Pruefung statt weiterer "!"-Assertions: die verschieben das Problem nur zur Laufzeit. + if (!response) { + throw new Error(`[OUTLOOK] Keine Antwort fuer Kalender ${calendarId} nach 3 Versuchen`); + } + + if (!response.ok) { + const errorText = await response.text(); + console.error(`[OUTLOOK] Failed to fetch events for calendar ${calendarId}:`, response.status, response.statusText, errorText); + throw new Error(`Failed to fetch events: ${response.status} ${response.statusText}`); } const data = await response.json();