ux(storage): dedupe Leválasztás + self-documenting drive action labels

Two Leválasztás buttons rendered per USB drive (registry safe-disconnect
+ the agent eject the D1 merge carried over like-for-like) and four
near-synonymous labels covered very different operations. The agent
eject now hides when the card offers the registry safe-disconnect (one
detach per card; non-USB + unregistered drives keep eject). Labels are
self-documenting with explanatory title tooltips: Új telepítések
letiltása/engedélyezése, Biztonságos leválasztás, Eltávolítás a
listából, Végleges leszerelés, Formázás…. Endpoints and semantics
unchanged.
This commit is contained in:
2026-07-02 20:36:48 +02:00
parent 611c5ffbdf
commit d256166fdd
2 changed files with 32 additions and 10 deletions
+16 -10
View File
@@ -126,25 +126,25 @@
{{$.CSRFField}}
<input type="hidden" name="storage_path" value="{{.Path}}">
<input type="hidden" name="schedulable" value="false">
<button type="submit" class="btn btn-xs btn-outline">Letiltás</button>
<button type="submit" class="btn btn-xs btn-outline" title="A meghajtó kimarad az új alkalmazás-telepítésekből. A rajta lévő alkalmazások változatlanul futnak.">Új telepítések letiltása</button>
</form>
{{else}}
<form method="POST" action="/settings/storage/schedulable" style="display:inline">
{{$.CSRFField}}
<input type="hidden" name="storage_path" value="{{.Path}}">
<input type="hidden" name="schedulable" value="true">
<button type="submit" class="btn btn-xs btn-outline">Engedélyezés</button>
<button type="submit" class="btn btn-xs btn-outline" title="A meghajtó újra választható az új alkalmazás-telepítéseknél.">Új telepítések engedélyezése</button>
</form>
{{end}}
{{if .IsUSB}}
<button class="btn btn-xs btn-danger-outline" onclick="storageDisconnect('{{.Path}}', '{{.Label}}', {{.AppCount}})">Leválasztás</button>
<button class="btn btn-xs btn-danger-outline" onclick="storageDisconnect('{{.Path}}', '{{.Label}}', {{.AppCount}})" title="Az itt tárolt alkalmazások leállnak, a meghajtó biztonságosan kihúzható. Az adatok megmaradnak; a meghajtó később újra csatlakoztatható.">Biztonságos leválasztás</button>
{{end}}
{{if and (not .IsDefault) (eq .AppCount 0)}}
<form method="POST" action="/settings/storage/remove" style="display:inline"
onsubmit="return storageRemoveDialog(event, this, 'Biztosan eltávolítja a(z) {{.Path}} adattárolót?')">
{{$.CSRFField}}
<input type="hidden" name="storage_path" value="{{.Path}}">
<button type="submit" class="btn btn-xs btn-danger-outline">Eltávolítás</button>
<button type="submit" class="btn btn-xs btn-danger-outline" title="Csak a nyilvántartásból törli a meghajtót — az adatok és a fájlrendszer érintetlenül maradnak.">Eltávolítás a listából</button>
</form>
{{end}}
{{if and (gt .AppCount 0) .HasOtherPaths}}
@@ -157,7 +157,7 @@
<button class="btn btn-xs btn-outline" onclick="storageMigrateAll('{{.Path}}','{{.Label}}')">Összes adat áthelyezése</button>
</span>
{{end}}
<button class="btn btn-xs btn-danger-outline" onclick="storageDecommission('{{.Path}}','{{.Label}}',{{.AppCount}})">Leszerelés</button>
<button class="btn btn-xs btn-danger-outline" onclick="storageDecommission('{{.Path}}','{{.Label}}',{{.AppCount}})" title="A meghajtó végleges kivonása a rendszerből. Ha céltárolót választ, előbb minden adat átkerül oda; áthelyezés nélkül az adatok a meghajtón maradnak.">Végleges leszerelés</button>
</div>
{{end}}
</div>
@@ -290,7 +290,7 @@ window.__registeredPaths=[{{range .StoragePaths}}{{if .Path}}"{{.Path}}",{{end}}
return '<div class="drive-cap meter '+usageColorClass(pct)+'"><div class="meter-track"><div class="meter-fill" style="width:'+pct.toFixed(1)+'%"></div></div>'
+'<div class="drive-cap-label">'+hum(d.used_bytes)+' / '+hum(d.total_bytes)+' ('+pct.toFixed(0)+'%)</div></div>';
}
function actions(d, registered){
function actions(d, registered, hasSafeDisconnect){
// Destructive controls ONLY for user-data drives that are mounted under /mnt. System/backup get none.
if(d.role!=='user-data' || !d.mount_path || d.mount_path.indexOf('/mnt/')!==0) return '';
var dev = esc(d.backing_device||''), mpRaw = esc(d.mount_path), reg = esc(regKey(d));
@@ -304,9 +304,13 @@ window.__registeredPaths=[{{range .StoragePaths}}{{if .Path}}"{{.Path}}",{{end}}
if(!registered[regKey(d)]){
btns += '<button class="btn btn-xs btn-primary" onclick="registerDrive(\''+mpRaw+'\')">Regisztrálás</button> ';
}
btns += '<button class="btn btn-xs btn-danger-outline" onclick="confirmEject(\''+reg+'\')">Leválasztás</button>';
if(d.backing_device){ btns += ' <button class="btn btn-xs btn-danger-outline" onclick="confirmWipe(\''+dev+'\',\''+reg+'\')">Törlés…</button>'; }
return '<div class="drive-actions">'+btns+'</div>';
// Dedupe: if the registry card already offers "Biztonságos leválasztás" (USB safe-disconnect),
// don't render the overlapping agent-level eject next to it — one detach affordance per card.
if(!hasSafeDisconnect){
btns += '<button class="btn btn-xs btn-danger-outline" onclick="confirmEject(\''+reg+'\')" title="A meghajtó lecsatolása és törlése a nyilvántartásból. Az adatok megmaradnak.">Leválasztás</button>';
}
if(d.backing_device){ btns += (btns?' ':'') + '<button class="btn btn-xs btn-danger-outline" onclick="confirmWipe(\''+dev+'\',\''+reg+'\')" title="A meghajtó formázása — a rajta lévő MINDEN adat véglegesen törlődik.">Formázás…</button>'; }
return btns ? '<div class="drive-actions">'+btns+'</div>' : '';
}
// Unified drive view (D1): the agent disk list ENRICHES the registry cards in place
// (role tag + durable-id + agent-only actions), and two extra groups render below:
@@ -328,12 +332,14 @@ window.__registeredPaths=[{{range .StoragePaths}}{{if .Path}}"{{.Path}}",{{end}}
function enrichCard(d, registered){
var slot=document.getElementById('agent-extra-'+regKey(d));
if(!slot) return false;
var card=slot.closest('.storage-path-item');
var hasSafeDisconnect=!!(card && card.querySelector('[onclick^="storageDisconnect"]'));
var extra='<div class="metarows">'
+'<span class="metarow">'+roleTag(d.role)+'</span>'
+(d.class?'<span class="metarow">'+classTag(d)+'</span>':'')
+(d.durable_id?'<span class="metarow mono" title="Tartós azonosító">'+esc(d.durable_id)+'</span>':'')
+'</div>'
+actions(d,registered);
+actions(d,registered,hasSafeDisconnect);
slot.innerHTML=extra;
return true;
}