@@ -1981,20 +1981,20 @@ function renderSlot(r, port, label){
sl.classList.toggle('src-on', isSrc && !!port);
sl.classList.toggle('dst-on', !isSrc && !!port);
if(port){
- pp.textContent='Port '+port+(label?' · '+label:'');
- if(dev){ dot.className='dot on'; pi.textContent=(dev.label||dev.device)+(dev.size?' · '+dev.size:'')+(dev.mount?' · '+dev.mount:''); }
+ pp.textContent='Port '+port+(label?' | '+label:'');
+ if(dev){ dot.className='dot on'; pi.textContent=(dev.label||dev.device)+(dev.size?' | '+dev.size:'')+(dev.mount?' | '+dev.mount:''); }
else { dot.className='dot off'; pi.textContent='Gerät nicht verbunden'; }
} else {
- dot.className='dot off'; pp.textContent='—'; pi.textContent='Kein Port konfiguriert';
+ dot.className='dot off'; pp.textContent='-'; pi.textContent='Kein Port konfiguriert';
}
if(lb && !lb.dataset.dirty) lb.value=label||'';
}
function populateSel(){
- const opts=devs.map(d=>`
`).join('');
['src-select','dst-select'].forEach(id=>{
const el=$(id),prev=el.value;
- el.innerHTML='
'+opts;
if(prev && devs.find(d=>d.usb_port===prev)) el.value=prev;
});
}
@@ -2008,7 +2008,7 @@ function renderUnassigned(){
`).join('');
}
@@ -2066,7 +2066,7 @@ function setFilter(v){ $('c-filter').value=v; }
// ── WiFi ──────────────────────────────────────────────────────────────────────
async function scanNets(){
- $('net-list').style.display='flex'; $('net-list').innerHTML='
Suche...
';
const nets=await api('/wifi/scan');
if(!nets.length){$('net-list').innerHTML='
';return;}
$('net-list').innerHTML=nets.map(n=>{
@@ -2078,7 +2078,7 @@ function pickNet(s){$('w-ssid').value=s;$('net-list').style.display='none';$('w-
async function connectWifi(){
const ssid=$('w-ssid').value.trim(),pw=$('w-pw').value;
if(!ssid){flash('wifi-flash','err','Bitte SSID eingeben');return;}
- flash('wifi-flash','ok','Verbinde… (bis 30s)');
+ flash('wifi-flash','ok','Verbinde... (bis 30s)');
const r=await api('/wifi/connect','POST',{ssid,password:pw});
if(r.error) flash('wifi-flash','err',r.error);
else flash('wifi-flash','ok','Gestartet. Neue IP erscheint oben.');
@@ -2107,7 +2107,7 @@ function renderUTs(){
@@ -2147,7 +2147,7 @@ async function utSave(){
body.token=$('ut-token').value.trim();
if(!body.token){flash('ut-form-flash','err','Token fehlt');return;}
}
- flash('ut-form-flash','ok','Speichere…');
+ flash('ut-form-flash','ok','Speichere...');
const r=await api('/upload/targets','POST',body);
if(r.error){flash('ut-form-flash','err',r.error);return;}
const t=await api('/upload/targets/'+r.id+'/test','POST');
@@ -2180,8 +2180,8 @@ const expl={
const body=$('expl-body'), bread=$('expl-bread');
if(!port){body.innerHTML='
Kein Port konfiguriert
';bread.innerHTML='';return;}
const dev=devs.find(d=>d.usb_port===port);
- if(!dev){body.innerHTML='
Gerät nicht verbunden
';bread.innerHTML='
Port '+port+' — nicht verbunden';return;}
- body.innerHTML='
Lade…
';
+ if(!dev){body.innerHTML='
Gerät nicht verbunden
';bread.innerHTML='
Port '+port+' - nicht verbunden';return;}
+ body.innerHTML='
Lade...
';
try{
const data=await api('/browse?port='+encodeURIComponent(port)+'&path='+encodeURIComponent(path));
if(data.error){body.innerHTML='
⚠ '+data.error+'
';return;}
@@ -2266,9 +2266,9 @@ async function poll(){
if(v.pkg_running){
ni.style.display='none'; pp.style.display='block'; ui.style.display='none';
const act=v.pkg_action==='remove'?'Deinstalliere':'Installiere';
- $('wg-pkg-title').textContent=act+' WireGuard…';
+ $('wg-pkg-title').textContent=act+' WireGuard...';
$('wg-pkg-icon').textContent='⏳';
- $('wg-status-sub').textContent=act+'…';
+ $('wg-status-sub').textContent=act+'...';
vp.style.display='none';
} else if(!v.installed){
ni.style.display='block'; pp.style.display='none'; ui.style.display='none';
@@ -2283,7 +2283,7 @@ async function poll(){
vp.style.display='flex'; vdot.className='wdot c';
vl.textContent='VPN aktiv'; vi.textContent=v.ip||'';
wgd.className='wdot c'; wgl.textContent='Verbunden';
- wgdet.textContent=v.ip?(v.ip+(v.peer?' · peer …'+v.peer.slice(-8):'')):'';
+ wgdet.textContent=v.ip?(v.ip+(v.peer?' | peer ...'+v.peer.slice(-8):'')):'';
bc.style.display='none'; bd.style.display=''; bd.disabled=false;
$('wg-status-sub').textContent=v.ip||'';
} else {
@@ -2309,19 +2309,19 @@ async function poll(){
if(c.running){
const ph=c.phase||'copy';
if(ph==='verify'){
- tx.className='st-headline st-run'; tx.textContent='Verifiziere… '+c.progress+'%';
+ tx.className='st-headline st-run'; tx.textContent='Verifiziere... '+c.progress+'%';
pw.style.display='block'; pf.className='prog-fill'; pf.style.width=c.progress+'%';
pp.style.display=''; pp.textContent=c.progress+'%';
pfiles.style.display=''; pfiles.textContent=c.done+' / '+c.total+' geprüft';
pbytes.style.display='none'; eta.style.display='none'; spd.style.display='none';
cf.textContent=c.current||'';
} else if(ph==='delete'){
- tx.className='st-headline st-run'; tx.textContent='Quelle wird geleert…';
+ tx.className='st-headline st-run'; tx.textContent='Quelle wird geleert...';
pw.style.display='none'; pp.style.display='none'; pfiles.style.display='none';
pbytes.style.display='none'; eta.style.display='none'; spd.style.display='none';
cf.textContent='';
} else {
- tx.className='st-headline st-run'; tx.textContent='Kopiert… '+c.progress+'%';
+ tx.className='st-headline st-run'; tx.textContent='Kopiert... '+c.progress+'%';
pw.style.display='block'; pf.className='prog-fill'; pf.style.width=c.progress+'%';
pp.style.display=''; pp.textContent=c.progress+'%';
pfiles.style.display=''; pfiles.textContent=c.done+' / '+c.total+' Dateien';
@@ -2341,7 +2341,7 @@ async function poll(){
}else if(c.last_copy && !_dismissed){
tx.className='st-headline st-ok'; tx.textContent='✓ Abgeschlossen';
pf.className='prog-fill done'; pw.style.display='block'; pf.style.width='100%';
- sum.textContent=c.total+' Dateien · '+fmtBytes(c.bytes_total);
+ sum.textContent=c.total+' Dateien | '+fmtBytes(c.bytes_total);
time.textContent=new Date(c.last_copy).toLocaleString('de-DE');
$('st-dismiss').style.display='';
// Auto-dismiss nach 5 Minuten
@@ -2366,8 +2366,8 @@ async function poll(){
const ub=$('upload-block');
if(u.running||u.results.length){
ub.style.display='block';
- $('upload-current').innerHTML=u.running?'⚡ '+u.current+'…':'';
- $('upload-results').innerHTML=u.results.map(r=>`
${r.ok?'✓':'✗'} ${r.name}${r.msg?' — '+r.msg:''}
`).join('');
+ $('upload-current').innerHTML=u.running?'⚡ '+u.current+'...':'';
+ $('upload-results').innerHTML=u.results.map(r=>`
${r.ok?'✓':'✗'} ${r.name}${r.msg?' - '+r.msg:''}
`).join('');
}else ub.style.display='none';
}catch(e){}
}
@@ -2405,7 +2405,7 @@ async function installUpdate() {
'Das Web-Interface ist für ca. 10 Sekunden nicht erreichbar.'
)) return;
- $('upd-badge').innerHTML = '↻ Installiere…';
+ $('upd-badge').innerHTML = '↻ Installiere...';
$('upd-badge').style.pointerEvents = 'none';
try {
@@ -2425,7 +2425,7 @@ async function installUpdate() {
async function checkUpdate() {
const btn = event.currentTarget;
- btn.disabled = true; btn.textContent = '↻ Prüfe…';
+ btn.disabled = true; btn.textContent = '↻ Prüfe...';
try {
await api('/update/check', 'POST');
// Warten bis der Server-Check abgeschlossen ist (max 15 s, alle 500 ms)
@@ -2438,7 +2438,7 @@ async function checkUpdate() {
await pollUpdate(); // Badge sofort aktualisieren
const fl = $('sys-update-flash');
if (u.available && u.latest) {
- fl.className = 'flash warn'; fl.textContent = 'Update v' + u.latest + ' verfügbar – über das Badge oben installieren.';
+ fl.className = 'flash warn'; fl.textContent = 'Update v' + u.latest + ' verfügbar - über das Badge oben installieren.';
} else if (u.error) {
fl.className = 'flash err'; fl.textContent = 'Fehler: ' + u.error;
} else {
@@ -2457,7 +2457,7 @@ async function checkUpdate() {
async function rebootDevice() {
if (!confirm('Gerät jetzt neu starten?\n\nDas Web-Interface ist für ca. 30 Sekunden nicht erreichbar.')) return;
try { await api('/system/reboot', 'POST'); } catch(e) {}
- document.body.innerHTML = '
↻ Gerät startet neu – bitte warten…
';
+ document.body.innerHTML = '
↻ Gerät startet neu - bitte warten...
';
setTimeout(async function waitForRestart() {
try { await fetch('/api/update/status'); location.reload(); }
catch(e) { setTimeout(waitForRestart, 2000); }
@@ -2466,34 +2466,34 @@ async function rebootDevice() {
// ── WireGuard VPN ─────────────────────────────────────────────────────────────
async function wgInstall(){
- if(!confirm('wireguard + wireguard-tools jetzt per apt-get installieren?\n\nDauer: ca. 30–90 Sekunden.'))return;
- flash('wg-flash','ok','Starte Installation…');
+ if(!confirm('wireguard + wireguard-tools jetzt per apt-get installieren?\n\nDauer: ca. 30-90 Sekunden.'))return;
+ flash('wg-flash','ok','Starte Installation...');
const r=await api('/wireguard/install','POST');
if(r.error) flash('wg-flash','err',r.error);
}
async function wgUninstall(){
if(!confirm('WireGuard wirklich deinstallieren?\n\nDer aktive VPN-Tunnel wird vorher getrennt.\nDie Konfigurationsdatei bleibt erhalten.'))return;
- flash('wg-flash','ok','Deinstalliere…');
+ flash('wg-flash','ok','Deinstalliere...');
const r=await api('/wireguard/uninstall','POST');
if(r.error) flash('wg-flash','err',r.error);
}
async function wgConnect(){
$('wg-btn-connect').disabled=true;
- flash('wg-flash','ok','Verbinde VPN…');
+ flash('wg-flash','ok','Verbinde VPN...');
await api('/wireguard/connect','POST');
}
async function wgDisconnect(){
$('wg-btn-disconnect').disabled=true;
- flash('wg-flash','ok','Trenne VPN…');
+ flash('wg-flash','ok','Trenne VPN...');
const r=await api('/wireguard/disconnect','POST');
if(!r.ok) flash('wg-flash','err','Trennen fehlgeschlagen');
}
async function wgSaveConfig(){
const content=$('wg-config').value.trim();
if(!content){flash('wg-flash','err','Konfiguration ist leer');return;}
- if(!content.includes('[Interface]')){flash('wg-flash','err','Ungültige Konfiguration – [Interface] fehlt');return;}
+ if(!content.includes('[Interface]')){flash('wg-flash','err','Ungültige Konfiguration - [Interface] fehlt');return;}
const auto=$('wg-auto').checked;
- flash('wg-flash','ok','Speichere…');
+ flash('wg-flash','ok','Speichere...');
const r=await api('/wireguard/config','POST',{content,auto});
if(r.error){flash('wg-flash','err',r.error);return;}
flash('wg-flash','ok','✓ Konfiguration gespeichert');
diff --git a/version.txt b/version.txt
index c678b02..e7ad390 100644
--- a/version.txt
+++ b/version.txt
@@ -1 +1 @@
-1.0.18
\ No newline at end of file
+1.0.19
\ No newline at end of file