Erster Schnitt aus TODO-CODESCENE-FORTSETZUNG-2026-09-12.md, nach Owner-Freigabe. handleDrop (WeeklyView.tsx) vermischte fachliche Drop-Entscheidung (Zielslot bei Belegung finden, Subtask-Befoerderung vs. Someday-Verschieben vs. normales Verschieben) mit React-State-Updates und Netzwerkaufrufen. Die Entscheidung ist jetzt eine reine Funktion decideTaskDrop in src/lib/weekly/drag-drop.ts: - kennt weder DOM noch React noch Netzwerk, nur Task/Zieltag/Slot als Daten - kein Import von date-utils.ts: der Aufrufer liefert dayOfWeek/scheduledDate/ allSlots fertig, damit die Datei nur einen Typ-Import hat (wie date-utils.ts/ format.ts/event-layout.ts in diesem Ordner) und ohne Next.js-Bundler in node:test laeuft - 15 Charakterisierungstests: freier/belegter/geschuetzter Slot, Drop ohne Slot mit/ohne vorhandene Startzeit, Subtask-Befoerderung, Someday-Provider- Vererbung (eigener vs. geerbter Provider), externe Sync-Bedingung, virtuelle wiederkehrende Instanzen (Server materialisiert sie weiterhin unveraendert ueber VIRTUAL_ID_REGEX in api/tasks/route.ts) handleDrop selbst liest jetzt nur noch Eingaben, ruft decideTaskDrop auf und fuehrt in einem switch exakt die bisherigen Seiteneffekte aus -- keine geaenderten fetch-Aufrufe, kein geaendertes optimistisches UI-Update, keine geaenderte API-Payload. Wichtiger Nebenbefund, kein Teil dieses Refactorings: Task-Drag-and-Drop funktioniert nur am Desktop. WeeklyView.tsx nutzt ausschliesslich natives HTML5-Drag (draggable/onDragStart/onDrop), das auf Touch-Geraeten nicht feuert. Kein separater Touch-Mechanismus vorhanden; react-dnd/ react-dnd-html5-backend sind installiert, aber nirgends importiert. decideTaskDrop ist bewusst so geschnitten, dass ein kuenftiger Touch-Mechanismus sie unveraendert wiederverwenden koennte -- das Bauen dieses Mechanismus ist ein eigenes Feature-Vorhaben (siehe TODO.md Block M3). Verifiziert: Typecheck, Lint (0 Fehler), 100 Unit-Tests (85 -> 100, 15 neu), Produktions-Build -- alle gruen. Kein Playwright-E2E fuer Drag-and-Drop (existiert im Repo bislang nicht). v1.126.0 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
86 lines
2.7 KiB
JSON
86 lines
2.7 KiB
JSON
{
|
|
"name": "my-weekly-todo-list",
|
|
"version": "1.126.0",
|
|
"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": {
|
|
"dev": "echo \"\\n ✦ My Weekly ToDo List v$(node -p \"require('./package.json').version\") — dev mode\\n\" && next dev -H 0.0.0.0 -p 3000",
|
|
"build": "next build",
|
|
"start": "echo \"\\n ✦ My Weekly ToDo List v$(node -p \"require('./package.json').version\") — production\\n\" && next start",
|
|
"lint": "next lint",
|
|
"type-check": "tsc --noEmit",
|
|
"test": "npm run test:unit",
|
|
"test:unit": "node --experimental-strip-types --test tests/unit/*.test.ts",
|
|
"test:e2e": "playwright test",
|
|
"test:e2e:ui": "playwright test --ui",
|
|
"test:debug": "playwright test tests/debug",
|
|
"sonar": "todo-sonar-scan"
|
|
},
|
|
"keywords": [
|
|
"nextjs",
|
|
"todo",
|
|
"calendar",
|
|
"weekly-view",
|
|
"task-management"
|
|
],
|
|
"author": "My Weekly To Do List Team",
|
|
"license": "MIT",
|
|
"dependencies": {
|
|
"@fortawesome/fontawesome-svg-core": "^7.2.0",
|
|
"@fortawesome/free-brands-svg-icons": "^7.2.0",
|
|
"@fortawesome/free-solid-svg-icons": "^7.2.0",
|
|
"@fortawesome/react-fontawesome": "^3.2.0",
|
|
"@mdi/js": "^7.4.47",
|
|
"@mdi/react": "^1.6.1",
|
|
"@next-auth/prisma-adapter": "^1.0.7",
|
|
"@notionhq/client": "^5.14.0",
|
|
"@prisma/client": "5.22.0",
|
|
"@react-pdf/renderer": "^4.4.0",
|
|
"@tiptap/extension-link": "^3.20.0",
|
|
"@tiptap/extension-placeholder": "^3.20.0",
|
|
"@tiptap/extension-underline": "^3.20.0",
|
|
"@tiptap/react": "^3.20.0",
|
|
"@tiptap/starter-kit": "^3.20.0",
|
|
"@types/bcryptjs": "^2.4.6",
|
|
"@types/nodemailer": "^8.0.1",
|
|
"bcryptjs": "^3.0.3",
|
|
"date-fns": "^2.30.0",
|
|
"google-auth-library": "^10.9.1",
|
|
"googleapis": "^170.1.0",
|
|
"ical.js": "^2.2.1",
|
|
"lucide-react": "^0.563.0",
|
|
"next": "15.5.24",
|
|
"next-auth": "^4.24.15",
|
|
"nodemailer": "^10.0.8",
|
|
"postcss-cli": "^11.0.1",
|
|
"prisma": "5.22.0",
|
|
"react": "^18.2.0",
|
|
"react-dnd": "^16.0.1",
|
|
"react-dnd-html5-backend": "^16.0.1",
|
|
"react-dom": "^18.2.0",
|
|
"tsdav": "^2.1.8",
|
|
"web-push": "^3.6.7",
|
|
"zustand": "^4.4.0"
|
|
},
|
|
"overrides": {
|
|
"@auth/core": "0.41.3",
|
|
"nodemailer": "^10.0.8",
|
|
"next": {
|
|
"postcss": "^8.5.28"
|
|
},
|
|
"google-auth-library": "^10.9.1"
|
|
},
|
|
"devDependencies": {
|
|
"@playwright/test": "^1.58.0",
|
|
"@types/node": "^20.0.0",
|
|
"@types/react": "^18.2.0",
|
|
"@types/react-dom": "^18.2.0",
|
|
"autoprefixer": "^10.4.19",
|
|
"eslint": "^8.0.0",
|
|
"eslint-config-next": "15.5.24",
|
|
"postcss": "^8.5.28",
|
|
"tailwindcss": "^3.4.1",
|
|
"typescript": "^5.0.0"
|
|
}
|
|
}
|