diff --git a/frontend/app/components/admin/user/deletion-form.js b/frontend/app/components/admin/user/deletion-form.js index 7ff7c6404..fd7b2bb03 100644 --- a/frontend/app/components/admin/user/deletion-form.js +++ b/frontend/app/components/admin/user/deletion-form.js @@ -31,6 +31,7 @@ export default class AdminUserDeletionFormComponent extends Component { @action deleteTeam(team) { + this.onlyTeammemberTeams = this.onlyTeammemberTeams.filter(e=> e != team) team.destroyRecord(); } @@ -40,5 +41,6 @@ export default class AdminUserDeletionFormComponent extends Component { this.args.user.destroyRecord(); this.toggleDeletionForm(); + this.args.afterDelete(); } } diff --git a/frontend/app/components/admin/user/table-row.js b/frontend/app/components/admin/user/table-row.js index 16b55f53e..13e846b8e 100644 --- a/frontend/app/components/admin/user/table-row.js +++ b/frontend/app/components/admin/user/table-row.js @@ -57,6 +57,11 @@ export default class AdminUserTableRowComponent extends Component { this.isEditing = !this.isEditing; } + @action + refresh() { + if (this.args.onRemove) this.args.onRemove(this.args.user); + } + @action unlockUser(user) { this.fetchService diff --git a/frontend/app/templates/components/admin/user/deletion-form.hbs b/frontend/app/templates/components/admin/user/deletion-form.hbs index f8bf58d94..365b52f24 100644 --- a/frontend/app/templates/components/admin/user/deletion-form.hbs +++ b/frontend/app/templates/components/admin/user/deletion-form.hbs @@ -7,9 +7,10 @@ - {{#if this.isDeletionDisabled}} +
+ {{#if this.isDeletionDisabled}}

{{t "admin.users.last_teammember_teams.message"}}

@@ -29,7 +30,7 @@ {{truncate team.description 20}} @@ -37,9 +38,20 @@ {{/each}}
- + delete
+ {{else}} +
+ + {{t "admin.users.last_teammember_teams.confirmation"}} + + + {{@user.givenname}} + {{@user.surname}} + +
+ {{/if}}
- {{/if}} + {{t "delete"}} {{t "close"}} diff --git a/frontend/app/templates/components/admin/user/table-row.hbs b/frontend/app/templates/components/admin/user/table-row.hbs index d87d99936..edde4f6be 100644 --- a/frontend/app/templates/components/admin/user/table-row.hbs +++ b/frontend/app/templates/components/admin/user/table-row.hbs @@ -29,7 +29,7 @@ {{/if}} {{#if @user.deletable}} - + delete {{/if}} diff --git a/frontend/tests/integration/components/admin/user/deletion-form-test.js b/frontend/tests/integration/components/admin/user/deletion-form-test.js index ddc7084cb..c996e01aa 100644 --- a/frontend/tests/integration/components/admin/user/deletion-form-test.js +++ b/frontend/tests/integration/components/admin/user/deletion-form-test.js @@ -1,18 +1,63 @@ import { module, test } from "qunit"; import { setupRenderingTest } from "ember-qunit"; -import { render } from "@ember/test-helpers"; +import { render, waitFor } from "@ember/test-helpers"; import { hbs } from "ember-cli-htmlbars"; +import Service from "@ember/service"; +import { setLocale } from "ember-intl/test-support"; + + + +const storeStub = Service.extend({ + query(modelName, params) { + return [ + { name: "Team1", description: "description1", destroyRecord: () => {}}, + { name: "Team2", description: "description2", destroyRecord: () => {}} + ]; + } +}); module("Integration | Component | admin/user/deletion-form", function (hooks) { setupRenderingTest(hooks); + + hooks.beforeEach(function () { + this.owner.unregister("service:store"); + this.owner.register("service:store", storeStub); + setLocale("en"); + + }); + test("it renders with block", async function (assert) { await render(hbs` Delete `); - assert.equal(this.element.textContent.trim(), "Delete"); }); + + test("Refreshes teams after delete", async function (assert) { + this.set("user", { + id: 12, + givenname: "Bob", + surname: "Muster", + username: "bob" + }); + + await render(hbs` + + Delete + `); + + this.element.querySelector("span[role='button']").click() + + await waitFor('[data-test-id="delete"]', { timeout: 2000 }) + + + this.element.querySelectorAll('[data-test-id="delete"]').forEach((e) => e.click()); + await waitFor('[data-test-id="delete-user-text"]', { timeout: 2000 }) + + const teamsLeft = this.element.querySelectorAll("[data-test-id='delete']").length + assert.equal(teamsLeft, 0); + }); }); diff --git a/frontend/translations/de.yml b/frontend/translations/de.yml index 160d3138a..7cb1e5649 100644 --- a/frontend/translations/de.yml +++ b/frontend/translations/de.yml @@ -6,8 +6,8 @@ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. de: - fallback: 'ACHTUNG! Dass ist die Cryptopus Fallback Umgebung. Schreiben sie keine neuen Daten da diese nicht erhalten bleiben!' - confirmation: Sind Sie sicher? + fallback: 'ACHTUNG! Dass ist die Cryptopus Fallback Umgebung. Schreibe keine neuen Daten da diese nicht erhalten bleiben!' + confirmation: Bist du sicher? show: Anzeigen edit: Editieren update: Updaten @@ -78,8 +78,8 @@ de: edit: title: Zugangsdaten editieren random_password: Zufälliges Passwort - team_placeholder: Wählen Sie ein Team aus - folder_placeholder: Wählen Sie ein Ordner aus + team_placeholder: Wähle ein Team aus + folder_placeholder: Wähle ein Ordner aus password_strength: Passwort Stärke password_strengths: none: Es ist kein Passwort gesetzt @@ -149,26 +149,26 @@ de: settings: index: whitelisted_countries: Länder Whitelist - whitelisted_countries_prompt: Wählen Sie einige Länder... + whitelisted_countries_prompt: Wähle einige Länder... whitelisted_ips: IP Whitelist - whitelist_ip_prompt: Geben Sie einige IP Adressen an... + whitelist_ip_prompt: Gib einige IP Adressen an... specify_single_ip: Einzelne IP-Adressen können wie folgt eingegeben werden range: specify_range_of_ips: Um eine Spannweite zu definieren kann eine IP-Adresse mit der Subnetzmaske eingegeben werden range_between: Dies entspricht der Spannweite zwischen and: und ipv6_allowed: IPv6 ist erlaubt und kann wie folgt eingegeben werden - geo_ip_disabled: Source IP Filter ist deaktiviert. Bitte installieren Sie GeoIP DB + geo_ip_disabled: Source IP Filter ist deaktiviert. Bitte installiere die GeoIP DB recryptrequests: uncrypterror: - ldap_password_changed: Ihr LDAP Passwort hat sich seit Ihrem letzten Login geändert. - ldap_enter_old_password: Bitte geben Sie Ihr altes LDAP Passwort ein um Ihren privaten Schlüssel zu entschlüsseln. - ldap_old_password: Ihr altes LDAP Passwort - ldap_new_password: Ihr neues LDAP Passwort + ldap_password_changed: Dein LDAP Passwort hat sich seit deinem letzten Login geändert. + ldap_enter_old_password: Bitte gib dein altes LDAP Passwort ein um deinen privaten Schlüssel zu entschlüsseln. + ldap_old_password: Dein altes LDAP Passwort + ldap_new_password: Dein neues LDAP Passwort forgot_password_recrypt: | - Falls Sie Ihr Passwort vergessen haben, werden nur Teams entschlüsselt welche nicht privat sind. + Falls du dein Passwort vergessen haben, werden nur Teams entschlüsselt welche nicht privat sind. Sollten dadurch private Teams entstehen, auf die niemand Zugriff hat, werden diese gelöscht. - Nachdem das Formular abgesendet wurde, müssen Sie warten, bis ein Admin die Anfrage abgearbeitet hat. + Nachdem das Formular abgesendet wurde, musst du warten, bis ein Admin die Anfrage abgearbeitet hat. send: Anfrage senden users: index_menu: @@ -190,6 +190,7 @@ de: last_teammember_teams: message: Folgende Teams in denen der zu löschende User der letzte Member ist müssen gelöscht werden. destroy: Benutzer löschen + confirmation: Bist du sicher, dass du den Benutzer löschen möchten? new: title: Neuer Benutzer @@ -214,9 +215,9 @@ de: title: Anhang zu den Zugangsdaten hinzufügen upload: Hochladen upload_file: Datei hochladen - choose_file: Wählen Sie eine Datei + choose_file: Wähle eine Datei selected_file: Ausgewählte Datei - reupload: Wählen Sie eine andere Datei + reupload: Wähle eine andere Datei session: destroy: @@ -262,7 +263,7 @@ de: api_users: api_users: Api Benutzer no_api_users: keine Api Benutzer - enter_description: Geben Sie eine Beschreibung ein.. + enter_description: Gib eine Beschreibung ein.. valid_until: Gültig bis valid_for: Gültig für last_login: Letztes Login @@ -340,7 +341,7 @@ de: << : *encryptables_translations application: - wait: Bitte warten Sie, bis Ihre Team Passwörter neu verschlüsselt wurden. + wait: Bitte warte, bis deine Team Passwörter neu verschlüsselt wurden. folders: created: Ein neuer Ordner ist erfolgreich erstellt worden. updated: Der Ordner wurde erfolgreich aktualisiert. @@ -361,7 +362,7 @@ de: transfer_failed: Übermittlung der Datei mit dem Empfänger fehlgeschlagen session: auth_failed: Ungültiger Benutzername / Passwort. - weak_password: Um die Sicherheit zu verbessern, sollten Sie ein komplexeres Passwort wählen + weak_password: Um die Sicherheit zu verbessern, solltest du ein komplexeres Passwort wählen wrong_root: Anmeldung als root nur von privater IP aus möglich teams: created: Erfolgreich ein neues Team erstellt. @@ -382,8 +383,8 @@ de: errors: models: user: - new_password_invalid: Ihr neues Passwort war falsch - old_password_invalid: Ihr altes Passwort war falsch + new_password_invalid: Dein neues Passwort war falsch + old_password_invalid: Dein altes Passwort war falsch tooltips: all_teams: Alle Teams diff --git a/frontend/translations/en.yml b/frontend/translations/en.yml index f27e0efcd..637d634a3 100644 --- a/frontend/translations/en.yml +++ b/frontend/translations/en.yml @@ -191,6 +191,7 @@ en: last_teammember_teams: message: Before you can delete this user you have to delete the following teams, because the user is the last member. destroy: Destroy User + confirmation: Are you sure you want to delete this user? new: title: New User diff --git a/public/CHANGELOG.md b/public/CHANGELOG.md index a53a59710..3287018c1 100644 --- a/public/CHANGELOG.md +++ b/public/CHANGELOG.md @@ -1,3 +1,6 @@ +## Version 5.3.1 +- Fix a bug that prevents users from deleting other users. + ## Version 5.3 - Upgrade to Ember 4.12 - Introduce encryptable files for folders