From d15fd1fb84982cdc4275c1f1aaf197aa09b194b1 Mon Sep 17 00:00:00 2001 From: Alex Turchyn Date: Thu, 1 Aug 2024 21:37:42 +0300 Subject: [PATCH] allow to view password during registration --- app/javascript/application.js | 2 ++ app/javascript/elements/password_input.js | 35 +++++++++++++++++++++++ app/views/icons/_eye.html.erb | 5 ++++ app/views/icons/_eye_off.html.erb | 6 ++++ app/views/setup/index.html.erb | 12 +++++++- 5 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 app/javascript/elements/password_input.js create mode 100644 app/views/icons/_eye.html.erb create mode 100644 app/views/icons/_eye_off.html.erb diff --git a/app/javascript/application.js b/app/javascript/application.js index 533cc9c3..2eaba9c4 100644 --- a/app/javascript/application.js +++ b/app/javascript/application.js @@ -24,6 +24,7 @@ import SubmitForm from './elements/submit_form' import PromptPassword from './elements/prompt_password' import EmailsTextarea from './elements/emails_textarea' import ToggleOnSubmit from './elements/toggle_on_submit' +import PasswordInput from './elements/password_input' import * as TurboInstantClick from './lib/turbo_instant_click' @@ -85,6 +86,7 @@ safeRegisterElement('prompt-password', PromptPassword) safeRegisterElement('emails-textarea', EmailsTextarea) safeRegisterElement('toggle-cookies', ToggleCookies) safeRegisterElement('toggle-on-submit', ToggleOnSubmit) +safeRegisterElement('password-input', PasswordInput) safeRegisterElement('template-builder', class extends HTMLElement { connectedCallback () { diff --git a/app/javascript/elements/password_input.js b/app/javascript/elements/password_input.js new file mode 100644 index 00000000..be25740f --- /dev/null +++ b/app/javascript/elements/password_input.js @@ -0,0 +1,35 @@ +import { target, targetable } from '@github/catalyst/lib/targetable' + +export default targetable(class extends HTMLElement { + static [target.static] = [ + 'visiblePasswordIcon', + 'hiddenPasswordIcon', + 'passwordInput', + 'togglePasswordVisibility' + ] + + connectedCallback () { + this.togglePasswordVisibility.addEventListener('click', this.handleTogglePasswordVisibility) + document.addEventListener('turbo:submit-start', this.setInitialPasswordType) + } + + disconnectedCallback () { + this.togglePasswordVisibility.removeEventListener('click', this.handleTogglePasswordVisibility) + document.removeEventListener('turbo:submit-start', this.setInitialPasswordType) + } + + handleTogglePasswordVisibility = () => { + this.passwordInput.type = this.passwordInput.type === 'password' ? 'text' : 'password' + this.toggleIcon() + } + + setInitialPasswordType = () => { + this.passwordInput.type = 'password' + this.toggleIcon() + } + + toggleIcon = () => { + this.visiblePasswordIcon.classList.toggle('hidden', this.passwordInput.type === 'password') + this.hiddenPasswordIcon.classList.toggle('hidden', this.passwordInput.type === 'text') + } +}) diff --git a/app/views/icons/_eye.html.erb b/app/views/icons/_eye.html.erb new file mode 100644 index 00000000..8448da7c --- /dev/null +++ b/app/views/icons/_eye.html.erb @@ -0,0 +1,5 @@ + + + + + diff --git a/app/views/icons/_eye_off.html.erb b/app/views/icons/_eye_off.html.erb new file mode 100644 index 00000000..01bdce02 --- /dev/null +++ b/app/views/icons/_eye_off.html.erb @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/views/setup/index.html.erb b/app/views/setup/index.html.erb index dad5a65c..3ae323f3 100644 --- a/app/views/setup/index.html.erb +++ b/app/views/setup/index.html.erb @@ -34,7 +34,17 @@ <%= fields_for @user do |ff| %>
<%= ff.label :password, class: 'label' %> - <%= ff.password_field :password, required: true, placeholder: '************', class: 'base-input' %> + + <%= ff.password_field :password, required: true, placeholder: '************', class: 'base-input w-full pr-10', data: { target: 'password-input.passwordInput' } %> + +
<% end %> <%= fields_for @encrypted_config do |ff| %>