浏览代码

claude.md

master
父节点
当前提交
d61426e414
共有 1 个文件被更改,包括 23 次插入1 次删除
  1. +23
    -1
      CLAUDE.md

+ 23
- 1
CLAUDE.md 查看文件

@@ -186,10 +186,32 @@ Alle drei nutzen die gleichen Filter-Parameter wie die Report-Seite, exportieren

Alle Spalten der Report-Tabelle sind serverseitig sortierbar (Klick auf Spaltenheader togglet ASC/DESC). URL-Parameter: `?sort={column}&dir={ASC|DESC}`. Default: `sort=date&dir=DESC`.

Sortierbare Spalten: `date`, `client`, `project`, `service`, `user`, `note`, `duration`, `revenue`. Die Revenue-Sortierung nutzt einen `HIDDEN`-Select-Alias (`COALESCE(p.hourlyRate, c.hourlyRate, s.hourlyRate) * t.duration`), da DQL keine berechneten Ausdrücke direkt im `ORDER BY` unterstützt. Sekundärsort ist immer `t.createdAt DESC`.
Sortierbare Spalten: `date`, `client`, `project`, `service`, `label`, `user`, `note`, `duration`, `revenue`. Die Revenue-Sortierung nutzt einen `HIDDEN`-Select-Alias (`COALESCE(p.hourlyRate, c.hourlyRate, s.hourlyRate) * t.duration`), da DQL keine berechneten Ausdrücke direkt im `ORDER BY` unterstützt. Sekundärsort ist immer `t.createdAt DESC`.

Twig-Macro `sort_header` im Template rendert die klickbaren Spaltenheader mit Sort-Indikator (▴/▾). JS (`initSortHeaders()`) setzt `sort`/`dir` als URL-Parameter und navigiert.

## Labels

Optionales Freitext-Label pro Zeiteintrag zur Kategorisierung (z.B. Ticketnummer, Feature-Name).

### Datenmodell

- `TimeEntry.label` (`VARCHAR(255)`, nullable, indiziert via `idx_time_entry_label`)
- Wird bei Create, Update und Timer-Start gesetzt

### API

| Route | Method | Beschreibung |
|-----------------|--------|-----------------------------------------------------------|
| `/api/labels` | GET | Autocomplete: `?projectId=X` (Top 5) oder `?q=X` (Suche) |

### Frontend

- **Entry-Formular** (Create + Edit): Chip-UI mit Autocomplete-Dropdown. Beim Projektwechsel werden projektspezifische Label-Vorschläge geladen (`findTopLabelsByProject`). Freitextsuche über `searchLabels`.
- **Stoppuhr-Popover**: Einfaches Textfeld (Desktop + Hamburger-Menü), Label wird beim Timer-Start mitgesendet.
- **Report-Tabelle**: Eigene sortierbare Spalte (`label`), Anzeige als Badge.
- **Report-Filter**: Label-Filter mit Mehrfachauswahl, Autocomplete und Negation (`labels_neg`). Filterlogik: `IN` (default) oder `NOT IN` (negiert).

## Stoppuhr / Timer

Live-Timer zum Tracken von Zeiteinträgen. UI in der Navigation (Desktop + Hamburger-Menü), zusätzlich Play-Button an jeder Entry-Row zum Fortsetzen.


正在加载...
取消
保存