Dateien nach "frontend/src" hochladen
This commit is contained in:
@@ -242,7 +242,7 @@ function Sidebar({ active, setActive, user, onLogout, updateInfo, onUpdateClick
|
|||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
{user?.role==='admin' && <NavBtn item={{ id:'admin', Icon:AdminIcon, label:'Einstellungen' }} />}
|
<NavBtn item={{ id:'admin', Icon:AdminIcon, label:'Einstellungen' }} />
|
||||||
</nav>
|
</nav>
|
||||||
{updateInfo?.hasUpdate && (
|
{updateInfo?.hasUpdate && (
|
||||||
<button onClick={onUpdateClick} style={{
|
<button onClick={onUpdateClick} style={{
|
||||||
@@ -309,7 +309,7 @@ function BottomNav({ active, setActive, user, onLogout, updateInfo, onUpdateClic
|
|||||||
const mainNav = [
|
const mainNav = [
|
||||||
{ id:'dashboard', Icon:HomeIcon, label:'Home' },
|
{ id:'dashboard', Icon:HomeIcon, label:'Home' },
|
||||||
{ id:'_apps', Icon:AppsIcon, label:'Apps' },
|
{ id:'_apps', Icon:AppsIcon, label:'Apps' },
|
||||||
...(user?.role==='admin' ? [{ id:'admin', Icon:AdminIcon, label:'Einstellungen' }] : []),
|
{ id:'admin', Icon:AdminIcon, label:'Einst.' },
|
||||||
{ id:'_mehr', Icon:MoreIcon, label:'Mehr' },
|
{ id:'_mehr', Icon:MoreIcon, label:'Mehr' },
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -701,6 +701,37 @@ const Sec = ({title, children}) => (
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// ── Account-Löschung ─────────────────────────────────────────────────────────
|
||||||
|
function DeleteAccountSection({ toast, user }) {
|
||||||
|
const [pw, setPw] = useState('');
|
||||||
|
const [busy, setBusy] = useState(false);
|
||||||
|
const { confirm, ConfirmDialog } = useConfirm();
|
||||||
|
|
||||||
|
const doDelete = async () => {
|
||||||
|
if (!pw) { toast('Passwort eingeben', 'error'); return; }
|
||||||
|
if (!await confirm(`Account "${user.username}" und alle Daten wirklich löschen? Das kann nicht rückgängig gemacht werden.`)) return;
|
||||||
|
setBusy(true);
|
||||||
|
try {
|
||||||
|
await api('/auth/delete-account', { method:'DELETE', body:{ password:pw } });
|
||||||
|
localStorage.removeItem('sk_token');
|
||||||
|
window.location.reload();
|
||||||
|
} catch(e) { toast(e.message, 'error'); } finally { setBusy(false); }
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<ConfirmDialog/>
|
||||||
|
<Field label="PASSWORT ZUR BESTÄTIGUNG" type="password" value={pw} onChange={e=>setPw(e.target.value)}/>
|
||||||
|
<button onClick={doDelete} disabled={busy} style={{
|
||||||
|
...S.btn('#ff6b9d'), width:'100%', textAlign:'center', padding:'11px 0',
|
||||||
|
opacity: busy ? 0.6 : 1,
|
||||||
|
}}>
|
||||||
|
{busy ? '…' : '✕ Account unwiderruflich löschen'}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// ── Benutzerverwaltung ────────────────────────────────────────────────────────
|
// ── Benutzerverwaltung ────────────────────────────────────────────────────────
|
||||||
function UserManagement({ toast }) {
|
function UserManagement({ toast }) {
|
||||||
const [users, setUsers] = useState([]);
|
const [users, setUsers] = useState([]);
|
||||||
@@ -957,6 +988,12 @@ function AdminPanel({ toast, mobile, user }) {
|
|||||||
{busy.pw ? '…' : '✓ Passwort ändern'}
|
{busy.pw ? '…' : '✓ Passwort ändern'}
|
||||||
</button>
|
</button>
|
||||||
</Sec>
|
</Sec>
|
||||||
|
<Sec title="ACCOUNT LÖSCHEN">
|
||||||
|
<p style={{ color:'rgba(255,255,255,0.55)', fontSize:12, fontFamily:'monospace', marginBottom:12, lineHeight:1.6 }}>
|
||||||
|
Löscht deinen Account und alle deine Daten unwiderruflich.
|
||||||
|
</p>
|
||||||
|
<DeleteAccountSection toast={toast} user={user}/>
|
||||||
|
</Sec>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
@@ -1051,7 +1088,7 @@ export default function App() {
|
|||||||
)}
|
)}
|
||||||
<main style={mainStyle}>
|
<main style={mainStyle}>
|
||||||
{active==='dashboard' && <Dashboard toast={toast} mobile={mobile}/>}
|
{active==='dashboard' && <Dashboard toast={toast} mobile={mobile}/>}
|
||||||
{active==='admin' && user?.role==='admin' && <AdminPanel toast={toast} mobile={mobile} user={user}/>}
|
{active==='admin' && <AdminPanel toast={toast} mobile={mobile} user={user}/>}
|
||||||
{activeTool && <activeTool.component toast={toast} mobile={mobile}/>}
|
{activeTool && <activeTool.component toast={toast} mobile={mobile}/>}
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user