Initial commit: EatMe attendance tracker
Google-SSO PWA for bistro employee clock-in/out, admin employee management, and stats with CSV export. Express + SQLite backend, React + Zustand frontend in the light-mono-tui design language. Multi-stage Dockerfile, compose.yaml for image-based deploys, nginx reverse-proxy template, and an OKF documentation bundle in docs/. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
40
frontend/src/pages/AdminApp.tsx
Normal file
40
frontend/src/pages/AdminApp.tsx
Normal file
@@ -0,0 +1,40 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
import { EmployeeManager } from '../components/EmployeeManager';
|
||||
import { AdminStats } from '../components/AdminStats';
|
||||
|
||||
type Tab = 'employees' | 'stats';
|
||||
|
||||
export function AdminApp() {
|
||||
const [tab, setTab] = useState<Tab>('employees');
|
||||
|
||||
useEffect(() => {
|
||||
function onKey(e: KeyboardEvent) {
|
||||
const target = e.target as HTMLElement;
|
||||
if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') return;
|
||||
if (e.key === '1') setTab('employees');
|
||||
if (e.key === '2') setTab('stats');
|
||||
}
|
||||
window.addEventListener('keydown', onKey);
|
||||
return () => window.removeEventListener('keydown', onKey);
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="tabs">
|
||||
<button
|
||||
className={`tab ${tab === 'employees' ? 'active' : ''}`}
|
||||
onClick={() => setTab('employees')}
|
||||
>
|
||||
[1] Zaměstnanci
|
||||
</button>
|
||||
<button className={`tab ${tab === 'stats' ? 'active' : ''}`} onClick={() => setTab('stats')}>
|
||||
[2] Statistiky
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div style={{ marginTop: '1rem' }}>
|
||||
{tab === 'employees' ? <EmployeeManager /> : <AdminStats />}
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user