%(name)s
.\n"
+" "
msgstr ""
"\n"
-"Bonjour %(username)s,"
+" Cet email a été envoyé depuis le transport de notification %(name)s
.\n"
+" "
-#: authentik/stages/email/templates/email/password_reset.html:19
+#: authentik/stages/email/templates/email/password_reset.html:10
+#, python-format
msgid ""
"\n"
-" You recently requested to change your password for your authentik account. Use the button below to set a new password.\n"
-" "
+" Hi %(username)s,\n"
+" "
msgstr ""
"\n"
-" Vous avez récemment demandé à changer le mot de passe de votre compte authentik. Utilisez le bouton ci-dessous pour définir un nouveau mot de passe.\n"
-" "
+" Salut %(username)s,\n"
+" "
-#: authentik/stages/email/templates/email/password_reset.html:33
+#: authentik/stages/email/templates/email/password_reset.html:21
+msgid ""
+"\n"
+" You recently requested to change your password for your authentik account. Use the button below to set a new password.\n"
+" "
+msgstr ""
+"\n"
+" Vous avez récemment demandé à changer le mot de passe de votre compte authentik. Utilisez le bouton ci-dessous pour définir un nouveau mot de passe.\n"
+" "
+
+#: authentik/stages/email/templates/email/password_reset.html:28
msgid "Reset Password"
msgstr "Réinitialiser le mot de passe"
-#: authentik/stages/email/templates/email/password_reset.html:45
+#: authentik/stages/email/templates/email/password_reset.html:39
#, python-format
msgid ""
"\n"
-" If you did not request a password change, please ignore this Email. The link above is valid for %(expires)s.\n"
-" "
+" If you did not request a password change, please ignore this Email. The link above is valid for %(expires)s.\n"
+" "
msgstr ""
"\n"
-" Si vous n'avez pas requis de changement de mot de passe, veuillez ignorer cet e-mail. Le lien ci-dessus est valide pendant %(expires)s.\n"
-" "
+" Si vous n'avez pas requis de changement de mot de passe, veuillez ignorer cet e-mail. Le lien ci-dessus est valide pendant %(expires)s.\n"
+" "
#: authentik/stages/email/templates/email/setup.html:9
msgid "authentik Test-Email"
diff --git a/locale/nl/LC_MESSAGES/django.po b/locale/nl/LC_MESSAGES/django.po
index d4bdf371a..4047b1c06 100644
--- a/locale/nl/LC_MESSAGES/django.po
+++ b/locale/nl/LC_MESSAGES/django.po
@@ -2,14 +2,14 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR ${msg( - "Use this provider with nginx's auth_request or traefik's forwardAuth. Each application/domain needs its own provider. Additionally, on each domain, /outpost.goauthentik.io must be routed to the outpost (when using a manged outpost, this is done for you).", + "Use this provider with nginx's auth_request or traefik's forwardAuth. Each application/domain needs its own provider. Additionally, on each domain, /outpost.goauthentik.io must be routed to the outpost (when using a managed outpost, this is done for you).", )}
${this.help}
` : nothing} diff --git a/web/src/components/ak-slug-input.ts b/web/src/components/ak-slug-input.ts index b236df9c0..f6492a321 100644 --- a/web/src/components/ak-slug-input.ts +++ b/web/src/components/ak-slug-input.ts @@ -83,40 +83,46 @@ export class AkSlugInput extends AKElement { } slugify(ev: Event) { + if (!(ev && ev.target && ev.target instanceof HTMLInputElement)) { + return; + } + + // Reset 'touched' status if the slug & target have been reset + if (ev.target.value === "" && this.input.value === "") { + this.touched = false; + } + + // Don't proceed if the user has hand-modified the slug + if (this.touched) { + return; + } + // A very primitive heuristic: if the previous iteration of the slug and the current // iteration are *similar enough*, set the input value. "Similar enough" here is defined as // "any event which adds or removes a character but leaves the rest of the slug looking like // the previous iteration, set it to the current iteration." - if (ev && ev.target && ev.target instanceof HTMLInputElement) { - if (this.touched) { - if (ev.target.value === "" && this.input.value === "") { - this.touched = false; - } else { - return; - } - } + const newSlug = convertToSlug(ev.target.value); + const oldSlug = this.input.value; + const [shorter, longer] = + newSlug.length < oldSlug.length ? [newSlug, oldSlug] : [oldSlug, newSlug]; - const newSlug = convertToSlug(ev.target.value); - const oldSlug = this.input.value; - const [shorter, longer] = - newSlug.length < oldSlug.length ? [newSlug, oldSlug] : [oldSlug, newSlug]; - if (longer.substring(0, shorter.length) === shorter) { - this.input.value = newSlug; - - // The browser, as a security measure, sets the originating HTML object to be the - // target; developers cannot change it. In order to provide a meaningful value - // to listeners, both the name and value of the host must match those of the target - // input. The name is already handled since it's both required and automatically - // forwarded to our templated input, but the value must also be set. - this.value = this.input.value; - this.dispatchEvent( - new Event("input", { - bubbles: true, - cancelable: true, - }), - ); - } + if (longer.substring(0, shorter.length) !== shorter) { + return; } + + // The browser, as a security measure, sets the originating HTML object to be the + // target; developers cannot change it. In order to provide a meaningful value + // to listeners, both the name and value of the host must match those of the target + // input. The name is already handled since it's both required and automatically + // forwarded to our templated input, but the value must also be set. + + this.value = this.input.value = newSlug; + this.dispatchEvent( + new Event("input", { + bubbles: true, + cancelable: true, + }), + ); } connectedCallback() { @@ -160,3 +166,5 @@ export class AkSlugInput extends AKElement {Event: ${
"result" in result.detail ? result.detail.result.key : result.detail.error
diff --git a/web/src/elements/forms/Radio.ts b/web/src/elements/forms/Radio.ts
index 3d82ca4cb..27fbdf0b9 100644
--- a/web/src/elements/forms/Radio.ts
+++ b/web/src/elements/forms/Radio.ts
@@ -9,6 +9,8 @@ import PFForm from "@patternfly/patternfly/components/Form/form.css";
import PFRadio from "@patternfly/patternfly/components/Radio/radio.css";
import PFBase from "@patternfly/patternfly/patternfly-base.css";
+import { randomId } from "../utils/randomId";
+
export interface RadioOption