web/flows: add workaround for autofocus not working in password stage
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
		| @ -26,6 +26,42 @@ export class PasswordStage extends BaseStage<PasswordChallenge, PasswordChalleng | ||||
|         return [PFBase, PFLogin, PFForm, PFFormControl, PFButton, PFTitle, AKGlobal]; | ||||
|     } | ||||
|  | ||||
|     input?: HTMLInputElement; | ||||
|  | ||||
|     timer?: number; | ||||
|  | ||||
|     renderInput(): HTMLInputElement { | ||||
|         this.input = document.createElement("input"); | ||||
|         this.input.type = "password"; | ||||
|         this.input.name = "password"; | ||||
|         this.input.placeholder = t`Please enter your password`; | ||||
|         this.input.autofocus = true; | ||||
|         this.input.autocomplete = "current-password"; | ||||
|         this.input.classList.add("pf-c-form-control"); | ||||
|         this.input.required = true; | ||||
|         this.input.value = PasswordManagerPrefill.password || ""; | ||||
|         // This is somewhat of a crude way to get autofocus, but in most cases the `autofocus` attribute | ||||
|         // isn't enough, due to timing within shadow doms and such. | ||||
|         this.timer = window.setInterval(() => { | ||||
|             if (!this.input) { | ||||
|                 return; | ||||
|             } | ||||
|             if (document.activeElement === this.input) { | ||||
|                 this.cleanup(); | ||||
|             } | ||||
|             this.input.focus(); | ||||
|         }, 10); | ||||
|         console.debug("authentik/stages/password: started focus timer"); | ||||
|         return this.input; | ||||
|     } | ||||
|  | ||||
|     cleanup(): void { | ||||
|         if (this.timer) { | ||||
|             console.debug("authentik/stages/password: cleared focus timer"); | ||||
|             window.clearInterval(this.timer); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     render(): TemplateResult { | ||||
|         if (!this.challenge) { | ||||
|             return html`<ak-empty-state ?loading="${true}" header=${t`Loading`}> </ak-empty-state>`; | ||||
| @ -63,16 +99,7 @@ export class PasswordStage extends BaseStage<PasswordChallenge, PasswordChalleng | ||||
|                         class="pf-c-form__group" | ||||
|                         .errors=${(this.challenge?.responseErrors || {})["password"]} | ||||
|                     > | ||||
|                         <input | ||||
|                             type="password" | ||||
|                             name="password" | ||||
|                             placeholder="${t`Please enter your password`}" | ||||
|                             autofocus="" | ||||
|                             autocomplete="current-password" | ||||
|                             class="pf-c-form-control" | ||||
|                             required | ||||
|                             value=${PasswordManagerPrefill.password || ""} | ||||
|                         /> | ||||
|                         ${this.renderInput()} | ||||
|                     </ak-form-element> | ||||
|  | ||||
|                     ${this.challenge.recoveryUrl | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Jens Langhammer
					Jens Langhammer