1<template>
2  <div class="change-password-container mx-auto ml-md-5 mb-3">
3    <alert variant="danger" class="mb-4">
4      <p v-if="changePasswordError">
5        {{ $t('pageChangePassword.changePasswordError') }}
6      </p>
7      <p v-else>{{ $t('pageChangePassword.changePasswordAlertMessage') }}</p>
8    </alert>
9    <dl>
10      <dt>{{ $t('pageChangePassword.username') }}</dt>
11      <dd>{{ username }}</dd>
12    </dl>
13    <b-form novalidate @submit.prevent="changePassword">
14      <b-form-group
15        label-for="password"
16        :label="$t('pageChangePassword.newPassword')"
17      >
18        <input-password-toggle>
19          <b-form-input
20            id="password"
21            v-model="form.password"
22            autofocus="autofocus"
23            type="password"
24            :state="getValidationState($v.form.password)"
25            class="form-control-with-button"
26            @change="$v.form.password.$touch()"
27          >
28          </b-form-input>
29          <b-form-invalid-feedback role="alert">
30            <template v-if="!$v.form.password.required">
31              {{ $t('global.form.fieldRequired') }}
32            </template>
33          </b-form-invalid-feedback>
34        </input-password-toggle>
35      </b-form-group>
36      <b-form-group
37        label-for="password-confirm"
38        :label="$t('pageChangePassword.confirmNewPassword')"
39      >
40        <input-password-toggle>
41          <b-form-input
42            id="password-confirm"
43            v-model="form.passwordConfirm"
44            type="password"
45            :state="getValidationState($v.form.passwordConfirm)"
46            class="form-control-with-button"
47            @change="$v.form.passwordConfirm.$touch()"
48          >
49          </b-form-input>
50          <b-form-invalid-feedback role="alert">
51            <template v-if="!$v.form.passwordConfirm.required">
52              {{ $t('global.form.fieldRequired') }}
53            </template>
54            <template v-else-if="!$v.form.passwordConfirm.sameAsPassword">
55              {{ $t('global.form.passwordsDoNotMatch') }}
56            </template>
57          </b-form-invalid-feedback>
58        </input-password-toggle>
59      </b-form-group>
60      <div class="text-right">
61        <b-button type="button" variant="link" @click="goBack">
62          {{ $t('pageChangePassword.goBack') }}
63        </b-button>
64        <b-button type="submit" variant="primary">
65          {{ $t('pageChangePassword.changePassword') }}
66        </b-button>
67      </div>
68    </b-form>
69  </div>
70</template>
71
72<script>
73import { required, sameAs } from 'vuelidate/lib/validators';
74import Alert from '@/components/Global/Alert';
75import VuelidateMixin from '@/components/Mixins/VuelidateMixin';
76import InputPasswordToggle from '@/components/Global/InputPasswordToggle';
77import BVToastMixin from '@/components/Mixins/BVToastMixin';
78
79export default {
80  name: 'ChangePassword',
81  components: { Alert, InputPasswordToggle },
82  mixins: [VuelidateMixin, BVToastMixin],
83  data() {
84    return {
85      form: {
86        password: null,
87        passwordConfirm: null
88      },
89      username: this.$store.getters['global/username'],
90      changePasswordError: false
91    };
92  },
93  validations() {
94    return {
95      form: {
96        password: { required },
97        passwordConfirm: {
98          required,
99          sameAsPassword: sameAs('password')
100        }
101      }
102    };
103  },
104  methods: {
105    goBack() {
106      // Remove session created if navigating back to the Login page
107      this.$store.dispatch('authentication/logout');
108    },
109    changePassword() {
110      this.$v.$touch();
111      if (this.$v.$invalid) return;
112      let data = {
113        originalUsername: this.username,
114        password: this.form.password
115      };
116
117      this.$store
118        .dispatch('localUsers/updateUser', data)
119        .then(() => this.$router.push('/'))
120        .catch(() => (this.changePasswordError = true));
121    }
122  }
123};
124</script>
125
126<style lang="scss" scoped>
127.change-password-container {
128  max-width: 360px;
129}
130</style>
131