feat: Benutzeroberfläche aktualisiert und Versionsnummer auf 1.0.22 erhöht
This commit is contained in:
18
app.py
18
app.py
@@ -892,7 +892,7 @@ def run_uploads(local_dir: Path, cfg: dict):
|
|||||||
with upload_lock:
|
with upload_lock:
|
||||||
upload_state['current'] = name
|
upload_state['current'] = name
|
||||||
|
|
||||||
add_log(f'Upload -> {name}...')
|
add_log(f'Upload >> {name}...')
|
||||||
dest_root = t.get('dest_path', 'PiCopy').strip('/')
|
dest_root = t.get('dest_path', 'PiCopy').strip('/')
|
||||||
dest = f'{_remote_name(t["id"])}:{dest_root}'
|
dest = f'{_remote_name(t["id"])}:{dest_root}'
|
||||||
|
|
||||||
@@ -1624,7 +1624,7 @@ body{background:var(--bg);color:var(--txt);font-family:-apple-system,BlinkMacSys
|
|||||||
<div class="btn-row">
|
<div class="btn-row">
|
||||||
<button id="btn-start" class="btn pri" onclick="startCopy()">▶ Kopieren starten</button>
|
<button id="btn-start" class="btn pri" onclick="startCopy()">▶ Kopieren starten</button>
|
||||||
<button id="btn-cancel" class="btn danger" onclick="cancelCopy()" style="display:none">■ Abbrechen</button>
|
<button id="btn-cancel" class="btn danger" onclick="cancelCopy()" style="display:none">■ Abbrechen</button>
|
||||||
<button class="btn ghost" onclick="refreshDevices()">-> Geräte neu laden</button>
|
<button class="btn ghost" onclick="refreshDevices()">↻ Geräte neu laden</button>
|
||||||
</div>
|
</div>
|
||||||
<div id="copy-hint" class="flash" style="display:none"></div>
|
<div id="copy-hint" class="flash" style="display:none"></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1633,7 +1633,7 @@ body{background:var(--bg);color:var(--txt);font-family:-apple-system,BlinkMacSys
|
|||||||
<!-- -- USB Ports + Explorer -- -->
|
<!-- -- USB Ports + Explorer -- -->
|
||||||
<div class="card col2">
|
<div class="card col2">
|
||||||
<div class="card-head">
|
<div class="card-head">
|
||||||
<div class="card-icon green"><-></div>
|
<div class="card-icon green">⇄</div>
|
||||||
<span class="card-title">USB Ports & Datei-Explorer</span>
|
<span class="card-title">USB Ports & Datei-Explorer</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
@@ -1664,7 +1664,7 @@ body{background:var(--bg);color:var(--txt);font-family:-apple-system,BlinkMacSys
|
|||||||
</div>
|
</div>
|
||||||
<button class="btn grn" style="width:100%" onclick="assignPort('source')">✓ Als feste Quelle speichern</button>
|
<button class="btn grn" style="width:100%" onclick="assignPort('source')">✓ Als feste Quelle speichern</button>
|
||||||
<div id="src-flash" class="flash" style="margin-top:.4rem"></div>
|
<div id="src-flash" class="flash" style="margin-top:.4rem"></div>
|
||||||
<div class="hint-box">Gerät in den gewünschten Port -> aus Liste wählen -> Speichern. PiCopy merkt sich den physischen Port dauerhaft.</div>
|
<div class="hint-box">Gerät in den gewünschten Port → aus Liste wählen → Speichern. PiCopy merkt sich den physischen Port dauerhaft.</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Ziel -->
|
<!-- Ziel -->
|
||||||
@@ -1689,7 +1689,7 @@ body{background:var(--bg);color:var(--txt);font-family:-apple-system,BlinkMacSys
|
|||||||
</div>
|
</div>
|
||||||
<button class="btn pri" style="width:100%" onclick="assignPort('dest')">✓ Als festes Ziel speichern</button>
|
<button class="btn pri" style="width:100%" onclick="assignPort('dest')">✓ Als festes Ziel speichern</button>
|
||||||
<div id="dst-flash" class="flash" style="margin-top:.4rem"></div>
|
<div id="dst-flash" class="flash" style="margin-top:.4rem"></div>
|
||||||
<div class="hint-box">Gerät in den gewünschten Port -> aus Liste wählen -> Speichern. Ab dann wird dieser Port immer als Ziel verwendet.</div>
|
<div class="hint-box">Gerät in den gewünschten Port → aus Liste wählen → Speichern. Ab dann wird dieser Port immer als Ziel verwendet.</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div><!-- /port-pair -->
|
</div><!-- /port-pair -->
|
||||||
@@ -1929,7 +1929,7 @@ body{background:var(--bg);color:var(--txt);font-family:-apple-system,BlinkMacSys
|
|||||||
<div class="card-body" style="display:flex;flex-direction:column;gap:.6rem">
|
<div class="card-body" style="display:flex;flex-direction:column;gap:.6rem">
|
||||||
<button class="btn" style="width:100%" onclick="checkUpdate()">🔍 Nach Update suchen</button>
|
<button class="btn" style="width:100%" onclick="checkUpdate()">🔍 Nach Update suchen</button>
|
||||||
<div id="sys-update-flash" class="flash" style="display:none"></div>
|
<div id="sys-update-flash" class="flash" style="display:none"></div>
|
||||||
<button class="btn" style="width:100%;background:rgba(220,60,60,.12);color:#e05555;border-color:rgba(220,60,60,.25)" onclick="rebootDevice()"><- Gerät neu starten</button>
|
<button class="btn" style="width:100%;background:rgba(220,60,60,.12);color:#e05555;border-color:rgba(220,60,60,.25)" onclick="rebootDevice()">↺ Gerät neu starten</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -2408,7 +2408,7 @@ async function installUpdate() {
|
|||||||
'Das Web-Interface ist für ca. 10 Sekunden nicht erreichbar.'
|
'Das Web-Interface ist für ca. 10 Sekunden nicht erreichbar.'
|
||||||
)) return;
|
)) return;
|
||||||
|
|
||||||
$('upd-badge').innerHTML = '-> Installiere...';
|
$('upd-badge').innerHTML = '↓ Installiere...';
|
||||||
$('upd-badge').style.pointerEvents = 'none';
|
$('upd-badge').style.pointerEvents = 'none';
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -2428,7 +2428,7 @@ async function installUpdate() {
|
|||||||
|
|
||||||
async function checkUpdate() {
|
async function checkUpdate() {
|
||||||
const btn = event.currentTarget;
|
const btn = event.currentTarget;
|
||||||
btn.disabled = true; btn.textContent = '-> Prüfe...';
|
btn.disabled = true; btn.innerHTML = '🔍 Prüfe...';
|
||||||
try {
|
try {
|
||||||
await api('/update/check', 'POST');
|
await api('/update/check', 'POST');
|
||||||
// Warten bis der Server-Check abgeschlossen ist (max 15 s, alle 500 ms)
|
// Warten bis der Server-Check abgeschlossen ist (max 15 s, alle 500 ms)
|
||||||
@@ -2460,7 +2460,7 @@ async function checkUpdate() {
|
|||||||
async function rebootDevice() {
|
async function rebootDevice() {
|
||||||
if (!confirm('Gerät jetzt neu starten?\n\nDas Web-Interface ist für ca. 30 Sekunden nicht erreichbar.')) return;
|
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) {}
|
try { await api('/system/reboot', 'POST'); } catch(e) {}
|
||||||
document.body.innerHTML = '<div style="display:flex;align-items:center;justify-content:center;height:100vh;font-family:sans-serif;color:#888;font-size:1rem">-> Gerät startet neu - bitte warten...</div>';
|
document.body.innerHTML = '<div style="display:flex;align-items:center;justify-content:center;height:100vh;font-family:sans-serif;color:#888;font-size:1rem">↺ Gerät startet neu - bitte warten...</div>';
|
||||||
setTimeout(async function waitForRestart() {
|
setTimeout(async function waitForRestart() {
|
||||||
try { await fetch('/api/update/status'); location.reload(); }
|
try { await fetch('/api/update/status'); location.reload(); }
|
||||||
catch(e) { setTimeout(waitForRestart, 2000); }
|
catch(e) { setTimeout(waitForRestart, 2000); }
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
1.0.21
|
1.0.22
|
||||||
Reference in New Issue
Block a user