This commit is contained in:
Reto 2024-04-28 22:35:13 +02:00 committed by GitHub
commit 308c9381ad
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 84 additions and 124 deletions

View file

@ -58,19 +58,11 @@
<div class="connect-row">
<label for="connect:password">Password</label>
<RevealPassword
v-slot:default="slotProps"
class="input-wrap password-container"
>
<input
id="connect:password"
v-model="defaults.password"
class="input"
:type="slotProps.isVisible ? 'text' : 'password'"
placeholder="Server password (optional)"
name="password"
maxlength="300"
/>
</RevealPassword>
id="connect:password"
v-model:password="defaults.password"
name="password"
placeholder="Server password (optional)"
/>
</div>
<div class="connect-row">
<label></label>
@ -158,20 +150,12 @@
<div class="connect-row">
<label for="connect:proxyPassword">Proxy password</label>
<RevealPassword
v-slot:default="slotProps"
class="input-wrap password-container"
>
<input
id="connect:proxyPassword"
ref="proxyPassword"
v-model="defaults.proxyPassword"
class="input"
:type="slotProps.isVisible ? 'text' : 'password'"
placeholder="Proxy password"
name="proxyPassword"
maxlength="300"
/>
</RevealPassword>
id="connect:proxyPassword"
ref="proxyPassword"
v-model:password="defaults.proxyPassword"
name="proxyPassword"
placeholder="Proxy password"
/>
</div>
</template>
</template>
@ -190,19 +174,11 @@
<div class="connect-row">
<label for="connect:password">Password</label>
<RevealPassword
v-slot:default="slotProps"
class="input-wrap password-container"
>
<input
id="connect:password"
v-model="defaults.password"
class="input"
:type="slotProps.isVisible ? 'text' : 'password'"
placeholder="Server password (optional)"
name="password"
maxlength="300"
/>
</RevealPassword>
id="connect:password"
v-model:password="defaults.password"
placeholder="Server password (optional)"
name="password"
/>
</div>
</template>
@ -304,20 +280,12 @@ the server tab on new connection"
<div v-if="displayPasswordField" class="connect-row">
<label for="connect:password">Password</label>
<RevealPassword
v-slot:default="slotProps"
class="input-wrap password-container"
>
<input
id="connect:password"
ref="publicPassword"
v-model="defaults.password"
class="input"
:type="slotProps.isVisible ? 'text' : 'password'"
placeholder="Server password (optional)"
name="password"
maxlength="300"
/>
</RevealPassword>
id="connect:password"
ref="publicPassword"
v-model:password="defaults.password"
placeholder="Server password (optional)"
name="password"
/>
</div>
</template>
</template>
@ -374,19 +342,12 @@ the server tab on new connection"
<div class="connect-row">
<label for="connect:password">Password</label>
<RevealPassword
v-slot:default="slotProps"
class="input-wrap password-container"
>
<input
id="connect:saslPassword"
v-model="defaults.saslPassword"
class="input"
:type="slotProps.isVisible ? 'text' : 'password'"
name="saslPassword"
maxlength="300"
required
/>
</RevealPassword>
id="connect:saslPassword"
v-model:password="defaults.saslPassword"
class="input"
name="saslPassword"
required
/>
</div>
</template>
<div v-else-if="defaults.sasl === 'external'" class="connect-sasl-external">

View file

@ -1,6 +1,5 @@
<template>
<div>
<slot :is-visible="isVisible" />
<div class="password-container">
<span
ref="revealButton"
type="button"
@ -13,14 +12,37 @@
>
<span :aria-label="isVisible ? 'Hide password' : 'Show password'" />
</span>
<input
:value="password"
:type="isVisible ? 'text' : 'password'"
v-bind="$attrs"
class="input"
autocapitalize="none"
autocorrect="off"
maxlength="300"
@input="$emit('update:password', ($event.target as HTMLInputElement).value || '')"
/>
</div>
</template>
<style scoped>
.password-container {
width: 100%; /* we pretty much always want to expand to the full space here, so let's default to that*/
}
</style>
<script lang="ts">
import {defineComponent, ref} from "vue";
export default defineComponent({
name: "RevealPassword",
inheritAttrs: false, // we pass those all to the input field
props: {
password: String,
},
emits: {
"update:password": String, // this makes v-model:password magically update the reactive container if the input changes
},
setup() {
const isVisible = ref(false);

View file

@ -10,47 +10,35 @@
aria-labelledby="label-change-password"
>
<h2 id="label-change-password">Change password</h2>
<div class="password-container">
<div>
<label for="current-password" class="sr-only"> Enter current password </label>
<RevealPassword v-slot:default="slotProps">
<input
id="current-password"
v-model="old_password"
autocomplete="current-password"
:type="slotProps.isVisible ? 'text' : 'password'"
name="old_password"
class="input"
placeholder="Enter current password"
/>
</RevealPassword>
<RevealPassword
id="current-password"
v-model:password="old_password"
autocomplete="current-password"
name="old_password"
placeholder="Enter current password"
/>
</div>
<div class="password-container">
<div>
<label for="new-password" class="sr-only"> Enter desired new password </label>
<RevealPassword v-slot:default="slotProps">
<input
id="new-password"
v-model="new_password"
:type="slotProps.isVisible ? 'text' : 'password'"
name="new_password"
autocomplete="new-password"
class="input"
placeholder="Enter desired new password"
/>
</RevealPassword>
<RevealPassword
id="new-password"
v-model:password="new_password"
name="new_password"
autocomplete="new-password"
placeholder="Enter desired new password"
/>
</div>
<div class="password-container">
<div>
<label for="new-password-verify" class="sr-only"> Repeat new password </label>
<RevealPassword v-slot:default="slotProps">
<input
id="new-password-verify"
v-model="verify_password"
:type="slotProps.isVisible ? 'text' : 'password'"
name="verify_password"
autocomplete="new-password"
class="input"
placeholder="Repeat new password"
/>
</RevealPassword>
<RevealPassword
id="new-password-verify"
v-model:password="verify_password"
name="verify_password"
autocomplete="new-password"
placeholder="Repeat new password"
/>
</div>
<div
v-if="passwordChangeStatus && passwordChangeStatus.success"

View file

@ -30,21 +30,14 @@
autofocus
/>
<div class="password-container">
<label for="signin-password">Password</label>
<RevealPassword v-slot:default="slotProps">
<input
id="signin-password"
v-model="password"
:type="slotProps.isVisible ? 'text' : 'password'"
class="input"
autocapitalize="none"
autocorrect="off"
autocomplete="current-password"
required
/>
</RevealPassword>
</div>
<label for="signin-password">Password</label>
<RevealPassword
id="signin-password"
v-model:password="password"
name="password"
autocomplete="current-password"
required
/>
<div v-if="errorShown" class="error">Authentication failed.</div>

View file

@ -2015,10 +2015,6 @@ part/quit messages where we don't load previews (adds a blank line otherwise) */
width: 100%;
}
#sign-in .password-container .reveal-password {
top: 31px;
}
.password-container .reveal-password {
position: absolute;
top: 2px;