fix: refs #7699 add icons and hint #1123

Merged
alexm merged 18 commits from 7699-refactroViewPassword into dev 2025-01-08 13:20:17 +00:00
11 changed files with 61 additions and 45 deletions

View File

@ -2,9 +2,9 @@
import { ref } from 'vue';
import { useI18n } from 'vue-i18n';
import VnRow from '../ui/VnRow.vue';
import VnInput from './VnInput.vue';
import FetchData from '../FetchData.vue';
import useNotify from 'src/composables/useNotify';
import VnInputPassword from 'src/components/common/VnInputPassword.vue';
const props = defineProps({
submitFn: { type: Function, default: () => {} },
@ -70,19 +70,19 @@ defineExpose({ show: () => changePassDialog.value.show() });
</QCardSection>
<QForm ref="form">
<QCardSection>
<VnInput
<VnInputPassword
v-if="props.askOldPass"
:label="t('Old password')"
v-model="passwords.oldPassword"
type="password"
:required="true"
:toggle-visibility="true"
autofocus
/>
<VnInput
<VnInputPassword
:label="t('New password')"
v-model="passwords.newPassword"
type="password"
:required="true"
:toggle-visibility="true"
:info="
t('passwordRequirements', {
length: requirements.length,
@ -95,10 +95,10 @@ defineExpose({ show: () => changePassDialog.value.show() });
autofocus
/>
<VnInput
<VnInputPassword
:label="t('Repeat password')"
v-model="passwords.repeatPassword"
type="password"
:toggle-visibility="true"
/>
</QCardSection>
</QForm>

View File

@ -45,6 +45,7 @@ const $props = defineProps({
});
carlossa marked this conversation as resolved Outdated

Se podria hacer con $attrs en vez de añadir prop, no?

Se podria hacer con $attrs en vez de añadir prop, no?
const vnInputRef = ref(null);
const showPassword = ref(false);
const value = computed({
get() {
return $props.modelValue;
@ -134,7 +135,7 @@ const handleInsertMode = (e) => {
hide-bottom-space
:data-cy="$attrs.dataCy ?? $attrs.label + '_input'"
>
<template v-if="$slots.prepend" #prepend>
<template #prepend>
jsegarra marked this conversation as resolved
Review

ojo, que creo que nos hemos llevado cosas por delante, me refiero que hemos quitado código de dev, es intencional?

ojo, que creo que nos hemos llevado cosas por delante, me refiero que hemos quitado código de dev, es intencional?
Review

<slot name="prepend" />
</template>
<template #append>
@ -158,7 +159,7 @@ const handleInsertMode = (e) => {
emit('remove');
carlossa marked this conversation as resolved Outdated

}
"
></QIcon>
/>
<slot name="append" v-if="$slots.append && !$attrs.disabled" />
<QIcon v-if="info" name="info">
<QTooltip max-width="350px">
@ -169,18 +170,3 @@ const handleInsertMode = (e) => {
</QInput>
carlossa marked this conversation as resolved Outdated

ojo, que creo que nos hemos llevado cosas por delante, me refiero que hemos quitado código de dev, es intencional?

ojo, que creo que nos hemos llevado cosas por delante, me refiero que hemos quitado código de dev, es intencional?
</div>
</template>
<i18n>
en:
inputMin: Must be more than {value}
maxLength: The value exceeds {value} characters
inputMax: Must be less than {value}
es:
inputMin: Debe ser mayor a {value}
maxLength: El valor excede los {value} carácteres
inputMax: Debe ser menor a {value}
</i18n>
<style lang="scss">
.q-field__append {
padding-inline: 0;
}
</style>

View File

@ -0,0 +1,31 @@
<script setup>
import VnInput from 'src/components/common/VnInput.vue';
import { ref } from 'vue';
const model = defineModel({ type: [Number, String] });
const $props = defineProps({
toggleVisibility: {
type: Boolean,
default: false,
},
carlossa marked this conversation as resolved
Review

Si eliminamos la prop.modelValue, esto podría ser un attr, no?
Quedaría mas limpio, no?

Si eliminamos la prop.modelValue, esto podría ser un attr, no? Quedaría mas limpio, no?
});
const showPassword = ref(false);
</script>
<template>
<VnInput
v-bind="{ ...$attrs }"
carlossa marked this conversation as resolved
Review

Si ya tenemos defineModel porque nos hace falta la props de modelValue?

Si ya tenemos defineModel porque nos hace falta la props de modelValue?
Review

Bueno, seria al reves 😅

Bueno, seria al reves 😅
v-model="model"
:type="
$props.toggleVisibility ? (showPassword ? 'text' : 'password') : $attrs.type
"
>
<template #append v-if="toggleVisibility">
<QIcon
:name="showPassword ? 'visibility_off' : 'visibility'"
class="cursor-pointer"
Review

Si lo quitamos, afectaría algo?

Si lo quitamos, afectaría algo?
@click="showPassword = !showPassword"
/>
</template>
</VnInput>
</template>

View File

@ -6,6 +6,7 @@ import FormModelPopup from 'components/FormModelPopup.vue';
import VnSelect from 'src/components/common/VnSelect.vue';
import FetchData from 'components/FetchData.vue';
import VnInput from 'src/components/common/VnInput.vue';
import VnInputPassword from 'src/components/common/VnInputPassword.vue';
const { t } = useI18n();
const router = useRouter();
@ -61,10 +62,10 @@ const redirectToAccountBasicData = (_, { id }) => {
hide-selected
:rules="validate('VnUser.roleFk')"
/>
<VnInput
<VnInputPassword
v-model="data.password"
:label="t('ldap.password')"
type="password"
:toggle-visibility="true"
:rules="validate('VnUser.password')"
/>
<QCheckbox

View File

@ -8,6 +8,7 @@ import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
import { useArrayData } from 'src/composables/useArrayData';
import useNotify from 'src/composables/useNotify.js';
import axios from 'axios';
import VnInputPassword from 'src/components/common/VnInputPassword.vue';
const { t } = useI18n();
const { notify } = useNotify();
@ -128,10 +129,9 @@ onMounted(async () => await getInitialLdapConfig());
:required="true"
:rules="validate('LdapConfig.rdn')"
/>
<VnInput
<VnInputPassword
:label="t('ldap.password')"
clearable
type="password"
v-model="data.password"
:required="true"
:rules="validate('LdapConfig.password')"

View File

@ -4,9 +4,9 @@ import { computed, ref } from 'vue';
import VnTable from 'components/VnTable/VnTable.vue';
import AccountSummary from './Card/AccountSummary.vue';
import { useSummaryDialog } from 'src/composables/useSummaryDialog';
import VnInput from 'src/components/common/VnInput.vue';
import VnSection from 'src/components/common/VnSection.vue';
import FetchData from 'src/components/FetchData.vue';
import VnInputPassword from 'src/components/common/VnInputPassword.vue';
const { t } = useI18n();
const { viewSummary } = useSummaryDialog();
@ -168,10 +168,9 @@ function exprBuilder(param, value) {
>
<template #more-create-dialog="{ data }">
<QCardSection>
<VnInput
<VnInputPassword
:label="t('Password')"
v-model="data.password"
type="password"
:required="true"
autocomplete="new-password"
/>

View File

@ -8,6 +8,7 @@ import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
import { useArrayData } from 'src/composables/useArrayData';
import useNotify from 'src/composables/useNotify.js';
import axios from 'axios';
import VnInputPassword from 'src/components/common/VnInputPassword.vue';
const { t } = useI18n();
const { notify } = useNotify();
@ -143,10 +144,9 @@ onMounted(async () => await getInitialSambaConfig());
v-model="data.adUser"
:rules="validate('SambaConfigs.adUser')"
/>
<VnInput
<VnInputPassword
:label="t('samba.passwordAD')"
clearable
type="password"
v-model="data.adPassword"
/>
<VnInput

View File

@ -9,6 +9,7 @@ import { useArrayData } from 'src/composables/useArrayData';
import VnConfirm from 'src/components/ui/VnConfirm.vue';
import VnChangePassword from 'src/components/common/VnChangePassword.vue';
import { useQuasar } from 'quasar';
import VnInputPassword from 'src/components/common/VnInputPassword.vue';
const $props = defineProps({
hasAccount: {
@ -97,14 +98,13 @@ async function sync() {
<QTooltip>{{ t('account.card.actions.sync.tooltip') }}</QTooltip>
</QIcon></QCheckbox
>
<QInput
<VnInputPassword
v-if="shouldSyncPassword"
:label="t('login.password')"
v-model="syncPassword"
class="full-width"
clearable
clear-icon="close"
type="password"
/>
</template>
</VnConfirm>

View File

@ -3,7 +3,7 @@ import { ref } from 'vue';
import { Notify } from 'quasar';
import { useI18n } from 'vue-i18n';
import { useRouter } from 'vue-router';
import VnInputPassword from 'src/components/common/VnInputPassword.vue';
import { useSession } from 'src/composables/useSession';
import { useLogin } from 'src/composables/useLogin';
@ -63,11 +63,10 @@ async function onSubmit() {
:rules="[(val) => (val && val.length > 0) || t('login.fieldRequired')]"
color="primary"
/>
<VnInput
type="password"
<VnInputPassword
v-model="password"
:label="t('login.password')"
lazy-rules
:toggle-visibility="true"
:rules="[(val) => (val && val.length > 0) || t('login.fieldRequired')]"
class="red"
/>

View File

@ -7,6 +7,7 @@ import axios from 'axios';
import VnInput from 'components/common/VnInput.vue';
import VnOutForm from 'components/ui/VnOutForm.vue';
import VnInputPassword from 'src/components/common/VnInputPassword.vue';
const quasar = useQuasar();
const router = useRouter();
@ -54,8 +55,7 @@ async function onSubmit() {
<template>
<VnOutForm @submit="onSubmit" :title="t('globals.pageTitles.resetPassword')">
<template #default>
<VnInput
type="password"
<VnInputPassword
:label="t('login.password')"
v-model="newPassword"
:info="
@ -72,9 +72,8 @@ async function onSubmit() {
<template #prepend>
<QIcon name="password" />
</template>
</VnInput>
<VnInput
type="password"
</VnInputPassword>
<VnInputPassword
:label="t('resetPassword.repeatPassword')"
v-model="repeatPassword"
required
@ -82,7 +81,7 @@ async function onSubmit() {
<template #prepend>
jsegarra marked this conversation as resolved
Review

Es correcto que esté este icono?

Es correcto que esté este icono?
Review

<QIcon name="password" />
</template>
</VnInput>
</VnInputPassword>
</template>
<template #buttons>
<QBtn

View File

@ -19,6 +19,7 @@ describe('Login', () => {
it('should fail to log in using wrong password', () => {
cy.get('input[aria-label="Username"]').type('employee');
cy.get('input[aria-label="Password"]').type('wrongPassword');
cy.get('.q-field__append > .q-icon');
jsegarra marked this conversation as resolved
Review

Esta linea es para que el test no falle o que aporta? Quiero decir, sobre el elemento no se hace ninguna accion no?

Esta linea es para que el test no falle o que aporta? Quiero decir, sobre el elemento no se hace ninguna accion no?
Review

Comprobar que esta por lo tanto lo pulsa

Comprobar que esta por lo tanto lo pulsa
cy.get('button[type="submit"]').click();
cy.get('.q-notification__message').should(
'have.text',