Die Einblendanimationen laufen mit animation-fill-mode: both. Danach behaelt
das Element den Wert des letzten Keyframes, bei transform also eine
Einheitsmatrix statt "none". Das genuegt, um einen Bezugsrahmen fuer
position: fixed zu erzeugen: Ein Dialog unterhalb einer solchen Karte hat
sein Overlay nur noch ueber der Karte, deren overflow: hidden schneidet ihn
ab. Sichtbar beim Bearbeiten eines Budgettopfs in der Projektansicht - das
Fenster klebte an der Detailkarte und die Schaltflaechen waren abgeschnitten.
Modal und ConfirmDialog rendern jetzt per createPortal in document.body.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Neue Komponente EntryList zeigt einzelne Buchungen als sortierbare Tabelle
mit Datum, Kunde, Projekt, Task und der Zeit getrennt nach billable und
non-billable, inklusive Summen.
- Buchung: Umschalter Kalender/Liste neben Woche/Monat/Jahr, Auswahl wird
im Browser gemerkt. Klick auf eine Zeile oeffnet die Buchung.
- Reports: Klick auf einen Mitarbeiter oeffnet dessen Buchungen des
Reportzeitraums als Liste; ein gesetzter Kundenfilter wird uebernommen.
- Kunden: Umschalter Karten/Liste mit Ort, Projekten, Stunden und Umsatz.
- GET /api/entries akzeptiert dafuer customer_id, Segmented nimmt Icons,
Modal kennt die Groesse 2xl.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Abruf braucht keinen Budgettopf: es gibt kein zugesagtes Volumen und kein
Ablaufdatum, gebucht wird, was anfaellt. Der Satz kann deshalb nicht am
Topf haengen und steht am Projekt (pulse_projects.rate, Stunde oder Tag).
Der Umsatz sind die abrechenbaren Stunden mal diesem Satz; offen ist
nichts.
- Migration ergaenzt den ENUM-Wert und die Spalte rate
- Anlegen verlangt einen Satz und nimmt keine Toepfe an; ein Topf
nachtraeglich anzulegen wird abgewiesen
- Wechsel auf Abruf nur, solange auf den Toepfen nichts gebucht ist -
sonst wuerden Buchungen ihr Budget verlieren; leere Toepfe fallen weg
- Buchungsdialog, Projektkarte, Projektdetail und Projektreport zeigen
Satz und Umsatz statt Budgetbalken
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Das Logo lag in public/ und hatte immer denselben Namen. Apache gibt
Bildern ein Jahr Cache-Zeit mit - eine neue Fassung war deshalb erst
nach hartem Neuladen zu sehen, obwohl der Server sie schon auslieferte.
Jetzt liegt es in src/assets/ und wird importiert: Vite haengt einen Hash
an den Dateinamen (assets/pulse-logo-<hash>.png), der sich bei jeder
Aenderung mitaendert.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
/Pulse-Logo.png deckte nur die erste Vorlage ab, Pulse-Logo2.png landete
dadurch im Repo. Jetzt greift /Pulse-Logo*.png.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Pulse-Logo2.png war bereits freigestellt, deshalb nur zugeschnitten und
auf 160 px Hoehe skaliert (73 KB). Angezeigt 46 px hoch, 159 px breit.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Das groessere Logo machte die Logo-Zeile 79 px hoch, der Header blieb bei
71,5 px - die Linie lief schief. Beide haengen jetzt an
--app-bar-height (4,5 rem); das Logo begrenzt nur seine maximale Hoehe.
So bleibt es buendig, auch wenn Logo oder Titel sich aendern.
Dazu die neu zugeschnittene Logovorlage uebernommen: weniger Freiflaeche,
freigestellt und auf 160 px Hoehe skaliert.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Oben links steht jetzt das Pulse-Logo statt des perinco-Logos; der
Schriftzug "Pulse" daneben ist damit doppelt und entfaellt. Das Logo ist
freigestellt (grauer Grund und Bildrauschen entfernt, auf 140 px Hoehe
zugeschnitten) und wird im Dunkelmodus nicht umgefaerbt - die Wuerfel
sind gruen und sollen gruen bleiben.
Die schaukelnden Huegel im hellen Aura lagen als Hintergrundbild und
wurden ueber background-position bewegt; bei diesen breiten Formen war
das nicht zu sehen. Sie liegen nun in einer eigenen Ebene und wandern
per transform 26 px hin und her, dazu 5 px auf und ab.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Uebersicht der sieben Farbwelten mit ihren Animationen, dazu die vier
Stellen, die ein neues Theme braucht - die Pruefung im Backend wurde
beim Nachziehen von Rainy, Snow und Aura dreimal vergessen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Erste Fassung, live unter https://pulse.perinco.de.
Frontend React 19 + TypeScript + Tailwind 4 (Vite), Backend Express mit
mysql2 auf MariaDB, Exporte als PDF (pdfkit), Excel (exceljs) und CSV.
Aufbau, Designsystem und die sieben Themes kommen aus dem perinco CRM.
Fachlich:
- Buchung mit Wochen-, Monats- und Jahresansicht, Zeiten als 1:23 oder 1,5
- Projekte mit n Budgettoepfen: Laufzeit, Volumen, Sperre bei Ablauf oder
aufgebrauchtem Budget, Buchung nur auf den passenden Topf
- Kunden, Team mit Hierarchie, Reports im Harvest-Stil, Monatsexporte
- Rollen user/lead/management/admin, doppelt geprueft (Menue und Backend)
- SSO gegen Microsoft Entra ID, Uebernahme der AD-Benutzer per Drag & Drop
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>