From 526f17627d62eb8656dcd313707b524fa92781a7 Mon Sep 17 00:00:00 2001 From: Remko Date: Thu, 3 Sep 2026 13:22:53 +0200 Subject: [PATCH 1/4] fix(secrets): show type icons and strength badges in the cards and table views MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix-brief bugs 8+9 (stage 5). The List view rendered each secret with its type icon and password-strength pill, but the cards and table views fell back to CnIndexPage's generic renderer driven by a name+url schema — the same secret lost its type and strength the moment the user switched view. Cards now fill CnIndexPage's #card slot with the SAME row component the list uses (SecretListItem: favicon/type icon, strength pill, outstanding- request, blocked and compromised states, copy button) boxed in a card shell that mirrors CnObjectCard's tokens, with the selection checkbox re-wired like the existing #list-item override. The table grows Type and Strength columns in listSchema, rendered through #column-type and #column-strength cell slots since their values live in the type/health stores rather than on the row; both are non-sortable — no row field backs them. Unscored Strength cells render a muted em dash instead of a blank hole. The type→icon map moves into a shared SecretTypeIcon component so the three views cannot drift apart again. One new l10n key ("Strength") ships translated into all 36 locales with the catalogs regenerated. 8 new unit tests cover the icon map and its fallback, the column set and order, the sort opt-out, the translated type label, and the badge-or-dash rule. --- l10n/be.js | 3 +- l10n/be.json | 3 +- l10n/bg.js | 3 +- l10n/bg.json | 3 +- l10n/bs.js | 3 +- l10n/bs.json | 3 +- l10n/ca.js | 3 +- l10n/ca.json | 3 +- l10n/cs.js | 3 +- l10n/cs.json | 3 +- l10n/da.js | 3 +- l10n/da.json | 3 +- l10n/de.js | 3 +- l10n/de.json | 3 +- l10n/el.js | 3 +- l10n/el.json | 3 +- l10n/en.js | 3 +- l10n/en.json | 3 +- l10n/es.js | 3 +- l10n/es.json | 3 +- l10n/et.js | 3 +- l10n/et.json | 3 +- l10n/fi.js | 3 +- l10n/fi.json | 3 +- l10n/fr.js | 3 +- l10n/fr.json | 3 +- l10n/ga.js | 3 +- l10n/ga.json | 3 +- l10n/hr.js | 3 +- l10n/hr.json | 3 +- l10n/hu.js | 3 +- l10n/hu.json | 3 +- l10n/is.js | 3 +- l10n/is.json | 3 +- l10n/it.js | 3 +- l10n/it.json | 3 +- l10n/lb.js | 3 +- l10n/lb.json | 3 +- l10n/lt.js | 3 +- l10n/lt.json | 3 +- l10n/lv.js | 3 +- l10n/lv.json | 3 +- l10n/mk.js | 3 +- l10n/mk.json | 3 +- l10n/mt.js | 3 +- l10n/mt.json | 3 +- l10n/nb.js | 3 +- l10n/nb.json | 3 +- l10n/nl.js | 3 +- l10n/nl.json | 3 +- l10n/pl.js | 3 +- l10n/pl.json | 3 +- l10n/pt.js | 3 +- l10n/pt.json | 3 +- l10n/rm.js | 3 +- l10n/rm.json | 3 +- l10n/ro.js | 3 +- l10n/ro.json | 3 +- l10n/ru.js | 3 +- l10n/ru.json | 3 +- l10n/sk.js | 3 +- l10n/sk.json | 3 +- l10n/sl.js | 3 +- l10n/sl.json | 3 +- l10n/sq.js | 3 +- l10n/sq.json | 3 +- l10n/sr.js | 3 +- l10n/sr.json | 3 +- l10n/sv.js | 3 +- l10n/sv.json | 3 +- l10n/tr.js | 3 +- l10n/tr.json | 3 +- l10n/uk.js | 3 +- l10n/uk.json | 3 +- src/components/SecretListItem.vue | 33 +--- src/components/SecretTypeIcon.vue | 76 +++++++++ src/views/SecretList.vue | 186 ++++++++++++++++++++++- tests/components/SecretTypeIcon.spec.js | 59 +++++++ tests/views/SecretList.listViews.spec.js | 98 ++++++++++++ 79 files changed, 568 insertions(+), 106 deletions(-) create mode 100644 src/components/SecretTypeIcon.vue create mode 100644 tests/components/SecretTypeIcon.spec.js create mode 100644 tests/views/SecretList.listViews.spec.js diff --git a/l10n/be.js b/l10n/be.js index 346e91cc..36a07c82 100644 --- a/l10n/be.js +++ b/l10n/be.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Гэтае сховішча пустое — няма чаго перамяшчаць.", "Target vault": "Мэтавае сховішча", "Failed to move the vault contents — some items may have moved already.": "Не ўдалося перамясціць змесціва сховішча — частка элементаў магла ўжо перамясціцца.", - "Move vault contents": "Перамясціць змесціва сховішча" + "Move vault contents": "Перамясціць змесціва сховішча", + "Strength": "Надзейнасць" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/be.json b/l10n/be.json index 0c834d1c..a1cda2b1 100644 --- a/l10n/be.json +++ b/l10n/be.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Гэтае сховішча пустое — няма чаго перамяшчаць.", "Target vault": "Мэтавае сховішча", "Failed to move the vault contents — some items may have moved already.": "Не ўдалося перамясціць змесціва сховішча — частка элементаў магла ўжо перамясціцца.", - "Move vault contents": "Перамясціць змесціва сховішча" + "Move vault contents": "Перамясціць змесціва сховішча", + "Strength": "Надзейнасць" }, "plurals": null } diff --git a/l10n/bg.js b/l10n/bg.js index 0ec3ae89..b930d9bb 100644 --- a/l10n/bg.js +++ b/l10n/bg.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Този трезор е празен — няма какво да се премести.", "Target vault": "Целеви трезор", "Failed to move the vault contents — some items may have moved already.": "Неуспешно преместване на съдържанието на трезора — част от елементите може вече да са преместени.", - "Move vault contents": "Преместване на съдържанието на трезора" + "Move vault contents": "Преместване на съдържанието на трезора", + "Strength": "Сила" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/bg.json b/l10n/bg.json index 678fe548..19d8984a 100644 --- a/l10n/bg.json +++ b/l10n/bg.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Този трезор е празен — няма какво да се премести.", "Target vault": "Целеви трезор", "Failed to move the vault contents — some items may have moved already.": "Неуспешно преместване на съдържанието на трезора — част от елементите може вече да са преместени.", - "Move vault contents": "Преместване на съдържанието на трезора" + "Move vault contents": "Преместване на съдържанието на трезора", + "Strength": "Сила" }, "plurals": null } diff --git a/l10n/bs.js b/l10n/bs.js index 24ddeaec..a3d4913f 100644 --- a/l10n/bs.js +++ b/l10n/bs.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Ovaj trezor je prazan — nema šta da se premjesti.", "Target vault": "Odredišni trezor", "Failed to move the vault contents — some items may have moved already.": "Premještanje sadržaja trezora nije uspjelo — neki elementi su možda već premješteni.", - "Move vault contents": "Premjesti sadržaj trezora" + "Move vault contents": "Premjesti sadržaj trezora", + "Strength": "Jačina" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/bs.json b/l10n/bs.json index 63a5c6f9..97ddf05b 100644 --- a/l10n/bs.json +++ b/l10n/bs.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Ovaj trezor je prazan — nema šta da se premjesti.", "Target vault": "Odredišni trezor", "Failed to move the vault contents — some items may have moved already.": "Premještanje sadržaja trezora nije uspjelo — neki elementi su možda već premješteni.", - "Move vault contents": "Premjesti sadržaj trezora" + "Move vault contents": "Premjesti sadržaj trezora", + "Strength": "Jačina" }, "plurals": null } diff --git a/l10n/ca.js b/l10n/ca.js index 927248bb..14001ce6 100644 --- a/l10n/ca.js +++ b/l10n/ca.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Aquesta caixa forta és buida — no hi ha res per moure.", "Target vault": "Caixa forta de destinació", "Failed to move the vault contents — some items may have moved already.": "No s'ha pogut moure el contingut de la caixa forta — pot ser que alguns elements ja s'hagin mogut.", - "Move vault contents": "Mou el contingut de la caixa forta" + "Move vault contents": "Mou el contingut de la caixa forta", + "Strength": "Fortalesa" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ca.json b/l10n/ca.json index 3c142b9d..b0529b33 100644 --- a/l10n/ca.json +++ b/l10n/ca.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Aquesta caixa forta és buida — no hi ha res per moure.", "Target vault": "Caixa forta de destinació", "Failed to move the vault contents — some items may have moved already.": "No s'ha pogut moure el contingut de la caixa forta — pot ser que alguns elements ja s'hagin mogut.", - "Move vault contents": "Mou el contingut de la caixa forta" + "Move vault contents": "Mou el contingut de la caixa forta", + "Strength": "Fortalesa" }, "plurals": null } diff --git a/l10n/cs.js b/l10n/cs.js index be915164..c4b66a18 100644 --- a/l10n/cs.js +++ b/l10n/cs.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Tento trezor je prázdný — není co přesouvat.", "Target vault": "Cílový trezor", "Failed to move the vault contents — some items may have moved already.": "Obsah trezoru se nepodařilo přesunout — část položek už mohla být přesunuta.", - "Move vault contents": "Přesunout obsah trezoru" + "Move vault contents": "Přesunout obsah trezoru", + "Strength": "Síla" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/cs.json b/l10n/cs.json index 5ee5431d..d4c59287 100644 --- a/l10n/cs.json +++ b/l10n/cs.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Tento trezor je prázdný — není co přesouvat.", "Target vault": "Cílový trezor", "Failed to move the vault contents — some items may have moved already.": "Obsah trezoru se nepodařilo přesunout — část položek už mohla být přesunuta.", - "Move vault contents": "Přesunout obsah trezoru" + "Move vault contents": "Přesunout obsah trezoru", + "Strength": "Síla" }, "plurals": null } diff --git a/l10n/da.js b/l10n/da.js index c6adee64..6926b480 100644 --- a/l10n/da.js +++ b/l10n/da.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Denne boks er tom — der er intet at flytte.", "Target vault": "Målboks", "Failed to move the vault contents — some items may have moved already.": "Kunne ikke flytte boksens indhold — nogle elementer kan allerede være flyttet.", - "Move vault contents": "Flyt boksens indhold" + "Move vault contents": "Flyt boksens indhold", + "Strength": "Styrke" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/da.json b/l10n/da.json index 0f2402a8..25e56d3a 100644 --- a/l10n/da.json +++ b/l10n/da.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Denne boks er tom — der er intet at flytte.", "Target vault": "Målboks", "Failed to move the vault contents — some items may have moved already.": "Kunne ikke flytte boksens indhold — nogle elementer kan allerede være flyttet.", - "Move vault contents": "Flyt boksens indhold" + "Move vault contents": "Flyt boksens indhold", + "Strength": "Styrke" }, "plurals": null } diff --git a/l10n/de.js b/l10n/de.js index 43d82dc9..14582587 100644 --- a/l10n/de.js +++ b/l10n/de.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Dieser Tresor ist leer — es gibt nichts zu verschieben.", "Target vault": "Ziel-Tresor", "Failed to move the vault contents — some items may have moved already.": "Der Tresorinhalt konnte nicht verschoben werden — einige Einträge wurden möglicherweise bereits verschoben.", - "Move vault contents": "Tresorinhalt verschieben" + "Move vault contents": "Tresorinhalt verschieben", + "Strength": "Stärke" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/de.json b/l10n/de.json index 14ba8d54..64518e18 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Dieser Tresor ist leer — es gibt nichts zu verschieben.", "Target vault": "Ziel-Tresor", "Failed to move the vault contents — some items may have moved already.": "Der Tresorinhalt konnte nicht verschoben werden — einige Einträge wurden möglicherweise bereits verschoben.", - "Move vault contents": "Tresorinhalt verschieben" + "Move vault contents": "Tresorinhalt verschieben", + "Strength": "Stärke" }, "plurals": null } diff --git a/l10n/el.js b/l10n/el.js index 6666ef39..442bfff3 100644 --- a/l10n/el.js +++ b/l10n/el.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Αυτό το θησαυροφυλάκιο είναι άδειο — δεν υπάρχει τίποτα για μετακίνηση.", "Target vault": "Θησαυροφυλάκιο προορισμού", "Failed to move the vault contents — some items may have moved already.": "Αποτυχία μετακίνησης των περιεχομένων — ορισμένα στοιχεία ενδέχεται να έχουν ήδη μετακινηθεί.", - "Move vault contents": "Μετακίνηση περιεχομένων θησαυροφυλακίου" + "Move vault contents": "Μετακίνηση περιεχομένων θησαυροφυλακίου", + "Strength": "Ισχύς" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/el.json b/l10n/el.json index f80add51..9a35c7bc 100644 --- a/l10n/el.json +++ b/l10n/el.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Αυτό το θησαυροφυλάκιο είναι άδειο — δεν υπάρχει τίποτα για μετακίνηση.", "Target vault": "Θησαυροφυλάκιο προορισμού", "Failed to move the vault contents — some items may have moved already.": "Αποτυχία μετακίνησης των περιεχομένων — ορισμένα στοιχεία ενδέχεται να έχουν ήδη μετακινηθεί.", - "Move vault contents": "Μετακίνηση περιεχομένων θησαυροφυλακίου" + "Move vault contents": "Μετακίνηση περιεχομένων θησαυροφυλακίου", + "Strength": "Ισχύς" }, "plurals": null } diff --git a/l10n/en.js b/l10n/en.js index 06b49791..c03e6781 100644 --- a/l10n/en.js +++ b/l10n/en.js @@ -1117,7 +1117,8 @@ OC.L10N.register( "Target vault": "Target vault", "Failed to move the vault contents — some items may have moved already.": "Failed to move the vault contents — some items may have moved already.", "Move vault contents": "Move vault contents", - "This permanently deletes this secret and revokes its shares. There is no trash — this cannot be undone.": "This permanently deletes this secret and revokes its shares. There is no trash — this cannot be undone." + "This permanently deletes this secret and revokes its shares. There is no trash — this cannot be undone.": "This permanently deletes this secret and revokes its shares. There is no trash — this cannot be undone.", + "Strength": "Strength" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/en.json b/l10n/en.json index 66fbb7c3..ee30c6a5 100644 --- a/l10n/en.json +++ b/l10n/en.json @@ -1116,7 +1116,8 @@ "Target vault": "Target vault", "Failed to move the vault contents — some items may have moved already.": "Failed to move the vault contents — some items may have moved already.", "Move vault contents": "Move vault contents", - "This permanently deletes this secret and revokes its shares. There is no trash — this cannot be undone.": "This permanently deletes this secret and revokes its shares. There is no trash — this cannot be undone." + "This permanently deletes this secret and revokes its shares. There is no trash — this cannot be undone.": "This permanently deletes this secret and revokes its shares. There is no trash — this cannot be undone.", + "Strength": "Strength" }, "plurals": "", "pluralForm": "nplurals=2; plural=(n != 1);" diff --git a/l10n/es.js b/l10n/es.js index e3c4183e..6abb573c 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Esta caja fuerte está vacía — no hay nada que mover.", "Target vault": "Caja fuerte de destino", "Failed to move the vault contents — some items may have moved already.": "No se pudo mover el contenido de la caja fuerte — puede que algunos elementos ya se hayan movido.", - "Move vault contents": "Mover el contenido de la caja fuerte" + "Move vault contents": "Mover el contenido de la caja fuerte", + "Strength": "Fortaleza" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/es.json b/l10n/es.json index a613bee1..e7561c99 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Esta caja fuerte está vacía — no hay nada que mover.", "Target vault": "Caja fuerte de destino", "Failed to move the vault contents — some items may have moved already.": "No se pudo mover el contenido de la caja fuerte — puede que algunos elementos ya se hayan movido.", - "Move vault contents": "Mover el contenido de la caja fuerte" + "Move vault contents": "Mover el contenido de la caja fuerte", + "Strength": "Fortaleza" }, "plurals": null } diff --git a/l10n/et.js b/l10n/et.js index 201204fa..b3a1ddd2 100644 --- a/l10n/et.js +++ b/l10n/et.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "See hoidla on tühi — pole midagi teisaldada.", "Target vault": "Sihthoidla", "Failed to move the vault contents — some items may have moved already.": "Hoidla sisu teisaldamine nurjus — osa üksusi võib olla juba teisaldatud.", - "Move vault contents": "Teisalda hoidla sisu" + "Move vault contents": "Teisalda hoidla sisu", + "Strength": "Tugevus" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/et.json b/l10n/et.json index 7f07e784..12bebb9b 100644 --- a/l10n/et.json +++ b/l10n/et.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "See hoidla on tühi — pole midagi teisaldada.", "Target vault": "Sihthoidla", "Failed to move the vault contents — some items may have moved already.": "Hoidla sisu teisaldamine nurjus — osa üksusi võib olla juba teisaldatud.", - "Move vault contents": "Teisalda hoidla sisu" + "Move vault contents": "Teisalda hoidla sisu", + "Strength": "Tugevus" }, "plurals": null } diff --git a/l10n/fi.js b/l10n/fi.js index 8ed7981c..96a330e6 100644 --- a/l10n/fi.js +++ b/l10n/fi.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Tämä holvi on tyhjä — siirrettävää ei ole.", "Target vault": "Kohdeholvi", "Failed to move the vault contents — some items may have moved already.": "Holvin sisällön siirto epäonnistui — osa kohteista on voitu jo siirtää.", - "Move vault contents": "Siirrä holvin sisältö" + "Move vault contents": "Siirrä holvin sisältö", + "Strength": "Vahvuus" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/fi.json b/l10n/fi.json index fb5c6456..648e2f39 100644 --- a/l10n/fi.json +++ b/l10n/fi.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Tämä holvi on tyhjä — siirrettävää ei ole.", "Target vault": "Kohdeholvi", "Failed to move the vault contents — some items may have moved already.": "Holvin sisällön siirto epäonnistui — osa kohteista on voitu jo siirtää.", - "Move vault contents": "Siirrä holvin sisältö" + "Move vault contents": "Siirrä holvin sisältö", + "Strength": "Vahvuus" }, "plurals": null } diff --git a/l10n/fr.js b/l10n/fr.js index e0572782..064e969f 100644 --- a/l10n/fr.js +++ b/l10n/fr.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Ce coffre-fort est vide — il n'y a rien à déplacer.", "Target vault": "Coffre-fort de destination", "Failed to move the vault contents — some items may have moved already.": "Échec du déplacement du contenu du coffre-fort — certains éléments ont peut-être déjà été déplacés.", - "Move vault contents": "Déplacer le contenu du coffre-fort" + "Move vault contents": "Déplacer le contenu du coffre-fort", + "Strength": "Force" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/fr.json b/l10n/fr.json index c3cb5127..eb96ca8d 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Ce coffre-fort est vide — il n'y a rien à déplacer.", "Target vault": "Coffre-fort de destination", "Failed to move the vault contents — some items may have moved already.": "Échec du déplacement du contenu du coffre-fort — certains éléments ont peut-être déjà été déplacés.", - "Move vault contents": "Déplacer le contenu du coffre-fort" + "Move vault contents": "Déplacer le contenu du coffre-fort", + "Strength": "Force" }, "plurals": null } diff --git a/l10n/ga.js b/l10n/ga.js index f1eb0a45..65e4f0b2 100644 --- a/l10n/ga.js +++ b/l10n/ga.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Tá an taisceadán seo folamh — níl aon rud le bogadh.", "Target vault": "Sprioc-thaisceadán", "Failed to move the vault contents — some items may have moved already.": "Theip ar bhogadh inneachar an taisceadáin — seans gur bogadh cuid de na míreanna cheana.", - "Move vault contents": "Bog inneachar an taisceadáin" + "Move vault contents": "Bog inneachar an taisceadáin", + "Strength": "Neart" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ga.json b/l10n/ga.json index e85f0dfb..8501d165 100644 --- a/l10n/ga.json +++ b/l10n/ga.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Tá an taisceadán seo folamh — níl aon rud le bogadh.", "Target vault": "Sprioc-thaisceadán", "Failed to move the vault contents — some items may have moved already.": "Theip ar bhogadh inneachar an taisceadáin — seans gur bogadh cuid de na míreanna cheana.", - "Move vault contents": "Bog inneachar an taisceadáin" + "Move vault contents": "Bog inneachar an taisceadáin", + "Strength": "Neart" }, "plurals": null } diff --git a/l10n/hr.js b/l10n/hr.js index 0377d692..ac92f26c 100644 --- a/l10n/hr.js +++ b/l10n/hr.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Ovaj trezor je prazan — nema se što premjestiti.", "Target vault": "Odredišni trezor", "Failed to move the vault contents — some items may have moved already.": "Premještanje sadržaja trezora nije uspjelo — neki su elementi možda već premješteni.", - "Move vault contents": "Premjesti sadržaj trezora" + "Move vault contents": "Premjesti sadržaj trezora", + "Strength": "Snaga" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/hr.json b/l10n/hr.json index ae639c50..4935e293 100644 --- a/l10n/hr.json +++ b/l10n/hr.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Ovaj trezor je prazan — nema se što premjestiti.", "Target vault": "Odredišni trezor", "Failed to move the vault contents — some items may have moved already.": "Premještanje sadržaja trezora nije uspjelo — neki su elementi možda već premješteni.", - "Move vault contents": "Premjesti sadržaj trezora" + "Move vault contents": "Premjesti sadržaj trezora", + "Strength": "Snaga" }, "plurals": null } diff --git a/l10n/hu.js b/l10n/hu.js index 51fc5f27..c408335d 100644 --- a/l10n/hu.js +++ b/l10n/hu.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Ez a széf üres — nincs mit áthelyezni.", "Target vault": "Cél széf", "Failed to move the vault contents — some items may have moved already.": "A széf tartalmának áthelyezése nem sikerült — egyes elemek már áthelyezésre kerülhettek.", - "Move vault contents": "Széf tartalmának áthelyezése" + "Move vault contents": "Széf tartalmának áthelyezése", + "Strength": "Erősség" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/hu.json b/l10n/hu.json index 1239b31a..8f8ee361 100644 --- a/l10n/hu.json +++ b/l10n/hu.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Ez a széf üres — nincs mit áthelyezni.", "Target vault": "Cél széf", "Failed to move the vault contents — some items may have moved already.": "A széf tartalmának áthelyezése nem sikerült — egyes elemek már áthelyezésre kerülhettek.", - "Move vault contents": "Széf tartalmának áthelyezése" + "Move vault contents": "Széf tartalmának áthelyezése", + "Strength": "Erősség" }, "plurals": null } diff --git a/l10n/is.js b/l10n/is.js index 451f9078..4f71b24e 100644 --- a/l10n/is.js +++ b/l10n/is.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Þessi hvelfing er tóm — það er ekkert að færa.", "Target vault": "Markhvelfing", "Failed to move the vault contents — some items may have moved already.": "Tókst ekki að færa innihald hvelfingarinnar — sum atriði gætu þegar hafa verið færð.", - "Move vault contents": "Færa innihald hvelfingarinnar" + "Move vault contents": "Færa innihald hvelfingarinnar", + "Strength": "Styrkur" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/is.json b/l10n/is.json index ffd27625..18f2a7f2 100644 --- a/l10n/is.json +++ b/l10n/is.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Þessi hvelfing er tóm — það er ekkert að færa.", "Target vault": "Markhvelfing", "Failed to move the vault contents — some items may have moved already.": "Tókst ekki að færa innihald hvelfingarinnar — sum atriði gætu þegar hafa verið færð.", - "Move vault contents": "Færa innihald hvelfingarinnar" + "Move vault contents": "Færa innihald hvelfingarinnar", + "Strength": "Styrkur" }, "plurals": null } diff --git a/l10n/it.js b/l10n/it.js index 6c04a3a0..762288bd 100644 --- a/l10n/it.js +++ b/l10n/it.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Questa cassaforte è vuota — non c'è nulla da spostare.", "Target vault": "Cassaforte di destinazione", "Failed to move the vault contents — some items may have moved already.": "Impossibile spostare il contenuto della cassaforte — alcuni elementi potrebbero essere già stati spostati.", - "Move vault contents": "Sposta il contenuto della cassaforte" + "Move vault contents": "Sposta il contenuto della cassaforte", + "Strength": "Robustezza" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/it.json b/l10n/it.json index a8df54e9..cf264117 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Questa cassaforte è vuota — non c'è nulla da spostare.", "Target vault": "Cassaforte di destinazione", "Failed to move the vault contents — some items may have moved already.": "Impossibile spostare il contenuto della cassaforte — alcuni elementi potrebbero essere già stati spostati.", - "Move vault contents": "Sposta il contenuto della cassaforte" + "Move vault contents": "Sposta il contenuto della cassaforte", + "Strength": "Robustezza" }, "plurals": null } diff --git a/l10n/lb.js b/l10n/lb.js index 64bc0fe4..f7ba750a 100644 --- a/l10n/lb.js +++ b/l10n/lb.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Dësen Tresor ass eidel — et gëtt näischt ze réckelen.", "Target vault": "Zil-Tresor", "Failed to move the vault contents — some items may have moved already.": "Den Inhalt vum Tresor konnt net geréckelt ginn — verschidden Elementer si vläicht scho geréckelt.", - "Move vault contents": "Tresorinhalt réckelen" + "Move vault contents": "Tresorinhalt réckelen", + "Strength": "Stäerkt" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lb.json b/l10n/lb.json index f6d6b18d..fdbef997 100644 --- a/l10n/lb.json +++ b/l10n/lb.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Dësen Tresor ass eidel — et gëtt näischt ze réckelen.", "Target vault": "Zil-Tresor", "Failed to move the vault contents — some items may have moved already.": "Den Inhalt vum Tresor konnt net geréckelt ginn — verschidden Elementer si vläicht scho geréckelt.", - "Move vault contents": "Tresorinhalt réckelen" + "Move vault contents": "Tresorinhalt réckelen", + "Strength": "Stäerkt" }, "plurals": null } diff --git a/l10n/lt.js b/l10n/lt.js index 91e51a60..1a874580 100644 --- a/l10n/lt.js +++ b/l10n/lt.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Ši saugykla tuščia — nėra ko perkelti.", "Target vault": "Paskirties saugykla", "Failed to move the vault contents — some items may have moved already.": "Nepavyko perkelti saugyklos turinio — dalis elementų galėjo būti jau perkelta.", - "Move vault contents": "Perkelti saugyklos turinį" + "Move vault contents": "Perkelti saugyklos turinį", + "Strength": "Stiprumas" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lt.json b/l10n/lt.json index eeb58587..e2c0a6e3 100644 --- a/l10n/lt.json +++ b/l10n/lt.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Ši saugykla tuščia — nėra ko perkelti.", "Target vault": "Paskirties saugykla", "Failed to move the vault contents — some items may have moved already.": "Nepavyko perkelti saugyklos turinio — dalis elementų galėjo būti jau perkelta.", - "Move vault contents": "Perkelti saugyklos turinį" + "Move vault contents": "Perkelti saugyklos turinį", + "Strength": "Stiprumas" }, "plurals": null } diff --git a/l10n/lv.js b/l10n/lv.js index 68f3ebd6..c599491c 100644 --- a/l10n/lv.js +++ b/l10n/lv.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Šī glabātava ir tukša — nav ko pārvietot.", "Target vault": "Mērķa glabātava", "Failed to move the vault contents — some items may have moved already.": "Neizdevās pārvietot glabātavas saturu — daži vienumi, iespējams, jau ir pārvietoti.", - "Move vault contents": "Pārvietot glabātavas saturu" + "Move vault contents": "Pārvietot glabātavas saturu", + "Strength": "Stiprums" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lv.json b/l10n/lv.json index 5e760943..764274b8 100644 --- a/l10n/lv.json +++ b/l10n/lv.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Šī glabātava ir tukša — nav ko pārvietot.", "Target vault": "Mērķa glabātava", "Failed to move the vault contents — some items may have moved already.": "Neizdevās pārvietot glabātavas saturu — daži vienumi, iespējams, jau ir pārvietoti.", - "Move vault contents": "Pārvietot glabātavas saturu" + "Move vault contents": "Pārvietot glabātavas saturu", + "Strength": "Stiprums" }, "plurals": null } diff --git a/l10n/mk.js b/l10n/mk.js index 393828ea..40aeeef4 100644 --- a/l10n/mk.js +++ b/l10n/mk.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Овој трезор е празен — нема што да се премести.", "Target vault": "Целен трезор", "Failed to move the vault contents — some items may have moved already.": "Преместувањето на содржината на трезорот не успеа — некои елементи можеби веќе се преместени.", - "Move vault contents": "Премести ја содржината на трезорот" + "Move vault contents": "Премести ја содржината на трезорот", + "Strength": "Јачина" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/mk.json b/l10n/mk.json index 4769ca2d..0fc74067 100644 --- a/l10n/mk.json +++ b/l10n/mk.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Овој трезор е празен — нема што да се премести.", "Target vault": "Целен трезор", "Failed to move the vault contents — some items may have moved already.": "Преместувањето на содржината на трезорот не успеа — некои елементи можеби веќе се преместени.", - "Move vault contents": "Премести ја содржината на трезорот" + "Move vault contents": "Премести ја содржината на трезорот", + "Strength": "Јачина" }, "plurals": null } diff --git a/l10n/mt.js b/l10n/mt.js index f2a2aa3f..d15b137c 100644 --- a/l10n/mt.js +++ b/l10n/mt.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Din il-kaxxa-forti hija vojta — m'hemm xejn xi tmexxi.", "Target vault": "Kaxxa-forti tad-destinazzjoni", "Failed to move the vault contents — some items may have moved already.": "Falliment fit-tmexxija tal-kontenut — xi elementi jistgħu jkunu diġà tmexxew.", - "Move vault contents": "Mexxi l-kontenut tal-kaxxa-forti" + "Move vault contents": "Mexxi l-kontenut tal-kaxxa-forti", + "Strength": "Saħħa" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/mt.json b/l10n/mt.json index 2c0fcaac..843eb4a3 100644 --- a/l10n/mt.json +++ b/l10n/mt.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Din il-kaxxa-forti hija vojta — m'hemm xejn xi tmexxi.", "Target vault": "Kaxxa-forti tad-destinazzjoni", "Failed to move the vault contents — some items may have moved already.": "Falliment fit-tmexxija tal-kontenut — xi elementi jistgħu jkunu diġà tmexxew.", - "Move vault contents": "Mexxi l-kontenut tal-kaxxa-forti" + "Move vault contents": "Mexxi l-kontenut tal-kaxxa-forti", + "Strength": "Saħħa" }, "plurals": null } diff --git a/l10n/nb.js b/l10n/nb.js index 52d310fe..2117ab8e 100644 --- a/l10n/nb.js +++ b/l10n/nb.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Dette hvelvet er tomt — det er ingenting å flytte.", "Target vault": "Målhvelv", "Failed to move the vault contents — some items may have moved already.": "Kunne ikke flytte hvelvets innhold — noen elementer kan allerede være flyttet.", - "Move vault contents": "Flytt hvelvets innhold" + "Move vault contents": "Flytt hvelvets innhold", + "Strength": "Styrke" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/nb.json b/l10n/nb.json index 69001c09..1542fe53 100644 --- a/l10n/nb.json +++ b/l10n/nb.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Dette hvelvet er tomt — det er ingenting å flytte.", "Target vault": "Målhvelv", "Failed to move the vault contents — some items may have moved already.": "Kunne ikke flytte hvelvets innhold — noen elementer kan allerede være flyttet.", - "Move vault contents": "Flytt hvelvets innhold" + "Move vault contents": "Flytt hvelvets innhold", + "Strength": "Styrke" }, "plurals": null } diff --git a/l10n/nl.js b/l10n/nl.js index 3df47b5c..20b7bffb 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -742,7 +742,8 @@ OC.L10N.register( "Target vault": "Doelkluis", "Failed to move the vault contents — some items may have moved already.": "Verplaatsen van de kluisinhoud mislukt — sommige items zijn mogelijk al verplaatst.", "Move vault contents": "Kluisinhoud verplaatsen", - "This permanently deletes this secret and revokes its shares. There is no trash — this cannot be undone.": "Dit verwijdert dit geheim permanent en trekt de delingen ervan in. Er is geen prullenbak — dit kan niet ongedaan worden gemaakt." + "This permanently deletes this secret and revokes its shares. There is no trash — this cannot be undone.": "Dit verwijdert dit geheim permanent en trekt de delingen ervan in. Er is geen prullenbak — dit kan niet ongedaan worden gemaakt.", + "Strength": "Sterkte" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/nl.json b/l10n/nl.json index e0f9b388..0dd31b09 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -741,7 +741,8 @@ "Target vault": "Doelkluis", "Failed to move the vault contents — some items may have moved already.": "Verplaatsen van de kluisinhoud mislukt — sommige items zijn mogelijk al verplaatst.", "Move vault contents": "Kluisinhoud verplaatsen", - "This permanently deletes this secret and revokes its shares. There is no trash — this cannot be undone.": "Dit verwijdert dit geheim permanent en trekt de delingen ervan in. Er is geen prullenbak — dit kan niet ongedaan worden gemaakt." + "This permanently deletes this secret and revokes its shares. There is no trash — this cannot be undone.": "Dit verwijdert dit geheim permanent en trekt de delingen ervan in. Er is geen prullenbak — dit kan niet ongedaan worden gemaakt.", + "Strength": "Sterkte" }, "plurals": null, "pluralForm": "nplurals=2; plural=(n != 1);" diff --git a/l10n/pl.js b/l10n/pl.js index f8e2f018..8c0c0be4 100644 --- a/l10n/pl.js +++ b/l10n/pl.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Ten sejf jest pusty — nie ma nic do przeniesienia.", "Target vault": "Sejf docelowy", "Failed to move the vault contents — some items may have moved already.": "Nie udało się przenieść zawartości sejfu — część elementów mogła już zostać przeniesiona.", - "Move vault contents": "Przenieś zawartość sejfu" + "Move vault contents": "Przenieś zawartość sejfu", + "Strength": "Siła" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/pl.json b/l10n/pl.json index 16d0f913..2ea97bd0 100644 --- a/l10n/pl.json +++ b/l10n/pl.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Ten sejf jest pusty — nie ma nic do przeniesienia.", "Target vault": "Sejf docelowy", "Failed to move the vault contents — some items may have moved already.": "Nie udało się przenieść zawartości sejfu — część elementów mogła już zostać przeniesiona.", - "Move vault contents": "Przenieś zawartość sejfu" + "Move vault contents": "Przenieś zawartość sejfu", + "Strength": "Siła" }, "plurals": null } diff --git a/l10n/pt.js b/l10n/pt.js index 88a72ec6..9aae4634 100644 --- a/l10n/pt.js +++ b/l10n/pt.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Este cofre está vazio — não há nada para mover.", "Target vault": "Cofre de destino", "Failed to move the vault contents — some items may have moved already.": "Falha ao mover o conteúdo do cofre — alguns itens podem já ter sido movidos.", - "Move vault contents": "Mover o conteúdo do cofre" + "Move vault contents": "Mover o conteúdo do cofre", + "Strength": "Força" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/pt.json b/l10n/pt.json index 8524dfa2..44092803 100644 --- a/l10n/pt.json +++ b/l10n/pt.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Este cofre está vazio — não há nada para mover.", "Target vault": "Cofre de destino", "Failed to move the vault contents — some items may have moved already.": "Falha ao mover o conteúdo do cofre — alguns itens podem já ter sido movidos.", - "Move vault contents": "Mover o conteúdo do cofre" + "Move vault contents": "Mover o conteúdo do cofre", + "Strength": "Força" }, "plurals": null } diff --git a/l10n/rm.js b/l10n/rm.js index 3227e548..ca7665f4 100644 --- a/l10n/rm.js +++ b/l10n/rm.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Quest tresor è vid — i na dat nagut da spustar.", "Target vault": "Tresor da destinaziun", "Failed to move the vault contents — some items may have moved already.": "Betg reussì da spustar il cuntegn dal tresor — tscherts elements pon gia esser spustads.", - "Move vault contents": "Spustar il cuntegn dal tresor" + "Move vault contents": "Spustar il cuntegn dal tresor", + "Strength": "Forza" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/rm.json b/l10n/rm.json index 8cac0ced..26ea5f62 100644 --- a/l10n/rm.json +++ b/l10n/rm.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Quest tresor è vid — i na dat nagut da spustar.", "Target vault": "Tresor da destinaziun", "Failed to move the vault contents — some items may have moved already.": "Betg reussì da spustar il cuntegn dal tresor — tscherts elements pon gia esser spustads.", - "Move vault contents": "Spustar il cuntegn dal tresor" + "Move vault contents": "Spustar il cuntegn dal tresor", + "Strength": "Forza" }, "plurals": null } diff --git a/l10n/ro.js b/l10n/ro.js index 1d1403d2..b1a0232a 100644 --- a/l10n/ro.js +++ b/l10n/ro.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Acest seif este gol — nu este nimic de mutat.", "Target vault": "Seif de destinație", "Failed to move the vault contents — some items may have moved already.": "Mutarea conținutului seifului a eșuat — este posibil ca unele elemente să fi fost deja mutate.", - "Move vault contents": "Mutați conținutul seifului" + "Move vault contents": "Mutați conținutul seifului", + "Strength": "Putere" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ro.json b/l10n/ro.json index d02509e0..72a880b5 100644 --- a/l10n/ro.json +++ b/l10n/ro.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Acest seif este gol — nu este nimic de mutat.", "Target vault": "Seif de destinație", "Failed to move the vault contents — some items may have moved already.": "Mutarea conținutului seifului a eșuat — este posibil ca unele elemente să fi fost deja mutate.", - "Move vault contents": "Mutați conținutul seifului" + "Move vault contents": "Mutați conținutul seifului", + "Strength": "Putere" }, "plurals": null } diff --git a/l10n/ru.js b/l10n/ru.js index 1b3906b5..95bb6633 100644 --- a/l10n/ru.js +++ b/l10n/ru.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Это хранилище пустое — перемещать нечего.", "Target vault": "Целевое хранилище", "Failed to move the vault contents — some items may have moved already.": "Не удалось переместить содержимое хранилища — часть элементов могла уже переместиться.", - "Move vault contents": "Переместить содержимое хранилища" + "Move vault contents": "Переместить содержимое хранилища", + "Strength": "Надёжность" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ru.json b/l10n/ru.json index 937ee302..d1885a29 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Это хранилище пустое — перемещать нечего.", "Target vault": "Целевое хранилище", "Failed to move the vault contents — some items may have moved already.": "Не удалось переместить содержимое хранилища — часть элементов могла уже переместиться.", - "Move vault contents": "Переместить содержимое хранилища" + "Move vault contents": "Переместить содержимое хранилища", + "Strength": "Надёжность" }, "plurals": null } diff --git a/l10n/sk.js b/l10n/sk.js index 48175535..40e8c411 100644 --- a/l10n/sk.js +++ b/l10n/sk.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Tento trezor je prázdny — nie je čo presúvať.", "Target vault": "Cieľový trezor", "Failed to move the vault contents — some items may have moved already.": "Obsah trezora sa nepodarilo presunúť — časť položiek už mohla byť presunutá.", - "Move vault contents": "Presunúť obsah trezora" + "Move vault contents": "Presunúť obsah trezora", + "Strength": "Sila" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sk.json b/l10n/sk.json index f191efa3..2d07edce 100644 --- a/l10n/sk.json +++ b/l10n/sk.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Tento trezor je prázdny — nie je čo presúvať.", "Target vault": "Cieľový trezor", "Failed to move the vault contents — some items may have moved already.": "Obsah trezora sa nepodarilo presunúť — časť položiek už mohla byť presunutá.", - "Move vault contents": "Presunúť obsah trezora" + "Move vault contents": "Presunúť obsah trezora", + "Strength": "Sila" }, "plurals": null } diff --git a/l10n/sl.js b/l10n/sl.js index 26b81a26..9f0ee2e3 100644 --- a/l10n/sl.js +++ b/l10n/sl.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Ta trezor je prazen — ni ničesar za premakniti.", "Target vault": "Ciljni trezor", "Failed to move the vault contents — some items may have moved already.": "Vsebine trezorja ni bilo mogoče premakniti — nekateri elementi so morda že premaknjeni.", - "Move vault contents": "Premakni vsebino trezorja" + "Move vault contents": "Premakni vsebino trezorja", + "Strength": "Moč" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sl.json b/l10n/sl.json index ce1d1086..3f888fb9 100644 --- a/l10n/sl.json +++ b/l10n/sl.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Ta trezor je prazen — ni ničesar za premakniti.", "Target vault": "Ciljni trezor", "Failed to move the vault contents — some items may have moved already.": "Vsebine trezorja ni bilo mogoče premakniti — nekateri elementi so morda že premaknjeni.", - "Move vault contents": "Premakni vsebino trezorja" + "Move vault contents": "Premakni vsebino trezorja", + "Strength": "Moč" }, "plurals": null } diff --git a/l10n/sq.js b/l10n/sq.js index ef7b022b..f2cf7d6d 100644 --- a/l10n/sq.js +++ b/l10n/sq.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Kjo kasafortë është bosh — s'ka asgjë për të zhvendosur.", "Target vault": "Kasaforta e synuar", "Failed to move the vault contents — some items may have moved already.": "Zhvendosja e përmbajtjes së kasafortës dështoi — disa elemente mund të jenë zhvendosur tashmë.", - "Move vault contents": "Zhvendos përmbajtjen e kasafortës" + "Move vault contents": "Zhvendos përmbajtjen e kasafortës", + "Strength": "Fuqia" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sq.json b/l10n/sq.json index c2d36f4f..fe98a7ae 100644 --- a/l10n/sq.json +++ b/l10n/sq.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Kjo kasafortë është bosh — s'ka asgjë për të zhvendosur.", "Target vault": "Kasaforta e synuar", "Failed to move the vault contents — some items may have moved already.": "Zhvendosja e përmbajtjes së kasafortës dështoi — disa elemente mund të jenë zhvendosur tashmë.", - "Move vault contents": "Zhvendos përmbajtjen e kasafortës" + "Move vault contents": "Zhvendos përmbajtjen e kasafortës", + "Strength": "Fuqia" }, "plurals": null } diff --git a/l10n/sr.js b/l10n/sr.js index 57e8d40e..3fc27072 100644 --- a/l10n/sr.js +++ b/l10n/sr.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Ovaj trezor je prazan — nema šta da se premesti.", "Target vault": "Odredišni trezor", "Failed to move the vault contents — some items may have moved already.": "Premeštanje sadržaja trezora nije uspelo — neki elementi su možda već premešteni.", - "Move vault contents": "Premesti sadržaj trezora" + "Move vault contents": "Premesti sadržaj trezora", + "Strength": "Јачина" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sr.json b/l10n/sr.json index be7bbafe..5a9fd05d 100644 --- a/l10n/sr.json +++ b/l10n/sr.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Ovaj trezor je prazan — nema šta da se premesti.", "Target vault": "Odredišni trezor", "Failed to move the vault contents — some items may have moved already.": "Premeštanje sadržaja trezora nije uspelo — neki elementi su možda već premešteni.", - "Move vault contents": "Premesti sadržaj trezora" + "Move vault contents": "Premesti sadržaj trezora", + "Strength": "Јачина" }, "plurals": null } diff --git a/l10n/sv.js b/l10n/sv.js index ee8445cf..7adbc21a 100644 --- a/l10n/sv.js +++ b/l10n/sv.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Detta valv är tomt — det finns inget att flytta.", "Target vault": "Målvalv", "Failed to move the vault contents — some items may have moved already.": "Kunde inte flytta valvets innehåll — vissa objekt kan redan ha flyttats.", - "Move vault contents": "Flytta valvets innehåll" + "Move vault contents": "Flytta valvets innehåll", + "Strength": "Styrka" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sv.json b/l10n/sv.json index 145482d5..7fc641b6 100644 --- a/l10n/sv.json +++ b/l10n/sv.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Detta valv är tomt — det finns inget att flytta.", "Target vault": "Målvalv", "Failed to move the vault contents — some items may have moved already.": "Kunde inte flytta valvets innehåll — vissa objekt kan redan ha flyttats.", - "Move vault contents": "Flytta valvets innehåll" + "Move vault contents": "Flytta valvets innehåll", + "Strength": "Styrka" }, "plurals": null } diff --git a/l10n/tr.js b/l10n/tr.js index adb03ba6..7144ebf2 100644 --- a/l10n/tr.js +++ b/l10n/tr.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Bu kasa boş — taşınacak bir şey yok.", "Target vault": "Hedef kasa", "Failed to move the vault contents — some items may have moved already.": "Kasa içeriği taşınamadı — bazı öğeler zaten taşınmış olabilir.", - "Move vault contents": "Kasa içeriğini taşı" + "Move vault contents": "Kasa içeriğini taşı", + "Strength": "Güç" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/tr.json b/l10n/tr.json index 4b536ced..eccd1896 100644 --- a/l10n/tr.json +++ b/l10n/tr.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Bu kasa boş — taşınacak bir şey yok.", "Target vault": "Hedef kasa", "Failed to move the vault contents — some items may have moved already.": "Kasa içeriği taşınamadı — bazı öğeler zaten taşınmış olabilir.", - "Move vault contents": "Kasa içeriğini taşı" + "Move vault contents": "Kasa içeriğini taşı", + "Strength": "Güç" }, "plurals": null } diff --git a/l10n/uk.js b/l10n/uk.js index dec0164f..120343c0 100644 --- a/l10n/uk.js +++ b/l10n/uk.js @@ -573,7 +573,8 @@ OC.L10N.register( "This vault is empty — there is nothing to move.": "Це сховище порожнє — немає чого переміщати.", "Target vault": "Цільове сховище", "Failed to move the vault contents — some items may have moved already.": "Не вдалося перемістити вміст сховища — частина елементів могла вже переміститися.", - "Move vault contents": "Перемістити вміст сховища" + "Move vault contents": "Перемістити вміст сховища", + "Strength": "Надійність" }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/uk.json b/l10n/uk.json index b220b898..0a5c1112 100644 --- a/l10n/uk.json +++ b/l10n/uk.json @@ -572,7 +572,8 @@ "This vault is empty — there is nothing to move.": "Це сховище порожнє — немає чого переміщати.", "Target vault": "Цільове сховище", "Failed to move the vault contents — some items may have moved already.": "Не вдалося перемістити вміст сховища — частина елементів могла вже переміститися.", - "Move vault contents": "Перемістити вміст сховища" + "Move vault contents": "Перемістити вміст сховища", + "Strength": "Надійність" }, "plurals": null } diff --git a/src/components/SecretListItem.vue b/src/components/SecretListItem.vue index 4d02e4dc..5cb639e7 100644 --- a/src/components/SecretListItem.vue +++ b/src/components/SecretListItem.vue @@ -16,7 +16,7 @@ width="24" height="24" @error="faviconFailed = true" /> - + @@ -92,22 +92,12 @@ diff --git a/src/views/SecretList.vue b/src/views/SecretList.vue index 6741067e..bca1c052 100644 --- a/src/views/SecretList.vue +++ b/src/views/SecretList.vue @@ -82,6 +82,7 @@ rowClickToView :objects="listObjects" :schema="listSchema" + :columnOverrides="listColumnOverrides" :loading="loading || folderSwitching" :pagination="pagination" :title="pageTitle" @@ -399,6 +400,63 @@ @copied="onCopied" /> + + + + + + @@ -445,6 +503,8 @@ import Safe from 'vue-material-design-icons/Safe.vue' import ShareVariantOutline from 'vue-material-design-icons/ShareVariantOutline.vue' import TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue' import SecretListItem from '../components/SecretListItem.vue' +import SecretTypeIcon from '../components/SecretTypeIcon.vue' +import StrengthBadge from '../components/StrengthBadge.vue' import AccountDeletionDialog from '../dialogs/AccountDeletionDialog.vue' import BulkDeleteDialog from '../dialogs/BulkDeleteDialog.vue' import BulkMoveDialog from '../dialogs/BulkMoveDialog.vue' @@ -521,6 +581,8 @@ export default { KeyVariant, Safe, SecretListItem, + SecretTypeIcon, + StrengthBadge, ExportDialog, CxpTransferDialog, GdprExportDialog, @@ -676,7 +738,12 @@ export default { }, /** - * Minimal schema so CnIndexPage can offer cards/table fallbacks. + * Schema for CnIndexPage's table view (cards render through the + * #card slot). Type and Strength (fix-brief bugs 8+9) are declared + * here so the table grows their columns; their cells render through + * the #column-type / #column-strength slots because the values live + * in the type/health stores, not on the row object. The order hints + * pin the column order — columnsFromSchema falls back to alphabetical. * * @return {object} * @spec openspec/specs/secrets/spec.md#requirement-list-and-pagination @@ -685,8 +752,16 @@ export default { listSchema() { return { properties: { - name: { title: t('keepiq', 'Name'), type: 'string' }, - url: { title: t('keepiq', 'URL'), type: 'string' }, + name: { title: t('keepiq', 'Name'), type: 'string', order: 1 }, + type: { title: t('keepiq', 'Type'), type: 'string', order: 2 }, + + strength: { + title: t('keepiq', 'Strength'), + type: 'string', + order: 3, + }, + + url: { title: t('keepiq', 'URL'), type: 'string', order: 4 }, }, configuration: { @@ -696,6 +771,21 @@ export default { } }, + /** + * Type and Strength are synthesized columns — no row field backs + * them, and the server cannot sort on either — so their headers + * must not offer the sort affordance the schema defaults grant. + * + * @return {object} + * @spec exclude Presentation-only column configuration for the table view. + */ + listColumnOverrides() { + return { + type: { sortable: false }, + strength: { sortable: false }, + } + }, + /** * The sort fields the list offers, matching the columns the server * accepts for the paged secrets query. @@ -1203,6 +1293,40 @@ export default { return String(secret.key || '') === '' ? 'awaiting-fill' : 're-request' }, + /** + * The translated type label for a row's Type cell (fix-brief bugs + * 8+9), resolved against the type catalogue; empty while the + * catalogue has not loaded the row's type yet. + * + * @param {object} secret The row's secret. + * @return {string} The label, or '' when the type is unknown. + * @spec openspec/specs/secrets/spec.md#requirement-secret-types + */ + typeLabelFor(secret) { + const type = useSecretTypeStore().typesById[secret.typeId] + return type ? secretTypeLabel(type) : '' + }, + + /** + * Whether the table's Strength cell shows the badge: a scored, + * unblocked row. Blocked rows are guarded here rather than trusting + * the score map — a suite revoked mid-session can leave a stale + * score behind for a row that can no longer be decrypted, and the + * list view suppresses the badge on blocked rows for the same + * reason. Everything else renders the placeholder dash. + * + * @param {object} secret The row's secret. + * @return {boolean} True when StrengthBadge would render a pill. + * @spec openspec/changes/password-health/specs/password-health/spec.md#requirement-strength-scoring-and-badges + */ + strengthBadgeVisible(secret) { + if (secret.blocked) { + return false + } + const score = useHealthStore().scoreById[secret.id] + return score !== undefined && score !== null + }, + /** * A credential was requested from the vault level. * @@ -1663,6 +1787,62 @@ export default { background-color: var(--color-background-hover); } +/* Card view (fix-brief bugs 8+9): the list-row component boxed as a card. + Shell tokens mirror CnObjectCard, so these cards sit indistinguishable + next to library-rendered ones elsewhere in the fleet. */ +.secret-list-view__card { + display: flex; + /* Centered like the row content beside it — a top-pinned checkbox next + to vertically centered text read as misaligned (review call). */ + align-items: center; + gap: 4px; + height: 100%; + padding: 8px; + background: var(--color-main-background); + border: 1px solid var(--color-border); + border-radius: var(--border-radius-large, 10px); + transition: + box-shadow 0.2s ease, + border-color 0.2s ease; +} + +.secret-list-view__card:hover { + border-color: var(--color-primary-element); + box-shadow: 0 2px 8px var(--color-box-shadow); +} + +/* Selection marks the card's BORDER, like CnObjectCard — the row-item's + background tint is the list view's signal and reads as hover here. */ +.secret-list-view__card--selected { + border-color: var(--color-primary-element); +} + +.secret-list-view__card-item { + flex: 1 1 auto; + min-width: 0; + border-bottom: none; + border-radius: var(--border-radius); +} + +/* Table Type cell: glyph + label, vertically centered as one unit. */ +.secret-list-view__type-cell { + display: inline-flex; + align-items: center; + gap: 6px; +} + +/* The Strength cell's "no score" dash: present so the column never shows + blank holes between pills, muted so it never competes with them. */ +.secret-list-view__strength-empty { + color: var(--color-text-maxcontrast); +} + +@media (prefers-reduced-motion: reduce) { + .secret-list-view__card { + transition: none; + } +} + /* Active type filter: the funnel already flips to its filled glyph; the primary color makes the applied-filter state readable at a glance even in a row of monochrome controls. */ diff --git a/tests/components/SecretTypeIcon.spec.js b/tests/components/SecretTypeIcon.spec.js new file mode 100644 index 00000000..862095c9 --- /dev/null +++ b/tests/components/SecretTypeIcon.spec.js @@ -0,0 +1,59 @@ +/** + * SPDX-FileCopyrightText: 2026 Conduction / Keepiq Contributors + * SPDX-License-Identifier: EUPL-1.2 + * + * Component test for `src/components/SecretTypeIcon.vue`. + * + * SecretTypeIcon is the ONE type→glyph rendering shared by the list rows, + * the table's Type cells and the cards (fix-brief bugs 8+9 were the card and + * table views shipping without any type icon — the drift this component + * exists to prevent). What these tests pin: + * + * - the glyph follows the secret type's machine name through the shared + * map in `utils/favicon.js` + * - an unknown or missing type falls back to the login key glyph instead + * of rendering nothing (every secret must carry a recognizable glyph) + * + * @spec openspec/specs/secrets/spec.md#requirement-secret-types + */ + +import { mount } from '@vue/test-utils' +import { createPinia, setActivePinia } from 'pinia' +import { beforeEach, describe, expect, it } from 'vitest' +import SecretTypeIcon from '../../src/components/SecretTypeIcon.vue' +import { useSecretTypeStore } from '../../src/store/modules/secretType.js' + +describe('SecretTypeIcon', () => { + beforeEach(() => { + setActivePinia(createPinia()) + useSecretTypeStore().types = [ + { id: 'type-login', name: 'login', label: 'Login' }, + { id: 'type-api', name: 'api_key', label: 'API key' }, + { id: 'type-card', name: 'card', label: 'Payment Card' }, + ] + }) + + it('renders the glyph mapped to the secret type', () => { + const wrapper = mount(SecretTypeIcon, { + propsData: { typeId: 'type-api' }, + }) + + expect(wrapper.find('.code-tags-icon').exists()).toBe(true) + }) + + it('follows the type through the shared map, not a per-view copy', () => { + const wrapper = mount(SecretTypeIcon, { + propsData: { typeId: 'type-card' }, + }) + + expect(wrapper.find('.credit-card-outline-icon').exists()).toBe(true) + }) + + it('falls back to the login key glyph for an unknown type', () => { + const wrapper = mount(SecretTypeIcon, { + propsData: { typeId: 'type-nonexistent' }, + }) + + expect(wrapper.find('.key-icon').exists()).toBe(true) + }) +}) diff --git a/tests/views/SecretList.listViews.spec.js b/tests/views/SecretList.listViews.spec.js new file mode 100644 index 00000000..e81e310c --- /dev/null +++ b/tests/views/SecretList.listViews.spec.js @@ -0,0 +1,98 @@ +/** + * SPDX-FileCopyrightText: 2026 Conduction / Keepiq Contributors + * SPDX-License-Identifier: EUPL-1.2 + * + * The cards and table views used to fall back to CnIndexPage's generic + * renderer with a name+url schema, so the type icon and strength badge the + * List view carries were simply absent there (fix-brief bugs 8+9). The fix + * declares Type and Strength columns in `listSchema` (cells rendered through + * the `#column-type` / `#column-strength` slots — their values live in the + * type/health stores, not on the row object) and fills the `#card` slot with + * the same row component the list uses. + * + * Options-object style (like SecretList.registryDispatch.spec.js): mounting + * the whole list view drags in the folder tree, search and type catalogue, + * none of which the schema/column contract touches. + * + * @spec openspec/specs/secrets/spec.md#requirement-list-and-pagination + * @spec openspec/specs/secrets/spec.md#requirement-secret-types + */ + +import { createPinia, setActivePinia } from 'pinia' +import { beforeEach, describe, expect, it } from 'vitest' +import SecretList from '../../src/views/SecretList.vue' +import { useHealthStore } from '../../src/store/modules/health.js' +import { useSecretTypeStore } from '../../src/store/modules/secretType.js' + +describe('SecretList — cards/table columns (fix-brief bugs 8+9)', () => { + beforeEach(() => { + setActivePinia(createPinia()) + }) + + it('declares Type and Strength columns for the table, in a pinned order', () => { + const schema = SecretList.computed.listSchema.call({}) + const props = schema.properties + + // The columns the table derives from the schema — columnsFromSchema + // sorts by `order` hint and falls back to ALPHABETICAL, which would + // interleave the new columns (name, strength, type, url). + expect(Object.keys(props)).toEqual(['name', 'type', 'strength', 'url']) + expect(props.name.order).toBeLessThan(props.type.order) + expect(props.type.order).toBeLessThan(props.strength.order) + expect(props.strength.order).toBeLessThan(props.url.order) + + // The card/name/description wiring must survive the new columns. + expect(schema.configuration).toEqual({ + objectNameField: 'name', + objectDescriptionField: 'url', + }) + }) + + it('withholds the sort affordance from the synthesized columns', () => { + // No row field backs Type or Strength and the server cannot sort on + // either, so a sortable header would be a dead control that lies. + expect(SecretList.computed.listColumnOverrides.call({})).toEqual({ + type: { sortable: false }, + strength: { sortable: false }, + }) + }) + + it('resolves the Type cell label through the translated type catalogue', () => { + useSecretTypeStore().types = [ + { id: 'type-card', name: 'card', label: 'Payment Card' }, + ] + + const label = SecretList.methods.typeLabelFor.call( + {}, + { id: 's-1', typeId: 'type-card' }, + ) + expect(label).toBe('Payment Card') + }) + + it('renders an empty Type label while the catalogue has not loaded', () => { + const label = SecretList.methods.typeLabelFor.call( + {}, + { id: 's-1', typeId: 'type-unknown' }, + ) + expect(label).toBe('') + }) + + // The template renders the muted dash whenever this says false, so the + // Strength column never shows blank holes between pills. + it('shows the strength badge only for scored, unblocked rows', () => { + useHealthStore().findings = [ + { id: 's-scored', score: 3, flags: [] }, + // zxcvbn 0 is a real score (Very weak) — a falsy check would + // swap the reddest badge in the column for the dash. + { id: 's-zero', score: 0, flags: [] }, + ] + const visible = SecretList.methods.strengthBadgeVisible + + expect(visible.call({}, { id: 's-scored' })).toBe(true) + expect(visible.call({}, { id: 's-zero' })).toBe(true) + expect(visible.call({}, { id: 's-unscored' })).toBe(false) + // Blocked wins even over a stale score left behind by a suite + // revoked mid-session — matching the list view's suppression. + expect(visible.call({}, { id: 's-scored', blocked: true })).toBe(false) + }) +}) From e5d7ef6eaa29d2d6114c16de41650044200f8f1f Mon Sep 17 00:00:00 2001 From: Remko Date: Thu, 3 Sep 2026 13:23:08 +0200 Subject: [PATCH 2/4] fix(secrets): stop listing the vaults above the secrets in All secrets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "All secrets" opened with a Vaults strip above the list — navigation posing as contents. It duplicated the nav's folder tree one panel away and pushed every secret below a screen of vault rows, worst on mobile where the nav toggle already opens the vault list in one tap (Proton Pass comparison). The root is a cross-vault query, not a container the user is inside. folderRows now returns nothing at the root; inside a vault or folder the subfolder rows are unchanged — there they ARE the contents of the thing being looked at. The vault-glyph rendering, its three view helpers and the strip's level-dependent caption go with it. The folder-sharing e2e workflow reaches a vault through the nav tree instead of the removed root rows, and a new unit spec pins both sides of the rule. --- src/views/SecretList.vue | 117 ++++--------------- tests/e2e/workflows/folder-sharing.spec.ts | 20 ++-- tests/views/SecretList.rootVaultRows.spec.js | 49 ++++++++ 3 files changed, 83 insertions(+), 103 deletions(-) create mode 100644 tests/views/SecretList.rootVaultRows.spec.js diff --git a/src/views/SecretList.vue b/src/views/SecretList.vue index bca1c052..1aaa9caa 100644 --- a/src/views/SecretList.vue +++ b/src/views/SecretList.vue @@ -251,18 +251,18 @@ class="secret-list-view__crumbs"> +
+ so folders read as a group, not as odd rows. --> - {{ - selectedFolderId - ? t('keepiq', 'Folders') - : t('keepiq', 'Vaults') - }} + {{ t('keepiq', 'Folders') }}