feat: perinco Pulse - Zeiterfassung fuer perinco
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>
This commit is contained in:
+57
@@ -0,0 +1,57 @@
|
||||
<!doctype html>
|
||||
<html lang="de" class="h-full">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/png" href="/favicon.png" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
|
||||
<meta name="theme-color" content="#6ba04a" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<link rel="apple-touch-icon" href="/favicon.png" />
|
||||
<meta name="robots" content="noindex, nofollow" />
|
||||
<title>Pulse · perinco</title>
|
||||
<script>
|
||||
// Setzt Design und Modus vor dem ersten Frame - ohne das blitzt beim Laden
|
||||
// die helle perinco-Variante auf, weil das Bundle erst danach laeuft.
|
||||
//
|
||||
// Die verbindliche Wahl steht am Benutzer in der Datenbank; hier liegt nur
|
||||
// die zuletzt benutzte als Zwischenspeicher, denn vor dem ersten Frame ist
|
||||
// noch niemand angemeldet. Melden sich zwei Benutzer an demselben Rechner
|
||||
// an, sieht der zweite fuer einen Moment das Design des ersten und dann
|
||||
// sein eigenes - das ist der Preis dafuer, dass es gar nicht blitzt.
|
||||
(function () {
|
||||
try {
|
||||
var mode = localStorage.getItem('pulse_theme');
|
||||
var dark =
|
||||
mode === 'dark' ||
|
||||
(mode !== 'light' && window.matchMedia('(prefers-color-scheme: dark)').matches);
|
||||
if (dark) document.documentElement.classList.add('dark');
|
||||
document.documentElement.style.colorScheme = dark ? 'dark' : 'light';
|
||||
|
||||
var palette = localStorage.getItem('pulse_palette');
|
||||
// Whitelist, damit ein manipulierter Eintrag keine Klasse setzt.
|
||||
if (['pixel', 'outdoor', 'cyberpunk', 'rainy', 'snow', 'aura'].indexOf(palette) !== -1) {
|
||||
document.documentElement.classList.add('theme-' + palette);
|
||||
}
|
||||
} catch (e) {
|
||||
/* localStorage gesperrt - dann eben im hellen perinco-Design starten */
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
<!--
|
||||
Nunito Sans traegt perinco und Pixel Art (Fliesstext), Cabin das Outdoor-
|
||||
Design, Silkscreen die Ueberschriften von Pixel Art, Chakra Petch das
|
||||
Cyberpunk-Design. Alle in einer Anfrage: ein Nachladen beim Umschalten
|
||||
wuerde die Schrift sichtbar springen lassen.
|
||||
-->
|
||||
<link
|
||||
href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,opsz,wght@0,6..12,300;0,6..12,400;0,6..12,600;0,6..12,700;0,6..12,800&family=Cabin:wght@400;500;600;700&family=Silkscreen:wght@400;700&family=Chakra+Petch:wght@400;500;600;700&display=swap"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
</head>
|
||||
<body class="h-full">
|
||||
<div id="root" class="h-full"></div>
|
||||
<script type="module" src="/src/main.tsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user