From 9bf8415a43bac059ef40a8310ba9da2fdfe80184 Mon Sep 17 00:00:00 2001 From: Dicken Date: Tue, 26 May 2026 01:12:07 +0200 Subject: [PATCH] Dateien nach "frontend/src" hochladen --- frontend/src/App.jsx | 63 ++++++++++++++++++++++++++++++++++++++++ frontend/src/confirm.jsx | 49 +++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 frontend/src/confirm.jsx diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index fe8c0df..2e55b00 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,6 +1,7 @@ import { useState, useEffect, useRef, useCallback } from 'react'; import { api, S } from './lib.js'; import { TOOLS, getGroupedTools } from './toolRegistry.js'; +import { useConfirm } from './confirm.jsx'; import { HomeIcon, AppsIcon, AdminIcon, MoreIcon, UserIcon, LogOutIcon, ChevronIcon, UpdateIcon } from './icons.jsx'; const ICONS = ['๐Ÿ”—','๐ŸŒ','๐Ÿ“Š','๐Ÿ“','๐Ÿ› ','๐Ÿ“ง','๐Ÿ—“','๐Ÿ’พ','๐Ÿ–ฅ','๐Ÿ“ก','๐Ÿ”’','๐Ÿ“–','๐ŸŽฏ','โšก','๐Ÿ ','๐Ÿ”ง','๐Ÿ“ฑ','๐ŸŽฎ','๐Ÿš€','๐Ÿ’ก']; @@ -330,6 +331,7 @@ function BottomNav({ active, setActive, user, onLogout, updateInfo, onUpdateClic // โ”€โ”€ Dashboard Widgets โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ function QuickLinks({ toast, mobile }) { + const { confirm, ConfirmDialog } = useConfirm(); const [links, setLinks] = useState([]); const [editMode, setEdit] = useState(false); const [showForm, setForm] = useState(false); @@ -356,12 +358,14 @@ function QuickLinks({ toast, mobile }) { }; const del = async id => { + if (!await confirm('Link wirklich lรถschen?')) return; try { await api(`/dashboard/links/${id}`, { method:'DELETE' }); setLinks(p => p.filter(l => l.id!==id)); toast('Gelรถscht'); } catch(e) { toast(e.message, 'error'); } }; return (
+
SCHNELLZUGRIFF
@@ -539,6 +543,64 @@ function Notepad({ toast }) { ); } + +// โ”€โ”€ Bestell-Statistik Widget โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +function BestellStats() { + const [stats, setStats] = useState(null); + const [open, setOpen] = useState(false); + const [loaded, setLoaded] = useState(false); + + const load = () => { + if (loaded) return; + api('/dashboard/stats').then(s => { setStats(s); setLoaded(true); }).catch(() => {}); + }; + + const toggle = () => { setOpen(v => !v); if (!open) load(); }; + + const Row = ({label, val, color='#fff'}) => ( +
+ {label} + {val} +
+ ); + + return ( +
+ + {open && ( +
+ {!stats ? ( +
Lรคdtโ€ฆ
+ ) : ( + <> +
+
BESTELLUNGEN
+ + + + + + +
+
+
EINNAHMEN
+ + + +
+ + )} +
+ )} +
+ ); +} + function Dashboard({ toast, mobile }) { return (
@@ -549,6 +611,7 @@ function Dashboard({ toast, mobile }) {

+
diff --git a/frontend/src/confirm.jsx b/frontend/src/confirm.jsx new file mode 100644 index 0000000..6722f1e --- /dev/null +++ b/frontend/src/confirm.jsx @@ -0,0 +1,49 @@ +// โ”€โ”€ Globaler Bestรคtigungs-Dialog โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +// Verwendung: const { confirm, ConfirmDialog } = useConfirm(); +// await confirm('Wirklich lรถschen?') && deleteFn(); +import { useState, useCallback } from 'react'; + +export function useConfirm() { + const [state, setState] = useState({ open:false, msg:'', resolve:null }); + + const confirm = useCallback((msg='Wirklich fortfahren?') => { + return new Promise(resolve => { + setState({ open:true, msg, resolve }); + }); + }, []); + + const handle = yes => { + state.resolve?.(yes); + setState({ open:false, msg:'', resolve:null }); + }; + + const ConfirmDialog = () => !state.open ? null : ( +
handle(false)}> +
e.stopPropagation()}> +
+

{state.msg}

+
+ + +
+
+
+ ); + + return { confirm, ConfirmDialog }; +}