Puls → Dashboard umbenennen + Projekt-Beschreibung
ci / quality (push) Has been cancelled
ci / build (push) Has been cancelled

UI/Routing
- Tab + Route: /puls → /dashboard, Heading „Unternehmens-Puls" → „Dashboard"
- Shortcut: g p → g d (Cheatsheet entsprechend)
- Breadcrumbs, 404-Hinweistext, alle internen Links angepasst

Code-Layout
- apps/web/src/routes/puls.tsx → dashboard.tsx (Komponente DashboardRoute)
- apps/api/src/routers/puls.ts → dashboard.ts (dashboardRouter)
- tRPC-Aufrufe: trpc.puls.* / utils.puls.* → trpc.dashboard.* / utils.dashboard.*
- Auth-Redirects (/api/auth/login, /callback, dev-login) zeigen jetzt auf /dashboard

Projekt-Beschreibung
- Migration 0007_project_description: project.description text (nullable)
- Shared Zod: ProjectSchemas.createProjectInput.description (max 2000, optional)
- Backend: project.create mappt input.description
- Frontend Dialog „Neues Projekt": Textarea (3 Zeilen, optional)
- Projekt-Detail: zeigt Beschreibung als whitespace-pre-wrap unter Subtitle

README
- Routen-Tabelle, Shortcut-Liste, Verzeichnis-Baum, DB-Tabellen, Migration-Range,
  Frontend-Routenliste aktualisiert

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
dejanandClaude Opus 4.7 committed 2026-06-02 17:51:08 +02:00
1 parent 4879556905
commit c8fc024ca0
21 files changed
+2025 -39

No files matched your search

+11 -11
View File
@@ -10,7 +10,7 @@ Internes Web-Tool von **ToolCTRL** für den täglichen Überblick über alle Pro
| Bereich | Feature |
|---|---|
| **Puls** (`/puls`) | Unternehmens-Übersicht: Bereichs-Ampelstatus, „Heute fehlt"-Liste, bereichsübergreifende Blocker, Pflicht-Minimum-Übersicht, Jourfixe-Hinweis, „Heute im Team" (ToDos), „Zeit im Team heute" (Live-Tracking), Vortags-Feed |
| **Dashboard** (`/dashboard`) | Unternehmens-Übersicht: Bereichs-Ampelstatus, „Heute fehlt"-Liste, bereichsübergreifende Blocker, Pflicht-Minimum-Übersicht, Jourfixe-Hinweis, „Heute im Team" (ToDos), „Zeit im Team heute" (Live-Tracking), Vortags-Feed |
| **Bereich** (`/bereich`, `/bereich/<slug>`) | Tab-Switcher über Entwicklung / Vertrieb / Marketing — pro Bereich Projekt-Liste (Kundenprojekte / Interne Projekte) mit Pflicht-Minimum-Indicator |
| **Projekt** (`/projekt/:id`) | Detail: Verlinkungen (Outline-Steckbrief, Plane-Board, Risikoliste), Pflicht-Minimum-Status, Meilenstein-Checkliste, DoD, Projekt-Abschluss (P1) |
| **Heute** (`/heute`) | Tagesrhythmus: Lock-in mit ToDo-Liste, Auto-Carryover offener ToDos vom Vortag, ToDo-Editor, Zeiterfassungs-Timeline mit Edit/Delete/Nachtrag |
@@ -19,11 +19,11 @@ Internes Web-Tool von **ToolCTRL** für den täglichen Überblick über alle Pro
**Querschnittsfunktionen**
- **Zeiterfassung**: Persistente Timer-Pill in der TopNav (Live-Sekundenzähler), Quick-Picker mit ToDos + Kategorien + Freitext, retroaktiver Nachtrag-Dialog, Bindung an ToDo optional. Personenübergreifend sichtbar auf dem Puls.
- **Zeiterfassung**: Persistente Timer-Pill in der TopNav (Live-Sekundenzähler), Quick-Picker mit ToDos + Kategorien + Freitext, retroaktiver Nachtrag-Dialog, Bindung an ToDo optional. Personenübergreifend sichtbar im Dashboard.
- **Blocker**: Inline in der Reflexion oder über `n`-Shortcut bzw. den globalen „Neuer Blocker"-Dialog. Auflösung nur durch den Projekt-P1.
- **Pflicht-Minimum-Check** (Leitfaden §9): 6-Punkte-Checkliste pro Projekt, einer davon (Status-Ampel aktuell) wird stündlich per Cron aus den Reflexions-Zeitstempeln aktualisiert.
- **Streak**: aufeinanderfolgende Werktage mit voller Reflexion. Flammen-Pill rechts oben.
- **Keyboard-Shortcuts**: `g p/b/h/a` Navigation, `g e/v/m` direkt in Entwicklung/Vertrieb/Marketing, `n` Neuer Blocker, `?` Cheatsheet.
- **Keyboard-Shortcuts**: `g d/b/h/a` Navigation, `g e/v/m` direkt in Entwicklung/Vertrieb/Marketing, `n` Neuer Blocker, `?` Cheatsheet.
---
@@ -67,7 +67,7 @@ Internes Web-Tool von **ToolCTRL** für den täglichen Überblick über alle Pro
│ │ │ ├── hooks/ useCurrentUser
│ │ │ ├── lib/ router, trpc, trpc-provider, voice,
│ │ │ │ format-duration, time-categories
│ │ │ ├── routes/ puls, bereich, projekt, heute, reflexion,
│ │ │ ├── routes/ dashboard, bereich, projekt, heute, reflexion,
│ │ │ │ archiv, login, not-found
│ │ │ └── styles/globals.css
│ │ ├── index.html
@@ -80,7 +80,7 @@ Internes Web-Tool von **ToolCTRL** für den täglichen Überblick über alle Pro
│ ├── cron/routes.ts /internal/cron/* (Bearer-Token geschützt)
│ ├── lib/ werktag (Mo-Fr Berlin), ampel, pflicht-minimum, logger
│ ├── routers/ _app, user, area, project, deal, gtm,
│ │ campaign, blocker, day-entry, time, puls
│ │ campaign, blocker, day-entry, time, dashboard
│ ├── env.ts Zod-validierte Env-Vars
│ ├── db.ts Singleton-Drizzle-Client
│ ├── trpc.ts Context, protectedProcedure, withAudit
@@ -89,7 +89,7 @@ Internes Web-Tool von **ToolCTRL** für den täglichen Überblick über alle Pro
├── packages/
│ ├── db/ Drizzle-Schema + Migrationen
│ │ ├── src/{schema,client,seed,index}.ts
│ │ ├── migrations/ 0000_init … 0006_time_entry
│ │ ├── migrations/ 0000_init … 0007_project_description
│ │ └── drizzle.config.ts
│ └── shared/ Zod-Schemas + Konstanten + Types
│ └── src/schemas/ day-entry, project, deal, campaign, time-entry
@@ -169,7 +169,7 @@ pnpm --filter @cockpit/db migrate:generate --name=<name> # neue Migration
Postgres 16, Drizzle als ORM und Migrator. **Schema-Single-Source-of-Truth**: `packages/db/src/schema.ts`.
### Tabellen (aktueller Stand nach Migration 0006)
### Tabellen (aktueller Stand nach Migration 0007)
| Tabelle | Zweck |
|---|---|
@@ -177,7 +177,7 @@ Postgres 16, Drizzle als ORM und Migrator. **Schema-Single-Source-of-Truth**: `p
| `session` | Server-Side Sessions (Postgres-persistent), Browser kennt nur Cookie-`id` |
| `audit_event` | Audit-Trail für jede mutierende Operation |
| `area` | Bereich (entwicklung / vertrieb / marketing / allgemein) |
| `project` | Projekt mit Cockpit-Sicht-Feldern (Outline-/Plane-URLs, Pflicht-Minimum-State JSONB, etc.) |
| `project` | Projekt: Name, optionale `description`, Outline-/Plane-URLs, Arbeitsmodus (cycle/kanban), `pflicht_minimum_state` JSONB, Status-/Trend-Cache, Archiv-Felder |
| `milestone` | Cockpit-Sicht-Meilenstein pro Projekt |
| `day_entry` | Tageseintrag (begun / full / absent), `published_at` für Vortrags-Veröffentlichung |
| `todo` | Tagesplan-Item, optional an Bezug gebunden, `carried_over`-Flag |
@@ -221,7 +221,7 @@ dayEntry today, todayTeam, pendingCarryOver, checkIn,
updateTodos, submitReflection, feed, todayPresence
time now, start, stop, listToday, update, upsertManual,
delete, teamToday
puls overview
dashboard overview
```
Frontend importiert den Typ via `import type { AppRouter } from '@cockpit/api/router'` (siehe `apps/web/src/lib/trpc.ts`).
@@ -259,7 +259,7 @@ Im `NODE_ENV=development` ist `/api/auth/dev-login` aktiv. Die Frontend-Login-Ro
- Sucht den User mit `email = 'dejan@tool-ctrl.de'`.
- Existiert er nicht, wird er via `upsertUserFromOidc` mit `sub='local-dejan'` angelegt.
- Session wird gesetzt, Redirect auf `/puls`.
- Session wird gesetzt, Redirect auf `/dashboard`.
In Production ist diese Route nicht registriert, weil die `if (env.NODE_ENV === 'development')`-Guard in `apps/api/src/auth/routes.ts` dann false ist.
@@ -299,7 +299,7 @@ Login-Route ist außerhalb der `AppShell` (`/login`). Alle übrigen Routen unter
In `apps/web/src/components/layout/AppShell.tsx`:
```
g p Puls
g d Dashboard
g b Bereich (Default Entwicklung)
g e Entwicklung
g v Vertrieb