D47 follow-up (found live on 9202): the kept-copies list („Megőrzött másolatok”) shows on a box without off-site too — it sat only inside the off-site card, so 9202 never listed a set-aside unit or a D25 copy; one named template, two call sites, parity fixtures unchanged. Red-proved. Commit only.
gates / gates (push) Successful in 1m26s

This commit is contained in:
2026-10-25 10:01:56 +01:00
parent bd9f4f7b74
commit 1f9c863f79
4 changed files with 77 additions and 40 deletions
@@ -167,45 +167,7 @@
<!-- v0.147.0 (4a): what the verification restores actually LEFT on disk. Until now the result of
an ellenőrző visszaállítás was invisible — the flash said "a verification folder on the
drive" without naming it, and nothing listed what had accumulated. Full path, size and date,
so the copy can be found, opened, and cleaned up. -->{{/* D25 (operator ruling 2026-10-21; R-1175, R-1181): second-drive copies whose source is gone (a drive away or removed, a folder missing). No night job removes them; only „Eltávolítás" here, after a confirm. On one line with the comment above so a page without kept copies renders byte-identically. */}}{{if .KeptCopies}}
<div class="backup-tier-divider" style="margin-top:1.5rem"></div>
<h3 style="margin-bottom:.5rem">{{T "backups_restore.megorzott_masolatok"}}</h3>
<p class="form-hint" style="margin-bottom:.75rem">{{T "backups_restore.megorzott_masolatok_hint"}}</p>
<div class="app-row-list">
{{range .KeptCopies}}
{{template "app_list_row" dict "Slug" "" "Name" .Source "Secondary" (printf "%s · %s · %s" .Line (numText .SizeHuman) (fmtTimeStr .Since))}}{{if .Restorable}}
<form method="POST" action="/backup/kept/restore" style="display:inline">
{{$.CSRFField}}
<input type="hidden" name="id" value="{{.ID}}">
<input type="hidden" name="confirm" value="1">
<button type="button" class="btn btn-xs btn-outline"
onclick="confirmRestoreKeptUnit(this)">{{T "backups_restore.visszaallitas"}}</button>
</form>{{end}}
<form method="POST" action="/backup/kept/remove" style="display:inline">
{{$.CSRFField}}
<input type="hidden" name="id" value="{{.ID}}">
<input type="hidden" name="confirm" value="1">
<button type="button" class="btn btn-xs btn-danger-outline"
onclick="confirmRemoveKeptCopy(this)">{{T "backups_restore.eltavolitas"}}</button>
</form>
{{template "app_list_row_end"}}
{{end}}
</div>
<script>
{{if .KeptUnitRestorable}}function confirmRestoreKeptUnit(btn){
felhomConfirm(btn, '{{T "backups_restore.megorzott_visszaallitas_megerosites"}}', function(){
var f = btn.closest('form');
if (f) { if (f.requestSubmit) f.requestSubmit(); else f.submit(); }
});
}
{{end}}function confirmRemoveKeptCopy(btn){
felhomConfirm(btn, '{{T "backups_restore.megorzott_eltavolitas_megerosites"}}', function(){
var f = btn.closest('form');
if (f) { if (f.requestSubmit) f.requestSubmit(); else f.submit(); }
});
}
</script>
{{end}}
so the copy can be found, opened, and cleaned up. -->{{/* D25 (operator ruling 2026-10-21; R-1175, R-1181): second-drive copies whose source is gone (a drive away or removed, a folder missing). No night job removes them; only „Eltávolítás" here, after a confirm. On one line with the comment above so a page without kept copies renders byte-identically. */}}{{template "kept_copies_section" .}}
<div class="backup-tier-divider" style="margin-top:1.5rem"></div>
<h3 style="margin-bottom:.5rem">{{T "backups_restore.meglevo_ellenorzo_masolatok"}}</h3>
{{if .OffsiteRestoreCopies}}
@@ -228,7 +190,7 @@
<p class="form-hint">{{T "backups_restore.nincs_ellenorzo_masolat_a_meghajton"}}</p>
{{end}}
</div>
{{end}}
{{end}}{{if not .OffboxConfigured}}{{template "kept_copies_section" .}}{{end}}
<!-- Hordozható mentéscsomag (.fab) — v0.124.0, decision 3: PORTABILITY, not a backup tier (no
@@ -464,3 +426,45 @@ function submitRestore() {
{{template "layout_end" .}}
{{end}}
{{/* D25 + D47: the kept copies (second-drive copies whose source is gone; set-aside units of an earlier install). Shown
inside the off-site card when the box has off-site, and after it when it has none — before 2026-10-25 it sat only inside
the off-site block, so a box without off-site never listed its kept copies. One body, two call sites. */}}
{{define "kept_copies_section"}}{{if .KeptCopies}}
<div class="backup-tier-divider" style="margin-top:1.5rem"></div>
<h3 style="margin-bottom:.5rem">{{T "backups_restore.megorzott_masolatok"}}</h3>
<p class="form-hint" style="margin-bottom:.75rem">{{T "backups_restore.megorzott_masolatok_hint"}}</p>
<div class="app-row-list">
{{range .KeptCopies}}
{{template "app_list_row" dict "Slug" "" "Name" .Source "Secondary" (printf "%s · %s · %s" .Line (numText .SizeHuman) (fmtTimeStr .Since))}}{{if .Restorable}}
<form method="POST" action="/backup/kept/restore" style="display:inline">
{{$.CSRFField}}
<input type="hidden" name="id" value="{{.ID}}">
<input type="hidden" name="confirm" value="1">
<button type="button" class="btn btn-xs btn-outline"
onclick="confirmRestoreKeptUnit(this)">{{T "backups_restore.visszaallitas"}}</button>
</form>{{end}}
<form method="POST" action="/backup/kept/remove" style="display:inline">
{{$.CSRFField}}
<input type="hidden" name="id" value="{{.ID}}">
<input type="hidden" name="confirm" value="1">
<button type="button" class="btn btn-xs btn-danger-outline"
onclick="confirmRemoveKeptCopy(this)">{{T "backups_restore.eltavolitas"}}</button>
</form>
{{template "app_list_row_end"}}
{{end}}
</div>
<script>
{{if .KeptUnitRestorable}}function confirmRestoreKeptUnit(btn){
felhomConfirm(btn, '{{T "backups_restore.megorzott_visszaallitas_megerosites"}}', function(){
var f = btn.closest('form');
if (f) { if (f.requestSubmit) f.requestSubmit(); else f.submit(); }
});
}
{{end}}function confirmRemoveKeptCopy(btn){
felhomConfirm(btn, '{{T "backups_restore.megorzott_eltavolitas_megerosites"}}', function(){
var f = btn.closest('form');
if (f) { if (f.requestSubmit) f.requestSubmit(); else f.submit(); }
});
}
</script>
{{end}}{{end}}