-
+ {/* ββ Seitentitel ββββββββββββββββββββββββββββββββββββββββββββββββββββ */}
+
+
Dateien
+
+ {data.own.length} Dateien Β· {fmtSize(totalSize)}
- {/* Tabs + Ordner-Button */}
- {!currentFolderId && (
-
- {[
- ['own','Meine Dateien', null],
- ['shared','Geteilt mit mir', data.shared.length + (folders.shared||[]).length],
- ['sharedByMe','Geteilt von mir', (data.sharedByMe||[]).length + (folders.sharedByMe||[]).length],
- ].map(([k,l,cnt])=>(
-
- ))}
- {tab==='own' && (
-
- )}
-
- )}
+ {/* ββ Tabs + Neu-Ordner (ΓΌberall gleich) βββββββββββββββββββββββββββββ */}
+
+ {[
+ ['own','Meine Dateien', null],
+ ['shared','Geteilt mit mir', sharedCnt||null],
+ ['sharedByMe','Geteilt von mir', byMeCnt||null],
+ ].map(([k,l,cnt])=>(
+
+ ))}
+ {/* Ordner-Button β immer am Ende der Tab-Reihe wenn own-Tab aktiv */}
+ {isOwn && !newFolder && (
+
+ )}
+
- {/* Breadcrumb */}
- {folderPath.length > 0 && (
+ {/* ββ Breadcrumb ββββββββββββββββββββββββββββββββββββββββββββββββββββββ */}
+ {folderPath.length>0 && (
{folderPath.map((p,i)=>(
-
+
)}
- {/* Neuer Ordner Button (in Unterordnern) */}
- {tab==='own' && currentFolderId && !newFolder && !inSharedFolder && (
-
- )}
-
- {/* Neuer Ordner Formular */}
+ {/* ββ Neuer Ordner Formular βββββββββββββββββββββββββββββββββββββββββββ */}
{newFolder && (
π
setFolderName(e.target.value)}
onKeyDown={e=>{if(e.key==='Enter')createFolder();if(e.key==='Escape'){setNewFolder(false);setFolderName('');}}}
- placeholder="Ordnernameβ¦" autoFocus
- style={{...S.inp,flex:1,fontSize:15}}/>
+ placeholder="Ordnernameβ¦" autoFocus style={{...S.inp,flex:1,fontSize:15}}/>
)}
- {/* Suche */}
-
-
-
-
- setSearch(e.target.value)} placeholder="Suchenβ¦"
- style={{...S.inp,paddingLeft:34,fontSize:15}}/>
- {search&&}
-
-
- {/* Drop Zone */}
-
{e.preventDefault();setDragOver(true);}}
- onDragLeave={()=>setDragOver(false)}
- onDrop={onDrop}
- style={{
- border:`2px dashed ${dragOver?'#4ecdc4':'rgba(255,255,255,0.1)'}`,
- borderRadius:10, padding:'14px 16px', marginBottom:12, textAlign:'center',
- background:dragOver?'rgba(78,205,196,0.08)':'transparent',
- transition:'all 0.15s', cursor:'pointer',
- }}
- onClick={()=>fileRef.current?.click()}>
-
- {uploading ? 'β³ Wird hochgeladenβ¦' : dragOver ? 'β Loslassen zum Hochladen' : 'π Dateien hierher ziehen oder klicken'}
+ {/* ββ Suche + Upload-Zone βββββββββββββββββββββββββββββββββββββββββββββ */}
+
+
+
+
+
+ setSearch(e.target.value)} placeholder="Suchenβ¦"
+ style={{...S.inp,paddingLeft:34,fontSize:15}}/>
+ {search&&}
+
+ {/* Drop-Zone */}
+
{e.preventDefault();setDragOver(true);}} onDragLeave={()=>setDragOver(false)}
+ onDrop={onDrop} onClick={()=>fileRef.current?.click()}
+ style={{
+ display:'flex',alignItems:'center',justifyContent:'center',gap:8,
+ padding:'0 18px',height:44,borderRadius:10,cursor:'pointer',
+ border:`2px dashed ${dragOver?'#4ecdc4':'rgba(255,255,255,0.15)'}`,
+ background:dragOver?'rgba(78,205,196,0.08)':'transparent',
+ transition:'all 0.15s',flexShrink:0,
+ minWidth:mobile?'100%':200,
+ }}>
+
+
+ {uploading?'Hochladenβ¦':dragOver?'Loslassen':mobile?'Datei hochladen':'Hier ablegen oder klicken'}
+
- {loading&&
LΓ€dtβ¦
}
+ {loading&&
LΓ€dtβ¦
}
- {/* Ordner */}
- {filtFolders.map(folder=>(
-
enterFolder(folder, folder.owner!==undefined)}>
-
π
-
-
{folder.name}
-
- {[
- folder.owner && tab!=='sharedByMe' ? `von ${folder.owner}` : null,
- folder.subCount>0 ? `${folder.subCount} Ordner` : null,
- folder.fileCount>0 ? `${folder.fileCount} Datei${folder.fileCount!==1?'en':''}` : null,
- folder.fileCount>0 && folder.totalSize>0 ? fmtSize(folder.totalSize) : null,
- (folder.subCount===0 && folder.fileCount===0) ? 'leer' : null,
- tab==='sharedByMe'&&folder.shared_with_names ? `geteilt mit: ${folder.shared_with_names}` : null,
- ].filter(Boolean).join(' Β· ')}
+ {/* ββ Ordner ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */}
+ {filtFolders.map(folder => {
+ const canManage = !folder.owner || tab==='sharedByMe';
+ return (
+
+
π
+ {/* Info β klickbar zum Navigieren */}
+
enterFolder(folder,!!folder.owner)}>
+
{folder.name}
+
+ {[
+ folder.owner&&tab!=='sharedByMe'?`von ${folder.owner}`:null,
+ folder.subCount>0?`${folder.subCount} Ordner`:null,
+ folder.fileCount>0?`${folder.fileCount} Datei${folder.fileCount!==1?'en':''}`:null,
+ folder.fileCount>0&&folder.totalSize>0?fmtSize(folder.totalSize):null,
+ folder.subCount===0&&folder.fileCount===0?'leer':null,
+ tab==='sharedByMe'&&folder.shared_with_names?`β ${folder.shared_with_names}`:null,
+ ].filter(Boolean).join(' Β· ')}
+
+
+ {/* Aktionen β feste Breite, symmetrisch */}
+
+ {canManage && (
+
setShareItem({item:folder,type:'folder'})} color="#ffe66d" title="Teilen" stop>π€
+ )}
+ {canManage&&tab==='own' && (
+
delFolder(folder)} color="#ff6b9d" title="LΓΆschen" stop>
+
+
+ )}
+
+
+
- {(!folder.owner || tab==='sharedByMe') && (
-
e.stopPropagation()}>
-
- {tab==='own'&&}
-
- )}
-
-
- ))}
+ );
+ })}
- {/* Dateien */}
- {filtFiles.map(file=>(
-
-
{extIcon(file.originalname)}
-
-
{file.originalname}
-
- {fmtSize(file.size)} Β· {fmtDate(file.created_at)}
- {tab==='shared'?` Β· von ${file.owner}`:''}
- {tab==='sharedByMe'&&file.shared_with_names?` Β· mit: ${file.shared_with_names}${file.shared_at?' seit '+fmtDate(file.shared_at):''}` : ''}
+ {/* ββ Dateien βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */}
+ {filtFiles.map(file => {
+ const canManage = isOwn || tab==='sharedByMe';
+ return (
+
+
{extIcon(file.originalname)}
+
+
{file.originalname}
+
+ {fmtSize(file.size)} Β· {fmtDate(file.created_at)}
+ {tab==='shared'?` Β· von ${file.owner}`:''}
+ {tab==='sharedByMe'&&file.shared_with_names?` Β· β ${file.shared_with_names}${file.shared_at?' seit '+fmtDate(file.shared_at):''}`:'' }
+
+
+ {/* Aktionen β gleiche Breite wie bei Ordnern */}
+
+
download(file)} color="#4ecdc4" title="Herunterladen">
+
+
+ {canManage && (
+
setShareItem({item:file,type:'file'})} color="#ffe66d" title="Teilen">π€
+ )}
+ {isOwn && (
+
delFile(file)} color="#ff6b9d" title="LΓΆschen">
+
+
+ )}
+ {/* Platzhalter damit Dateien-Zeile gleich breit wie Ordner-Zeile */}
+
-
-
- {(tab==='own'&&!inSharedFolder)||tab==='sharedByMe' ? <>
-
- {tab==='own'&&}
- > : null}
-
-
- ))}
+ );
+ })}
{!loading&&filtFolders.length===0&&filtFiles.length===0&&(
-
-
π
+
+
π
- {search?'Keine Treffer.':tab==='own'?'Noch leer. Dateien hochladen oder ziehen.':'Noch nichts geteilt.'}
+ {search?'Keine Treffer.':tab==='own'?'Noch leer β Datei hochladen oder Ordner anlegen.':'Noch nichts geteilt.'}
)}
@@ -383,11 +384,11 @@ export default function Dateien({ toast, mobile }) {
export function DateiSettings({ toast }) {
const [s, setS] = useState({file_max_size_mb:'50',file_max_count:'20',file_allowed_ext:'.pdf,.jpg,.jpeg,.png,.gif,.zip,.txt,.docx,.xlsx,.mp4,.stl,.3mf'});
const [busy, setBusy] = useState(false);
- useEffect(()=>{ api('/tools/dateien/settings').then(setS).catch(()=>{}); },[]);
+ useEffect(()=>{api('/tools/dateien/settings').then(setS).catch(()=>{});},[]);
const save = async()=>{
setBusy(true);
- try { await api('/tools/dateien/settings',{method:'PUT',body:s}); toast('Gespeichert β'); }
- catch(e) { toast(e.message,'error'); } finally { setBusy(false); }
+ try{await api('/tools/dateien/settings',{method:'PUT',body:s});toast('Gespeichert β');}
+ catch(e){toast(e.message,'error');}finally{setBusy(false);}
};
return (