diff --git a/app.py b/app.py
index 0f3fecf..2b1c48a 100644
--- a/app.py
+++ b/app.py
@@ -1534,43 +1534,47 @@ def r_storage_info():
devs = usb_devices()
result = []
+ src_ports = {sp['port'] for sp in _resolve_source_ports(cfg)}
+ dst_port = cfg.get('dest_port')
+
def _du_for_dev(dev):
mp, owned = ensure_mount(dev)
if not mp:
- return dict(mounted=False, total=None, used=None, free=None, pct=None)
+ return dict(total=None, used=None, free=None, pct=None)
try:
du = shutil.disk_usage(mp)
- return dict(mounted=True, total=du.total, used=du.used, free=du.free,
+ return dict(total=du.total, used=du.used, free=du.free,
pct=round(du.used / du.total * 100) if du.total else 0)
except Exception:
- return dict(mounted=False, total=None, used=None, free=None, pct=None)
+ return dict(total=None, used=None, free=None, pct=None)
finally:
if owned:
subprocess.run(['umount', mp], capture_output=True)
- for sp in _resolve_source_ports(cfg):
- dev = next((d for d in devs if d['usb_port'] == sp['port']), None)
- entry = dict(type='source', label=sp.get('label') or f"Port {sp['port']}",
- port=sp['port'], mounted=False,
- total=None, used=None, free=None, pct=None)
- if dev:
- entry.update(_du_for_dev(dev))
+ for dev in devs:
+ port = dev['usb_port']
+ if port in src_ports:
+ role = 'source'
+ elif port == dst_port:
+ role = 'dest'
+ else:
+ role = 'other'
+ entry = dict(
+ role=role,
+ label=dev.get('label') or dev.get('device') or f'Port {port}',
+ port=port,
+ device=dev.get('device', ''),
+ size_str=dev.get('size', ''),
+ )
+ entry.update(_du_for_dev(dev))
result.append(entry)
if cfg.get('dest_type') == 'internal':
- entry = dict(type='dest',
+ entry = dict(role='dest',
label=cfg.get('internal_dest_label') or 'Interner Speicher',
- port='__internal__')
+ port='__internal__', device='internal', size_str='')
entry.update(_du_for_dev({'internal': True}))
result.append(entry)
- elif cfg.get('dest_port'):
- dev = next((d for d in devs if d['usb_port'] == cfg['dest_port']), None)
- entry = dict(type='dest', label=cfg.get('dest_label') or f"Port {cfg['dest_port']}",
- port=cfg['dest_port'], mounted=False,
- total=None, used=None, free=None, pct=None)
- if dev:
- entry.update(_du_for_dev(dev))
- result.append(entry)
return jsonify(result)
@@ -2503,8 +2507,7 @@ body{background:var(--bg);color:var(--txt);font-family:-apple-system,BlinkMacSys
⇄
USB Ports & Datei-Explorer
-
-
+
@@ -2618,17 +2621,6 @@ body{background:var(--bg);color:var(--txt);font-family:-apple-system,BlinkMacSys
-
-
-
- 💾 Speicherübersicht
-
-
-
-
-
Weitere verbundene Geräte
@@ -2901,6 +2893,7 @@ body{background:var(--bg);color:var(--txt);font-family:-apple-system,BlinkMacSys
+
@@ -3874,60 +3867,47 @@ async function pollSysinfo(){
db.className='si-fill '+(s.disk_pct>=90?'hot':s.disk_pct>=75?'warn':'ok');
}
}catch(e){}
+ loadStorageInfo();
}
-// -- Speicher-Panel -----------------------------------------------------------
-function fmtBytes(b){
- if(b==null) return '–';
- if(b<1024**3) return (b/1024**2).toFixed(1)+' MB';
- return (b/1024**3).toFixed(2)+' GB';
-}
-let storagePanelOpen=false;
-function toggleStoragePanel(){
- storagePanelOpen=!storagePanelOpen;
- const p=$('storage-panel');
- p.style.display=storagePanelOpen?'block':'none';
- if(storagePanelOpen) loadStorageInfo();
-}
+// -- Speicher (System-Karte) --------------------------------------------------
async function loadStorageInfo(){
const list=$('storage-list');
- list.innerHTML='Wird geladen…
';
+ if(!list) return;
try{
const items=await api('/storage-info');
- if(!items||!items.length){
- list.innerHTML='Keine Geräte konfiguriert.
';
- return;
- }
+ if(!items||!items.length){ list.innerHTML=''; return; }
list.innerHTML=items.map(it=>{
- const icon=it.type==='source'?'▲':'▼';
- const typeLabel=it.type==='source'?'Quelle':'Ziel';
- const color=it.type==='source'?'var(--grn)':'var(--acc)';
- if(!it.mounted||it.total==null){
- return `
-
${icon}
+ const roleColor=it.role==='source'?'var(--grn)':it.role==='dest'?'var(--acc)':'var(--sub)';
+ const roleIcon=it.role==='source'?'▲':it.role==='dest'?'▼':'■';
+ const roleLabel=it.role==='source'?'Quelle':it.role==='dest'?'Ziel':'Gerät';
+ const portStr=it.port==='__internal__'?'intern':'Port '+it.port;
+ if(it.total==null){
+ const fallback=it.size_str?it.size_str:'–';
+ return `
+
${roleIcon}
-
${it.label}
-
${typeLabel} · Port ${it.port==='__internal__'?'intern':it.port} · nicht verbunden
+
${it.label}
+
${roleLabel} · ${portStr} · ${fallback}
`;
}
const pct=it.pct||0;
const barCls=pct>=90?'hot':pct>=75?'warn':'ok';
- return `
-
-
${icon}
+ const barColor=barCls==='hot'?'var(--red)':barCls==='warn'?'var(--ylw)':'var(--grn)';
+ return `
+
+
${roleIcon}
-
${it.label}
-
${typeLabel} · ${fmtBytes(it.used)} belegt · ${fmtBytes(it.free)} frei · ${fmtBytes(it.total)} gesamt
+
${it.label}
+
${roleLabel} · ${portStr} · ${fmtBytes(it.used)} / ${fmtBytes(it.total)} · ${fmtBytes(it.free)} frei
-
${pct}%
+
${pct}%
`;
}).join('');
- }catch(e){
- list.innerHTML='
Fehler beim Laden.
';
- }
+ }catch(e){}
}
// -- Kopier-Verlauf -----------------------------------------------------------
diff --git a/version.txt b/version.txt
index 3116087..9d8637c 100644
--- a/version.txt
+++ b/version.txt
@@ -1 +1 @@
-1.0.69
+1.0.70