blob: 6fc9c1e7a731043e8249d40c75290f5fa3e20645 [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 Vde23ea22024-07-11 15:19:46 +053068 !v$.form.newPassword.minLength ||
69 !v$.form.newPassword.maxLength
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 Vde23ea22024-07-11 15:19:46 +053098 <template v-if="!v$.form.confirmPassword.sameAsPassword">
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +053099 {{ $t('pageProfileSettings.passwordsDoNotMatch') }}
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530100 </template>
101 </b-form-invalid-feedback>
102 </input-password-toggle>
103 </b-form-group>
104 </page-section>
105 </b-col>
106 </b-row>
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530107 <page-section :section-title="$t('pageProfileSettings.timezoneDisplay')">
108 <p>{{ $t('pageProfileSettings.timezoneDisplayDesc') }}</p>
109 <b-row>
110 <b-col md="9" lg="8" xl="9">
111 <b-form-group :label="$t('pageProfileSettings.timezone')">
112 <b-form-radio
113 v-model="form.isUtcDisplay"
114 :value="true"
Sukanya Pandey4334d262020-07-29 11:12:06 +0530115 data-test-id="profileSettings-radio-defaultUTC"
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530116 >
117 {{ $t('pageProfileSettings.defaultUTC') }}
118 </b-form-radio>
119 <b-form-radio
120 v-model="form.isUtcDisplay"
121 :value="false"
Sukanya Pandey4334d262020-07-29 11:12:06 +0530122 data-test-id="profileSettings-radio-browserOffset"
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530123 >
124 {{
125 $t('pageProfileSettings.browserOffset', {
Derick Montague602e98a2020-10-21 16:20:00 -0500126 timezone,
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530127 })
128 }}
129 </b-form-radio>
130 </b-form-group>
131 </b-col>
132 </b-row>
133 </page-section>
Sukanya Pandey4334d262020-07-29 11:12:06 +0530134 <b-button
135 variant="primary"
136 type="submit"
137 data-test-id="profileSettings-button-saveSettings"
138 >
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530139 {{ $t('global.action.saveSettings') }}
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530140 </b-button>
141 </b-form>
142 </b-container>
143</template>
144
145<script>
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530146import BVToastMixin from '@/components/Mixins/BVToastMixin';
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530147import InputPasswordToggle from '@/components/Global/InputPasswordToggle';
Ed Tanous7d6b44c2024-03-23 14:56:34 -0700148import { maxLength, minLength, sameAs } from '@vuelidate/validators';
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530149import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
Dixsie Wolmersfcda2002020-07-29 14:18:44 -0500150import LocalTimezoneLabelMixin from '@/components/Mixins/LocalTimezoneLabelMixin';
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530151import PageTitle from '@/components/Global/PageTitle';
152import PageSection from '@/components/Global/PageSection';
153import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js';
Ed Tanous7d6b44c2024-03-23 14:56:34 -0700154import { useVuelidate } from '@vuelidate/core';
Surya Vde23ea22024-07-11 15:19:46 +0530155import { useI18n } from 'vue-i18n';
156import i18n from '@/i18n';
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530157
158export default {
159 name: 'ProfileSettings',
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530160 components: { InputPasswordToggle, PageSection, PageTitle },
Dixsie Wolmersfcda2002020-07-29 14:18:44 -0500161 mixins: [
162 BVToastMixin,
163 LocalTimezoneLabelMixin,
164 LoadingBarMixin,
Derick Montague602e98a2020-10-21 16:20:00 -0500165 VuelidateMixin,
Dixsie Wolmersfcda2002020-07-29 14:18:44 -0500166 ],
Ed Tanous7d6b44c2024-03-23 14:56:34 -0700167 setup() {
168 return {
169 v$: useVuelidate(),
170 };
171 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530172 data() {
173 return {
Surya Vde23ea22024-07-11 15:19:46 +0530174 $t: useI18n().t,
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530175 form: {
176 newPassword: '',
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530177 confirmPassword: '',
Damian Celicobcb0ab42022-08-23 03:18:58 +0200178 currentPassword: '',
Derick Montague602e98a2020-10-21 16:20:00 -0500179 isUtcDisplay: this.$store.getters['global/isUtcDisplay'],
180 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530181 };
182 },
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530183 computed: {
184 username() {
185 return this.$store.getters['global/username'];
186 },
187 passwordRequirements() {
Sandeepa Singhb4406162021-07-26 15:05:39 +0530188 return this.$store.getters['userManagement/accountPasswordRequirements'];
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530189 },
190 timezone() {
Dixsie Wolmersfcda2002020-07-29 14:18:44 -0500191 return this.localOffset();
Derick Montague602e98a2020-10-21 16:20:00 -0500192 },
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530193 },
194 created() {
195 this.startLoader();
196 this.$store
Sandeepa Singhb4406162021-07-26 15:05:39 +0530197 .dispatch('userManagement/getAccountSettings')
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530198 .finally(() => this.endLoader());
199 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530200 validations() {
201 return {
202 form: {
203 newPassword: {
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530204 minLength: minLength(this.passwordRequirements.minLength),
Derick Montague602e98a2020-10-21 16:20:00 -0500205 maxLength: maxLength(this.passwordRequirements.maxLength),
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530206 },
207 confirmPassword: {
Derick Montague602e98a2020-10-21 16:20:00 -0500208 sameAsPassword: sameAs('newPassword'),
209 },
210 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530211 };
212 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530213 methods: {
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530214 saveNewPasswordInputData() {
Surya Vde23ea22024-07-11 15:19:46 +0530215 this.v$.form.confirmPassword.$touch();
216 this.v$.form.newPassword.$touch();
217 if (this.v$.$invalid) return;
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530218 let userData = {
219 originalUsername: this.username,
Derick Montague602e98a2020-10-21 16:20:00 -0500220 password: this.form.newPassword,
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530221 };
222
223 this.$store
Sandeepa Singhb4406162021-07-26 15:05:39 +0530224 .dispatch('userManagement/updateUser', userData)
Derick Montague602e98a2020-10-21 16:20:00 -0500225 .then((message) => {
Damian Celicobcb0ab42022-08-23 03:18:58 +0200226 (this.form.newPassword = ''),
227 (this.form.confirmPassword = ''),
228 (this.form.currentPassword = '');
Surya Vde23ea22024-07-11 15:19:46 +0530229 this.v$.$reset();
Sukanya Pandey9422e1a2020-07-13 19:13:07 +0530230 this.successToast(message);
Damian Celicobcb0ab42022-08-23 03:18:58 +0200231 this.$store.dispatch('authentication/logout');
Sukanya Pandey9422e1a2020-07-13 19:13:07 +0530232 })
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530233 .catch(({ message }) => this.errorToast(message));
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530234 },
235 saveTimeZonePrefrenceData() {
236 localStorage.setItem('storedUtcDisplay', this.form.isUtcDisplay);
237 this.$store.commit('global/setUtcTime', this.form.isUtcDisplay);
238 this.successToast(
Surya Vde23ea22024-07-11 15:19:46 +0530239 i18n.global.t('pageProfileSettings.toast.successUpdatingTimeZone'),
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530240 );
241 },
242 submitForm() {
Damian Celicobcb0ab42022-08-23 03:18:58 +0200243 if (
244 this.form.confirmPassword &&
245 this.form.newPassword &&
246 this.form.currentPassword
247 ) {
248 this.confirmAuthenticate();
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530249 }
Damian Celicobcb0ab42022-08-23 03:18:58 +0200250 if (
251 this.$store.getters['global/isUtcDisplay'] != this.form.isUtcDisplay
252 ) {
253 this.saveTimeZonePrefrenceData();
254 }
255 },
256 confirmAuthenticate() {
Surya Vde23ea22024-07-11 15:19:46 +0530257 this.v$.form.newPassword.$touch();
258 if (this.v$.$invalid) return;
Damian Celicobcb0ab42022-08-23 03:18:58 +0200259
260 const username = this.username;
261 const password = this.form.currentPassword;
262
263 this.$store
264 .dispatch('authentication/login', { username, password })
265 .then(() => {
266 this.saveNewPasswordInputData();
267 })
268 .catch(() => {
Surya Vde23ea22024-07-11 15:19:46 +0530269 this.v$.$reset();
Damian Celicobcb0ab42022-08-23 03:18:58 +0200270 this.errorToast(
Surya Vde23ea22024-07-11 15:19:46 +0530271 i18n.global.t('pageProfileSettings.toast.wrongCredentials'),
Damian Celicobcb0ab42022-08-23 03:18:58 +0200272 );
273 });
Derick Montague602e98a2020-10-21 16:20:00 -0500274 },
275 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530276};
277</script>