blob: aa325745c8d58eb186051fcafb563ddceddb03be [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"
60 :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"
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053063 @input="$v.form.newPassword.$touch()"
64 />
65 <b-form-invalid-feedback role="alert">
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053066 <template
67 v-if="
68 !$v.form.newPassword.minLength ||
Derick Montague602e98a2020-10-21 16:20:00 -050069 !$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"
92 :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"
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053095 @input="$v.form.confirmPassword.$touch()"
96 />
97 <b-form-invalid-feedback role="alert">
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +053098 <template v-if="!$v.form.confirmPassword.sameAsPassword">
99 {{ $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';
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530155
156export default {
157 name: 'ProfileSettings',
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530158 components: { InputPasswordToggle, PageSection, PageTitle },
Dixsie Wolmersfcda2002020-07-29 14:18:44 -0500159 mixins: [
160 BVToastMixin,
161 LocalTimezoneLabelMixin,
162 LoadingBarMixin,
Derick Montague602e98a2020-10-21 16:20:00 -0500163 VuelidateMixin,
Dixsie Wolmersfcda2002020-07-29 14:18:44 -0500164 ],
Ed Tanous7d6b44c2024-03-23 14:56:34 -0700165 setup() {
166 return {
167 v$: useVuelidate(),
168 };
169 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530170 data() {
171 return {
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530172 form: {
173 newPassword: '',
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530174 confirmPassword: '',
Damian Celicobcb0ab42022-08-23 03:18:58 +0200175 currentPassword: '',
Derick Montague602e98a2020-10-21 16:20:00 -0500176 isUtcDisplay: this.$store.getters['global/isUtcDisplay'],
177 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530178 };
179 },
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530180 computed: {
181 username() {
182 return this.$store.getters['global/username'];
183 },
184 passwordRequirements() {
Sandeepa Singhb4406162021-07-26 15:05:39 +0530185 return this.$store.getters['userManagement/accountPasswordRequirements'];
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530186 },
187 timezone() {
Dixsie Wolmersfcda2002020-07-29 14:18:44 -0500188 return this.localOffset();
Derick Montague602e98a2020-10-21 16:20:00 -0500189 },
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530190 },
191 created() {
192 this.startLoader();
193 this.$store
Sandeepa Singhb4406162021-07-26 15:05:39 +0530194 .dispatch('userManagement/getAccountSettings')
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530195 .finally(() => this.endLoader());
196 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530197 validations() {
198 return {
199 form: {
200 newPassword: {
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530201 minLength: minLength(this.passwordRequirements.minLength),
Derick Montague602e98a2020-10-21 16:20:00 -0500202 maxLength: maxLength(this.passwordRequirements.maxLength),
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530203 },
204 confirmPassword: {
Derick Montague602e98a2020-10-21 16:20:00 -0500205 sameAsPassword: sameAs('newPassword'),
206 },
207 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530208 };
209 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530210 methods: {
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530211 saveNewPasswordInputData() {
212 this.$v.form.confirmPassword.$touch();
213 this.$v.form.newPassword.$touch();
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530214 if (this.$v.$invalid) return;
215 let userData = {
216 originalUsername: this.username,
Derick Montague602e98a2020-10-21 16:20:00 -0500217 password: this.form.newPassword,
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530218 };
219
220 this.$store
Sandeepa Singhb4406162021-07-26 15:05:39 +0530221 .dispatch('userManagement/updateUser', userData)
Derick Montague602e98a2020-10-21 16:20:00 -0500222 .then((message) => {
Damian Celicobcb0ab42022-08-23 03:18:58 +0200223 (this.form.newPassword = ''),
224 (this.form.confirmPassword = ''),
225 (this.form.currentPassword = '');
Sukanya Pandey9422e1a2020-07-13 19:13:07 +0530226 this.$v.$reset();
227 this.successToast(message);
Damian Celicobcb0ab42022-08-23 03:18:58 +0200228 this.$store.dispatch('authentication/logout');
Sukanya Pandey9422e1a2020-07-13 19:13:07 +0530229 })
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530230 .catch(({ message }) => this.errorToast(message));
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530231 },
232 saveTimeZonePrefrenceData() {
233 localStorage.setItem('storedUtcDisplay', this.form.isUtcDisplay);
234 this.$store.commit('global/setUtcTime', this.form.isUtcDisplay);
235 this.successToast(
Ed Tanous81323992024-02-27 11:26:24 -0800236 this.$t('pageProfileSettings.toast.successUpdatingTimeZone'),
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530237 );
238 },
239 submitForm() {
Damian Celicobcb0ab42022-08-23 03:18:58 +0200240 if (
241 this.form.confirmPassword &&
242 this.form.newPassword &&
243 this.form.currentPassword
244 ) {
245 this.confirmAuthenticate();
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530246 }
Damian Celicobcb0ab42022-08-23 03:18:58 +0200247 if (
248 this.$store.getters['global/isUtcDisplay'] != this.form.isUtcDisplay
249 ) {
250 this.saveTimeZonePrefrenceData();
251 }
252 },
253 confirmAuthenticate() {
254 this.$v.form.newPassword.$touch();
255 if (this.$v.$invalid) return;
256
257 const username = this.username;
258 const password = this.form.currentPassword;
259
260 this.$store
261 .dispatch('authentication/login', { username, password })
262 .then(() => {
263 this.saveNewPasswordInputData();
264 })
265 .catch(() => {
266 this.$v.$reset();
267 this.errorToast(
Ed Tanous81323992024-02-27 11:26:24 -0800268 this.$t('pageProfileSettings.toast.wrongCredentials'),
Damian Celicobcb0ab42022-08-23 03:18:58 +0200269 );
270 });
Derick Montague602e98a2020-10-21 16:20:00 -0500271 },
272 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530273};
274</script>