blob: 561816e00b03d7c3dff9dfc09013a9b57b674bdf [file] [log] [blame]
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +05301<template>
2 <b-container fluid="xl">
3 <page-title />
4
5 <b-row>
6 <b-col md="8" lg="8" xl="6">
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +05307 <page-section
8 :section-title="$t('pageProfileSettings.profileInfoTitle')"
9 >
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053010 <dl>
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +053011 <dt>{{ $t('pageProfileSettings.username') }}</dt>
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053012 <dd>
13 {{ username }}
14 </dd>
15 </dl>
16 </page-section>
17 </b-col>
18 </b-row>
19
20 <b-form @submit.prevent="submitForm">
21 <b-row>
22 <b-col sm="8" md="6" xl="3">
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +053023 <page-section
24 :section-title="$t('pageProfileSettings.changePassword')"
25 >
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053026 <b-form-group
Damian Celicobcb0ab42022-08-23 03:18:58 +020027 id="input-group-0"
28 :label="$t('pageProfileSettings.currentPassword')"
29 label-for="input-0"
30 >
31 <input-password-toggle>
32 <b-form-input
33 id="old-password"
34 v-model="form.currentPassword"
35 type="password"
36 data-test-id="profileSettings-input-ocurrentPassword"
37 class="form-control-with-button"
38 />
39 </input-password-toggle>
40 </b-form-group>
41 <b-form-group
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053042 id="input-group-1"
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +053043 :label="$t('pageProfileSettings.newPassword')"
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053044 label-for="input-1"
45 >
46 <b-form-text id="password-help-block">
47 {{
Sandeepa Singhb4406162021-07-26 15:05:39 +053048 $t('pageUserManagement.modal.passwordMustBeBetween', {
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053049 min: passwordRequirements.minLength,
Derick Montague602e98a2020-10-21 16:20:00 -050050 max: passwordRequirements.maxLength,
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053051 })
52 }}
53 </b-form-text>
54 <input-password-toggle>
55 <b-form-input
56 id="password"
57 v-model="form.newPassword"
58 type="password"
59 aria-describedby="password-help-block"
Surya Vde23ea22024-07-11 15:19:46 +053060 :state="getValidationState(v$.form.newPassword)"
Sukanya Pandey4334d262020-07-29 11:12:06 +053061 data-test-id="profileSettings-input-newPassword"
Dixsie Wolmers5ea16782020-07-27 17:50:43 -050062 class="form-control-with-button"
Surya Vde23ea22024-07-11 15:19:46 +053063 @input="v$.form.newPassword.$touch()"
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053064 />
65 <b-form-invalid-feedback role="alert">
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053066 <template
67 v-if="
Surya Venkatesan69be8242024-09-23 19:55:06 +053068 v$.form.newPassword.minLength.$invalid ||
69 v$.form.newPassword.maxLength.$invalid
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053070 "
71 >
72 {{
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +053073 $t('pageProfileSettings.newPassLabelTextInfo', {
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053074 min: passwordRequirements.minLength,
Derick Montague602e98a2020-10-21 16:20:00 -050075 max: passwordRequirements.maxLength,
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053076 })
77 }}
78 </template>
79 </b-form-invalid-feedback>
80 </input-password-toggle>
81 </b-form-group>
82 <b-form-group
83 id="input-group-2"
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +053084 :label="$t('pageProfileSettings.confirmPassword')"
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053085 label-for="input-2"
86 >
87 <input-password-toggle>
88 <b-form-input
89 id="password-confirmation"
90 v-model="form.confirmPassword"
91 type="password"
Surya Vde23ea22024-07-11 15:19:46 +053092 :state="getValidationState(v$.form.confirmPassword)"
Sukanya Pandey4334d262020-07-29 11:12:06 +053093 data-test-id="profileSettings-input-confirmPassword"
Dixsie Wolmers5ea16782020-07-27 17:50:43 -050094 class="form-control-with-button"
Surya Vde23ea22024-07-11 15:19:46 +053095 @input="v$.form.confirmPassword.$touch()"
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053096 />
97 <b-form-invalid-feedback role="alert">
Surya Venkatesan69be8242024-09-23 19:55:06 +053098 <template
99 v-if="v$.form.confirmPassword.sameAsPassword.$invalid"
100 >
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530101 {{ $t('pageProfileSettings.passwordsDoNotMatch') }}
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530102 </template>
103 </b-form-invalid-feedback>
104 </input-password-toggle>
105 </b-form-group>
106 </page-section>
107 </b-col>
108 </b-row>
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530109 <page-section :section-title="$t('pageProfileSettings.timezoneDisplay')">
110 <p>{{ $t('pageProfileSettings.timezoneDisplayDesc') }}</p>
111 <b-row>
112 <b-col md="9" lg="8" xl="9">
113 <b-form-group :label="$t('pageProfileSettings.timezone')">
114 <b-form-radio
115 v-model="form.isUtcDisplay"
116 :value="true"
Sukanya Pandey4334d262020-07-29 11:12:06 +0530117 data-test-id="profileSettings-radio-defaultUTC"
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530118 >
119 {{ $t('pageProfileSettings.defaultUTC') }}
120 </b-form-radio>
121 <b-form-radio
122 v-model="form.isUtcDisplay"
123 :value="false"
Sukanya Pandey4334d262020-07-29 11:12:06 +0530124 data-test-id="profileSettings-radio-browserOffset"
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530125 >
126 {{
127 $t('pageProfileSettings.browserOffset', {
Derick Montague602e98a2020-10-21 16:20:00 -0500128 timezone,
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530129 })
130 }}
131 </b-form-radio>
132 </b-form-group>
133 </b-col>
134 </b-row>
135 </page-section>
Sukanya Pandey4334d262020-07-29 11:12:06 +0530136 <b-button
137 variant="primary"
138 type="submit"
139 data-test-id="profileSettings-button-saveSettings"
140 >
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530141 {{ $t('global.action.saveSettings') }}
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530142 </b-button>
143 </b-form>
144 </b-container>
145</template>
146
147<script>
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530148import BVToastMixin from '@/components/Mixins/BVToastMixin';
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530149import InputPasswordToggle from '@/components/Global/InputPasswordToggle';
Ed Tanous7d6b44c2024-03-23 14:56:34 -0700150import { maxLength, minLength, sameAs } from '@vuelidate/validators';
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530151import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
Dixsie Wolmersfcda2002020-07-29 14:18:44 -0500152import LocalTimezoneLabelMixin from '@/components/Mixins/LocalTimezoneLabelMixin';
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530153import PageTitle from '@/components/Global/PageTitle';
154import PageSection from '@/components/Global/PageSection';
155import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js';
Ed Tanous7d6b44c2024-03-23 14:56:34 -0700156import { useVuelidate } from '@vuelidate/core';
Surya Vde23ea22024-07-11 15:19:46 +0530157import { useI18n } from 'vue-i18n';
158import i18n from '@/i18n';
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530159
160export default {
161 name: 'ProfileSettings',
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530162 components: { InputPasswordToggle, PageSection, PageTitle },
Dixsie Wolmersfcda2002020-07-29 14:18:44 -0500163 mixins: [
164 BVToastMixin,
165 LocalTimezoneLabelMixin,
166 LoadingBarMixin,
Derick Montague602e98a2020-10-21 16:20:00 -0500167 VuelidateMixin,
Dixsie Wolmersfcda2002020-07-29 14:18:44 -0500168 ],
Ed Tanous7d6b44c2024-03-23 14:56:34 -0700169 setup() {
170 return {
171 v$: useVuelidate(),
172 };
173 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530174 data() {
175 return {
Surya Vde23ea22024-07-11 15:19:46 +0530176 $t: useI18n().t,
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530177 form: {
178 newPassword: '',
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530179 confirmPassword: '',
Damian Celicobcb0ab42022-08-23 03:18:58 +0200180 currentPassword: '',
Derick Montague602e98a2020-10-21 16:20:00 -0500181 isUtcDisplay: this.$store.getters['global/isUtcDisplay'],
182 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530183 };
184 },
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530185 computed: {
186 username() {
187 return this.$store.getters['global/username'];
188 },
189 passwordRequirements() {
Sandeepa Singhb4406162021-07-26 15:05:39 +0530190 return this.$store.getters['userManagement/accountPasswordRequirements'];
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530191 },
192 timezone() {
Dixsie Wolmersfcda2002020-07-29 14:18:44 -0500193 return this.localOffset();
Derick Montague602e98a2020-10-21 16:20:00 -0500194 },
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530195 },
196 created() {
197 this.startLoader();
198 this.$store
Sandeepa Singhb4406162021-07-26 15:05:39 +0530199 .dispatch('userManagement/getAccountSettings')
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530200 .finally(() => this.endLoader());
201 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530202 validations() {
203 return {
204 form: {
205 newPassword: {
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530206 minLength: minLength(this.passwordRequirements.minLength),
Derick Montague602e98a2020-10-21 16:20:00 -0500207 maxLength: maxLength(this.passwordRequirements.maxLength),
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530208 },
209 confirmPassword: {
Derick Montague602e98a2020-10-21 16:20:00 -0500210 sameAsPassword: sameAs('newPassword'),
211 },
212 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530213 };
214 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530215 methods: {
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530216 saveNewPasswordInputData() {
Surya Vde23ea22024-07-11 15:19:46 +0530217 this.v$.form.confirmPassword.$touch();
218 this.v$.form.newPassword.$touch();
219 if (this.v$.$invalid) return;
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530220 let userData = {
221 originalUsername: this.username,
Derick Montague602e98a2020-10-21 16:20:00 -0500222 password: this.form.newPassword,
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530223 };
224
225 this.$store
Sandeepa Singhb4406162021-07-26 15:05:39 +0530226 .dispatch('userManagement/updateUser', userData)
Derick Montague602e98a2020-10-21 16:20:00 -0500227 .then((message) => {
Damian Celicobcb0ab42022-08-23 03:18:58 +0200228 (this.form.newPassword = ''),
229 (this.form.confirmPassword = ''),
230 (this.form.currentPassword = '');
Surya Vde23ea22024-07-11 15:19:46 +0530231 this.v$.$reset();
Sukanya Pandey9422e1a2020-07-13 19:13:07 +0530232 this.successToast(message);
Damian Celicobcb0ab42022-08-23 03:18:58 +0200233 this.$store.dispatch('authentication/logout');
Sukanya Pandey9422e1a2020-07-13 19:13:07 +0530234 })
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530235 .catch(({ message }) => this.errorToast(message));
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530236 },
237 saveTimeZonePrefrenceData() {
238 localStorage.setItem('storedUtcDisplay', this.form.isUtcDisplay);
239 this.$store.commit('global/setUtcTime', this.form.isUtcDisplay);
240 this.successToast(
Surya Vde23ea22024-07-11 15:19:46 +0530241 i18n.global.t('pageProfileSettings.toast.successUpdatingTimeZone'),
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530242 );
243 },
244 submitForm() {
Damian Celicobcb0ab42022-08-23 03:18:58 +0200245 if (
246 this.form.confirmPassword &&
247 this.form.newPassword &&
248 this.form.currentPassword
249 ) {
250 this.confirmAuthenticate();
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530251 }
Damian Celicobcb0ab42022-08-23 03:18:58 +0200252 if (
253 this.$store.getters['global/isUtcDisplay'] != this.form.isUtcDisplay
254 ) {
255 this.saveTimeZonePrefrenceData();
256 }
257 },
258 confirmAuthenticate() {
Surya Vde23ea22024-07-11 15:19:46 +0530259 this.v$.form.newPassword.$touch();
260 if (this.v$.$invalid) return;
Damian Celicobcb0ab42022-08-23 03:18:58 +0200261
262 const username = this.username;
263 const password = this.form.currentPassword;
264
265 this.$store
266 .dispatch('authentication/login', { username, password })
267 .then(() => {
268 this.saveNewPasswordInputData();
269 })
270 .catch(() => {
Surya Vde23ea22024-07-11 15:19:46 +0530271 this.v$.$reset();
Damian Celicobcb0ab42022-08-23 03:18:58 +0200272 this.errorToast(
Surya Vde23ea22024-07-11 15:19:46 +0530273 i18n.global.t('pageProfileSettings.toast.wrongCredentials'),
Damian Celicobcb0ab42022-08-23 03:18:58 +0200274 );
275 });
Derick Montague602e98a2020-10-21 16:20:00 -0500276 },
277 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530278};
279</script>