follow the node filter in the empty backup list test

This commit is contained in:
MacRimi
2026-10-14 18:12:24 +02:00
parent 51ce1184da
commit ceb783bcf2
7 changed files with 28 additions and 25 deletions
+2 -2
View File
@@ -3976,8 +3976,8 @@
"scopeAriaLabel": "Backups zum Anzeigen", "scopeAriaLabel": "Backups zum Anzeigen",
"scopeShowAll": "Alle anzeigen", "scopeShowAll": "Alle anzeigen",
"scopeThisNode": "Dieser Knoten", "scopeThisNode": "Dieser Knoten",
"formerJob": "Ehemaliger Job", "formerJob": "Ehemaliger Auftrag",
"formerJobTitle": "Der Job, der diese Sicherung erstellt hat, ist auf diesem Knoten nicht mehr vorhanden.Das Backup bleibt bis zur Löschung erhalten." "formerJobTitle": "Der Auftrag, der diese Sicherung erstellt hat, ist auf diesem Knoten nicht mehr vorhanden. Die Sicherung bleibt bis zur Löschung erhalten."
}, },
"backends": { "backends": {
"borgDescription": "Borg-Repository für deduplizierte Host-Backups.", "borgDescription": "Borg-Repository für deduplizierte Host-Backups.",
+2 -2
View File
@@ -3976,8 +3976,8 @@
"scopeAriaLabel": "Sauvegardes à afficher", "scopeAriaLabel": "Sauvegardes à afficher",
"scopeShowAll": "Afficher tout", "scopeShowAll": "Afficher tout",
"scopeThisNode": "Ce nœud", "scopeThisNode": "Ce nœud",
"formerJob": "Ancien emploi", "formerJob": "Ancien travail",
"formerJobTitle": "Le travail qui a effectué cette sauvegarde n'existe plus sur ce nœud.La sauvegarde est conservée jusqu'à sa suppression." "formerJobTitle": "Le travail qui a effectué cette sauvegarde n'existe plus sur ce nœud. La sauvegarde est conservée jusqu'à sa suppression."
}, },
"backends": { "backends": {
"borgDescription": "Référentiel Borg pour les sauvegardes d'hôtes dédupliquées.", "borgDescription": "Référentiel Borg pour les sauvegardes d'hôtes dédupliquées.",
+7 -7
View File
@@ -3971,13 +3971,13 @@
"title": "Backup", "title": "Backup",
"viewContentsTitle": "Visualizza contenuto backup", "viewContentsTitle": "Visualizza contenuto backup",
"emptyMessage": "Nessun archivio di backup trovato.", "emptyMessage": "Nessun archivio di backup trovato.",
"hiddenOtherNodes": "backup di altri nodi non mostrati: {count}.", "hiddenOtherNodes": "Backup di altri nodi non mostrati: {count}.",
"scopeAllNodes": "tutti i nodi", "scopeAllNodes": "Tutti i nodi",
"scopeAriaLabel": "backup da mostrare", "scopeAriaLabel": "Backup da mostrare",
"scopeShowAll": "mostra tutto", "scopeShowAll": "Mostra tutto",
"scopeThisNode": "questo nodo", "scopeThisNode": "Questo nodo",
"formerJob": "Ex lavoro", "formerJob": "Attività precedente",
"formerJobTitle": "il lavoro che ha effettuato questo backup non esiste più su questo nodo.Il backup viene conservato finché non viene eliminato." "formerJobTitle": "L'attività che ha creato questo backup non esiste più su questo nodo. Il backup viene conservato finché non viene eliminato."
}, },
"backends": { "backends": {
"borgDescription": "Repository Borg per backup host deduplicati.", "borgDescription": "Repository Borg per backup host deduplicati.",
+2 -2
View File
@@ -3976,8 +3976,8 @@
"scopeAriaLabel": "Backups para mostrar", "scopeAriaLabel": "Backups para mostrar",
"scopeShowAll": "Mostrar tudo", "scopeShowAll": "Mostrar tudo",
"scopeThisNode": "Este nó", "scopeThisNode": "Este nó",
"formerJob": "Trabalho anterior", "formerJob": "Tarefa anterior",
"formerJobTitle": "A tarefa que fez esse backup não existe mais neste nó.O backup é mantido até ser excluído." "formerJobTitle": "A tarefa que fez esse backup não existe mais neste nó. O backup é mantido até ser excluído."
}, },
"backends": { "backends": {
"borgDescription": "Repositório Borg para backups de host desduplicados.", "borgDescription": "Repositório Borg para backups de host desduplicados.",
+2 -2
View File
@@ -3975,8 +3975,8 @@
"scopeAriaLabel": "Zálohy na zobrazenie", "scopeAriaLabel": "Zálohy na zobrazenie",
"scopeShowAll": "Zobraziť všetko", "scopeShowAll": "Zobraziť všetko",
"scopeThisNode": "Tento uzol", "scopeThisNode": "Tento uzol",
"formerJob": "Bývalá práca", "formerJob": "Predchádzajúca úloha",
"formerJobTitle": "Úloha, ktorá vytvorila túto zálohu, už v tomto uzle neexistuje.Záloha sa uchováva, kým sa neodstráni." "formerJobTitle": "Úloha, ktorá vytvorila túto zálohu, už v tomto uzle neexistuje. Záloha sa uchováva, kým sa neodstráni."
}, },
"backends": { "backends": {
"borgDescription": "Borg repozitár pre deduplikované zálohy servera.", "borgDescription": "Borg repozitár pre deduplikované zálohy servera.",
+5 -5
View File
@@ -3971,13 +3971,13 @@
"viewContentsTitle": "Visa säkerhetskopieringsinnehåll", "viewContentsTitle": "Visa säkerhetskopieringsinnehåll",
"descriptionAfter": "", "descriptionAfter": "",
"emptyMessage": "Inga backup-arkiv hittades.", "emptyMessage": "Inga backup-arkiv hittades.",
"hiddenOtherNodes": "Säkerhetskopiering av andra noder som inte visas: {count}.", "hiddenOtherNodes": "Säkerhetskopior från andra noder som inte visas: {count}.",
"scopeAllNodes": "All nodes", "scopeAllNodes": "Alla noder",
"scopeAriaLabel": "Backups to show", "scopeAriaLabel": "Säkerhetskopior som visas",
"scopeShowAll": "Visa alla", "scopeShowAll": "Visa alla",
"scopeThisNode": "Denna nod", "scopeThisNode": "Denna nod",
"formerJob": "Former job", "formerJob": "Tidigare jobb",
"formerJobTitle": "Jobbet som gjorde denna säkerhetskopia finns inte längre på den här noden.Säkerheten sparas tills den raderas." "formerJobTitle": "Jobbet som gjorde den här säkerhetskopian finns inte längre på den här noden. Säkerhetskopian sparas tills den raderas."
}, },
"backends": { "backends": {
"borgDescription": "Borg-arkiv för deduplicerade värdsäkerhetskopior.", "borgDescription": "Borg-arkiv för deduplicerade värdsäkerhetskopior.",
+8 -5
View File
@@ -17,7 +17,7 @@ assert.ok(branch, 'real archives loading/error/empty decision');
// list with a sentinel: rendering its controls is outside this message test. // list with a sentinel: rendering its controls is outside this message test.
const transformed = ts.transform(branch, [context => root => { const transformed = ts.transform(branch, [context => root => {
const visit = node => { const visit = node => {
if (ts.isConditionalExpression(node) && node.condition.getText(source) === 'unifiedArchives.length === 0') { if (ts.isConditionalExpression(node) && node.condition.getText(source) === 'visibleArchives.length === 0 && hiddenArchives === 0') {
return ts.factory.updateConditionalExpression(node, node.condition, node.questionToken, return ts.factory.updateConditionalExpression(node, node.condition, node.questionToken,
node.whenTrue, node.colonToken, ts.factory.createStringLiteral('NONEMPTY_ARCHIVES')); node.whenTrue, node.colonToken, ts.factory.createStringLiteral('NONEMPTY_ARCHIVES'));
} }
@@ -28,14 +28,14 @@ const transformed = ts.transform(branch, [context => root => {
const expression = printer.printNode(ts.EmitHint.Expression, transformed.transformed[0], source); const expression = printer.printNode(ts.EmitHint.Expression, transformed.transformed[0], source);
transformed.dispose(); transformed.dispose();
const render = new Function('React', 'Loader2', 't', 'archivesErr', 'remoteArchivesErr', const render = new Function('React', 'Loader2', 't', 'archivesErr', 'remoteArchivesErr',
'archivesResp', 'remoteArchivesResp', 'unifiedArchives', compile(`const result = ${expression};`) + '\nreturn result;'); 'archivesResp', 'remoteArchivesResp', 'visibleArchives', 'hiddenArchives', compile(`const result = ${expression};`) + '\nreturn result;');
// Text-only JSX sink: TypeScript performs the real JSX whitespace conversion. // Text-only JSX sink: TypeScript performs the real JSX whitespace conversion.
const React = { createElement: (tag, props, ...children) => children.flat(Infinity).filter(x => x != null && x !== false).join('') }; const React = { createElement: (tag, props, ...children) => children.flat(Infinity).filter(x => x != null && x !== false).join('') };
const text = (locale = 'en', overrides = {}, messages = catalogs) => { const text = (locale = 'en', overrides = {}, messages = catalogs) => {
const state = { archivesErr: null, remoteArchivesErr: null, archivesResp: { archives: [] }, const state = { archivesErr: null, remoteArchivesErr: null, archivesResp: { archives: [] },
remoteArchivesResp: { snapshots: [] }, unifiedArchives: [], ...overrides }; remoteArchivesResp: { snapshots: [] }, visibleArchives: [], hiddenArchives: 0, ...overrides };
return render(React, 'spinner', translator(locale, messages), state.archivesErr, state.remoteArchivesErr, return render(React, 'spinner', translator(locale, messages), state.archivesErr, state.remoteArchivesErr,
state.archivesResp, state.remoteArchivesResp, state.unifiedArchives); state.archivesResp, state.remoteArchivesResp, state.visibleArchives, state.hiddenArchives);
}; };
const emptyMessage = 'No backup archives found.'; const emptyMessage = 'No backup archives found.';
@@ -54,7 +54,10 @@ for (const locale of locales) {
assert.ok(locales.some(locale => locale !== 'en' && assert.ok(locales.some(locale => locale !== 'en' &&
typeof catalogs[locale].backup?.archives?.emptyMessage === 'string' && typeof catalogs[locale].backup?.archives?.emptyMessage === 'string' &&
catalogs[locale].backup.archives.emptyMessage !== emptyMessage), 'localized shipped archive message exercised'); catalogs[locale].backup.archives.emptyMessage !== emptyMessage), 'localized shipped archive message exercised');
for (const count of [1, 3]) assert.equal(text('en', { unifiedArchives: Array(count).fill({}) }), 'NONEMPTY_ARCHIVES'); for (const count of [1, 3]) assert.equal(text('en', { visibleArchives: Array(count).fill({}) }), 'NONEMPTY_ARCHIVES');
// Backups of other nodes hidden by the node filter are not an empty list:
// the list shows the note that offers them.
assert.equal(text('en', { hiddenArchives: 2 }), 'NONEMPTY_ARCHIVES');
assert.equal(text('en', { archivesResp: undefined, remoteArchivesResp: undefined }), translator('en')('backup.common.loading')); assert.equal(text('en', { archivesResp: undefined, remoteArchivesResp: undefined }), translator('en')('backup.common.loading'));
assert.equal(text('en', { archivesErr: true, remoteArchivesErr: true }), translator('en')('backup.archives.loadFailed')); assert.equal(text('en', { archivesErr: true, remoteArchivesErr: true }), translator('en')('backup.archives.loadFailed'));
// Preserve existing partial-source semantics; no claim that every source was queried. // Preserve existing partial-source semantics; no claim that every source was queried.