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
gates / gates (push) Successful in 1m26s
This commit is contained in:
@@ -163,3 +163,22 @@ func TestD47_KeptUnitRestoreHandlerRefusals(t *testing.T) {
|
||||
t.Fatal("a refusal must start nothing")
|
||||
}
|
||||
}
|
||||
|
||||
// D25 + D47 (2026-10-25, found live on 9202): a box WITHOUT off-site lists its kept copies too. Before, the section sat
|
||||
// only inside the off-site card, so 9202 (no off-site) never showed a set-aside unit or a kept second-drive copy.
|
||||
func TestD47_KeptCopiesAreListedWithoutOffsite(t *testing.T) {
|
||||
d := i18nLayoutData("backups-restore", "Visszaállítás a mentésből")
|
||||
d["Backup"] = i18nBackupStatus(false, false)
|
||||
d["OffboxConfigured"] = false
|
||||
d["KeptCopies"] = []keptCopyRow{{ID: "aaaaaaaaaaaaaaaa", Source: "tandoor", Line: "belso", SizeHuman: "150 MB", Since: "2026-10-25T08:00:00Z", Restorable: true}}
|
||||
d["KeptUnitRestorable"] = true
|
||||
html := renderBackupPage(t, "backups_restore", d)
|
||||
if strings.Count(html, "Megőrzött másolatok") != 1 || strings.Count(html, `action="/backup/kept/restore"`) != 1 {
|
||||
t.Fatal("a box without off-site must list its kept copies once, with the restore")
|
||||
}
|
||||
d["OffboxConfigured"] = true
|
||||
d["OffsiteStoreState"] = "known"
|
||||
if html := renderBackupPage(t, "backups_restore", d); strings.Count(html, "Megőrzött másolatok") != 1 {
|
||||
t.Fatal("with off-site the section is shown once (inside the off-site card), never twice")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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}}
|
||||
|
||||
Reference in New Issue
Block a user