blob: db475c56235e15696520cbfa001f6e7bb21f0201 [file] [log] [blame]
<template>
<b-form class="login-form" novalidate @submit.prevent="login">
<alert class="login-error mb-4" :show="authError" variant="danger">
<p id="login-error-alert">
{{ $t('pageLogin.alert.message') }}
</p>
</alert>
<b-form-group label-for="language" :label="$t('pageLogin.language')">
<b-form-select
id="language"
v-model="$i18n.locale"
:options="languages"
data-test-id="login-select-language"
></b-form-select>
</b-form-group>
<b-form-group label-for="username" :label="$t('pageLogin.username')">
<b-form-input
id="username"
v-model="userInfo.username"
aria-describedby="login-error-alert username-required"
:state="getValidationState($v.userInfo.username)"
type="text"
autofocus="autofocus"
data-test-id="login-input-username"
@input="$v.userInfo.username.$touch()"
>
</b-form-input>
<b-form-invalid-feedback id="username-required" role="alert">
<template v-if="!$v.userInfo.username.required">
{{ $t('global.form.fieldRequired') }}
</template>
</b-form-invalid-feedback>
</b-form-group>
<div class="login-form__section mb-3">
<label for="password">{{ $t('pageLogin.password') }}</label>
<input-password-toggle>
<b-form-input
id="password"
v-model="userInfo.password"
aria-describedby="login-error-alert password-required"
:state="getValidationState($v.userInfo.password)"
type="password"
data-test-id="login-input-password"
class="form-control-with-button"
@input="$v.userInfo.password.$touch()"
>
</b-form-input>
</input-password-toggle>
<b-form-invalid-feedback id="password-required" role="alert">
<template v-if="!$v.userInfo.password.required">
{{ $t('global.form.fieldRequired') }}
</template>
</b-form-invalid-feedback>
</div>
<b-button
class="mt-3"
type="submit"
variant="primary"
data-test-id="login-button-submit"
:disabled="disableSubmitButton"
>{{ $t('pageLogin.logIn') }}</b-button
>
</b-form>
</template>
<script>
import { required } from 'vuelidate/lib/validators';
import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js';
import i18n from '@/i18n';
import Alert from '@/components/Global/Alert';
import InputPasswordToggle from '@/components/Global/InputPasswordToggle';
export default {
name: 'Login',
components: { Alert, InputPasswordToggle },
mixins: [VuelidateMixin],
data() {
return {
userInfo: {
username: null,
password: null,
},
disableSubmitButton: false,
languages: [
{
value: 'en-US',
text: 'English',
},
{
value: 'ru-RU',
text: 'Русский',
},
],
};
},
computed: {
authError() {
return this.$store.getters['authentication/authError'];
},
},
validations: {
userInfo: {
username: {
required,
},
password: {
required,
},
},
},
methods: {
login: function () {
this.$v.$touch();
if (this.$v.$invalid) return;
this.disableSubmitButton = true;
const username = this.userInfo.username;
const password = this.userInfo.password;
this.$store
.dispatch('authentication/login', { username, password })
.then(() => {
localStorage.setItem('storedLanguage', i18n.locale);
localStorage.setItem('storedUsername', username);
this.$store.commit('global/setUsername', username);
this.$store.commit('global/setLanguagePreference', i18n.locale);
return this.$store.dispatch('authentication/getUserInfo', username);
})
.then(({ PasswordChangeRequired }) => {
if (PasswordChangeRequired) {
this.$router.push('/change-password');
} else {
this.$router.push('/');
}
})
.catch((error) => console.log(error))
.finally(() => (this.disableSubmitButton = false));
},
},
};
</script>