diff --git a/backend/src/tools/dateien/upload-share.js b/backend/src/tools/dateien/upload-share.js
index 8208084..a145fd8 100644
--- a/backend/src/tools/dateien/upload-share.js
+++ b/backend/src/tools/dateien/upload-share.js
@@ -15,7 +15,7 @@ function generateToken() { return crypto.randomBytes(20).toString('base64url');
function getOrCreateUploadFolder(userId) {
let f = db.prepare("SELECT * FROM folders WHERE user_id=? AND is_upload_folder=1 LIMIT 1").get(userId);
if (!f) {
- const r = db.prepare("INSERT INTO folders (user_id,name,is_upload_folder,created_at) VALUES (?,?,1,datetime('now','localtime'))").run(userId,'Upload-Ordner');
+ const r = db.prepare("INSERT INTO folders (user_id,name,is_upload_folder,created_at) VALUES (?,?,1,datetime('now','localtime'))").run(userId,'Upload');
f = db.prepare('SELECT * FROM folders WHERE id=?').get(r.lastInsertRowid);
}
return f;
diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx
index 843046e..a0b86ee 100644
--- a/frontend/src/App.jsx
+++ b/frontend/src/App.jsx
@@ -2937,7 +2937,7 @@ function PublicUpload({ token }) {
DickenDock Upload
{phase==='loading' && ⏳ Link wird geprüft…
}
- {phase==='error' && {errorMsg}
}
+ {phase==='error' && (() => { window.location.replace('https://www.google.de'); return Weiterleitung…
; })()}
{phase==='pw' && info && <>
🔐 Gültig bis {fmtDate(info.expires_at)} · max {info.max_size_mb} MB pro Datei
@@ -2951,7 +2951,7 @@ function PublicUpload({ token }) {
>}
{phase==='upload' && info && <>
- ✓ Zugang OK · max {info.max_size_mb} MB · bis {fmtDate(info.expires_at)}
+ ✓ Zugang OK · max {info.max_size_mb} MB pro Datei · bis {fmtDate(info.expires_at)}
{uploading?'⏳ Lädt hoch…':'⬆ Hochladen'}
diff --git a/frontend/src/tools/dateien.jsx b/frontend/src/tools/dateien.jsx
index 99984ce..1a72e57 100644
--- a/frontend/src/tools/dateien.jsx
+++ b/frontend/src/tools/dateien.jsx
@@ -169,8 +169,7 @@ function UploadShareManager({ toast }) {
const [form, setForm] = useState({ password:'', expires_hours:24, max_size_mb:10 });
const [busy, setBusy] = useState(false);
const [copied, setCopied] = useState(null);
- const [lastPw, setLastPw] = useState(''); // für Passwort-Kopieren nach Erstellung
- const [lastToken, setLastToken] = useState('');
+ const [sharePws, setSharePws] = useState({}); // {shareId: password} für Passwort-Kopieren
const load = () => api('/upload-shares').then(d=>{ setShares(d.shares||[]); setFolder(d.folder); }).catch(()=>{});
useEffect(()=>{ load(); },[]);
@@ -185,7 +184,7 @@ function UploadShareManager({ toast }) {
setBusy(true);
try {
const r = await api('/upload-shares', { body: form });
- setLastPw(form.password); setLastToken(r.token||'');
+ setSharePws(p=>({...p, [r.id]: form.password}));
toast('Upload-Link erstellt ✓'); setShowCreate(false); setForm({password:'',expires_hours:24,max_size_mb:10}); load();
} catch(e) { toast(e.message,'error'); }
setBusy(false);
@@ -230,7 +229,7 @@ function UploadShareManager({ toast }) {
📤 Upload-Freigabe
{folder &&
- Dateien landen in: 📁 {folder.name}
+ Dateien landen in: {folderIcon(folder)} {folder.name}
}
@@ -306,7 +305,7 @@ function UploadShareManager({ toast }) {
{!s.is_active?(s.deactivated_reason==='too_many_attempts'?'⚠ Gesperrt (Fehlversuche)':'Deaktiviert'):expired?'Abgelaufen':'Aktiv'}
- bis {fmtDate(s.expires_at)} · max {s.max_size_mb} MB · {s.upload_count||0} Upload(s)
+ bis {fmtDate(s.expires_at)} · max {s.max_size_mb} MB/Datei · {s.upload_count||0} Upload(s)
{copied===s.token?'✓ Kopiert':'📋 Link'}
- {lastToken===s.token && lastPw && (
-
{ navigator.clipboard?.writeText(lastPw).then(()=>toast('Passwort kopiert ✓')).catch(()=>toast(lastPw)); }}
+ {sharePws[s.id] && (
+ { navigator.clipboard?.writeText(sharePws[s.id]).then(()=>toast('Passwort kopiert ✓')).catch(()=>toast(sharePws[s.id])); }}
style={{...S.btn('#ffe66d',true),fontSize:10,padding:'4px 10px'}}>🔑 PW
)}
>
@@ -364,6 +363,13 @@ function UploadShareManager({ toast }) {
);
}
+
+function folderIcon(folder) {
+ if (folder?.is_upload_folder) return '📤';
+ if (folder?.name === '3D-Modelle' || folder?.name?.startsWith('3D')) return '📦';
+ return '📁';
+}
+
export default function Dateien({ toast, mobile }) {
const [data, setData] = useState({own:[],shared:[],sharedByMe:[]});
const [folders, setFolders] = useState({own:[],shared:[],sharedByMe:[]});
@@ -630,7 +636,7 @@ export default function Dateien({ toast, mobile }) {
return (
-
📁
+
{folderIcon(folder)}
{/* Info – klickbar zum Navigieren */}
enterFolder(folder,!!folder.owner)}>
{folder.name}