blob: 81ea7b67abe85034388d5c6a834fdb3e83b66bb0 [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
27 id="input-group-1"
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +053028 :label="$t('pageProfileSettings.newPassword')"
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053029 label-for="input-1"
30 >
31 <b-form-text id="password-help-block">
32 {{
33 $t('pageLocalUserManagement.modal.passwordMustBeBetween', {
34 min: passwordRequirements.minLength,
35 max: passwordRequirements.maxLength
36 })
37 }}
38 </b-form-text>
39 <input-password-toggle>
40 <b-form-input
41 id="password"
42 v-model="form.newPassword"
43 type="password"
44 aria-describedby="password-help-block"
45 :state="getValidationState($v.form.newPassword)"
Sukanya Pandey4334d262020-07-29 11:12:06 +053046 data-test-id="profileSettings-input-newPassword"
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053047 @input="$v.form.newPassword.$touch()"
48 />
49 <b-form-invalid-feedback role="alert">
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053050 <template
51 v-if="
52 !$v.form.newPassword.minLength ||
53 !$v.form.newPassword.maxLength
54 "
55 >
56 {{
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +053057 $t('pageProfileSettings.newPassLabelTextInfo', {
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053058 min: passwordRequirements.minLength,
59 max: passwordRequirements.maxLength
60 })
61 }}
62 </template>
63 </b-form-invalid-feedback>
64 </input-password-toggle>
65 </b-form-group>
66 <b-form-group
67 id="input-group-2"
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +053068 :label="$t('pageProfileSettings.confirmPassword')"
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053069 label-for="input-2"
70 >
71 <input-password-toggle>
72 <b-form-input
73 id="password-confirmation"
74 v-model="form.confirmPassword"
75 type="password"
76 :state="getValidationState($v.form.confirmPassword)"
Sukanya Pandey4334d262020-07-29 11:12:06 +053077 data-test-id="profileSettings-input-confirmPassword"
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053078 @input="$v.form.confirmPassword.$touch()"
79 />
80 <b-form-invalid-feedback role="alert">
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +053081 <template v-if="!$v.form.confirmPassword.sameAsPassword">
82 {{ $t('pageProfileSettings.passwordsDoNotMatch') }}
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +053083 </template>
84 </b-form-invalid-feedback>
85 </input-password-toggle>
86 </b-form-group>
87 </page-section>
88 </b-col>
89 </b-row>
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +053090 <page-section :section-title="$t('pageProfileSettings.timezoneDisplay')">
91 <p>{{ $t('pageProfileSettings.timezoneDisplayDesc') }}</p>
92 <b-row>
93 <b-col md="9" lg="8" xl="9">
94 <b-form-group :label="$t('pageProfileSettings.timezone')">
95 <b-form-radio
96 v-model="form.isUtcDisplay"
97 :value="true"
Sukanya Pandey4334d262020-07-29 11:12:06 +053098 data-test-id="profileSettings-radio-defaultUTC"
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +053099 @change="$v.form.isUtcDisplay.$touch()"
100 >
101 {{ $t('pageProfileSettings.defaultUTC') }}
102 </b-form-radio>
103 <b-form-radio
104 v-model="form.isUtcDisplay"
105 :value="false"
Sukanya Pandey4334d262020-07-29 11:12:06 +0530106 data-test-id="profileSettings-radio-browserOffset"
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530107 @change="$v.form.isUtcDisplay.$touch()"
108 >
109 {{
110 $t('pageProfileSettings.browserOffset', {
111 timezone
112 })
113 }}
114 </b-form-radio>
115 </b-form-group>
116 </b-col>
117 </b-row>
118 </page-section>
Sukanya Pandey4334d262020-07-29 11:12:06 +0530119 <b-button
120 variant="primary"
121 type="submit"
122 data-test-id="profileSettings-button-saveSettings"
123 >
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530124 {{ $t('global.action.saveSettings') }}
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530125 </b-button>
126 </b-form>
127 </b-container>
128</template>
129
130<script>
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530131import i18n from '@/i18n';
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530132import BVToastMixin from '@/components/Mixins/BVToastMixin';
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530133import InputPasswordToggle from '@/components/Global/InputPasswordToggle';
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530134import { format } from 'date-fns-tz';
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530135import {
136 maxLength,
137 minLength,
138 required,
139 sameAs
140} from 'vuelidate/lib/validators';
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530141import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
142import PageTitle from '@/components/Global/PageTitle';
143import PageSection from '@/components/Global/PageSection';
144import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js';
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530145
146export default {
147 name: 'ProfileSettings',
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530148 components: { InputPasswordToggle, PageSection, PageTitle },
149 mixins: [BVToastMixin, LoadingBarMixin, VuelidateMixin],
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530150 data() {
151 return {
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530152 form: {
153 newPassword: '',
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530154 confirmPassword: '',
155 isUtcDisplay: this.$store.getters['global/isUtcDisplay']
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530156 }
157 };
158 },
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530159 computed: {
160 username() {
161 return this.$store.getters['global/username'];
162 },
163 passwordRequirements() {
164 return this.$store.getters['localUsers/accountPasswordRequirements'];
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530165 },
166 timezone() {
167 const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
168 const shortTz = this.$options.filters.shortTimeZone(new Date());
169 const pattern = `'${shortTz}' O`;
170 return format(new Date(), pattern, { timezone }).replace('GMT', 'UTC');
Sukanya Pandeyb93608d2020-07-10 18:51:58 +0530171 }
172 },
173 created() {
174 this.startLoader();
175 this.$store
176 .dispatch('localUsers/getAccountSettings')
177 .finally(() => this.endLoader());
178 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530179 validations() {
180 return {
181 form: {
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530182 isUtcDisplay: { required },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530183 newPassword: {
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530184 minLength: minLength(this.passwordRequirements.minLength),
185 maxLength: maxLength(this.passwordRequirements.maxLength)
186 },
187 confirmPassword: {
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530188 sameAsPassword: sameAs('newPassword')
189 }
190 }
191 };
192 },
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530193 methods: {
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530194 saveNewPasswordInputData() {
195 this.$v.form.confirmPassword.$touch();
196 this.$v.form.newPassword.$touch();
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530197 if (this.$v.$invalid) return;
198 let userData = {
199 originalUsername: this.username,
200 password: this.form.newPassword
201 };
202
203 this.$store
204 .dispatch('localUsers/updateUser', userData)
Sukanya Pandey9422e1a2020-07-13 19:13:07 +0530205 .then(message => {
206 (this.form.newPassword = ''), (this.form.confirmPassword = '');
207 this.$v.$reset();
208 this.successToast(message);
209 })
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530210 .catch(({ message }) => this.errorToast(message));
Sukanya Pandeyfc16f3c2020-06-23 22:54:27 +0530211 },
212 saveTimeZonePrefrenceData() {
213 localStorage.setItem('storedUtcDisplay', this.form.isUtcDisplay);
214 this.$store.commit('global/setUtcTime', this.form.isUtcDisplay);
215 this.successToast(
216 i18n.t('pageProfileSettings.toast.successSaveSettings')
217 );
218 },
219 submitForm() {
220 if (this.form.confirmPassword || this.form.newPassword) {
221 this.saveNewPasswordInputData();
222 }
223 if (this.$v.form.isUtcDisplay.$anyDirty) {
224 this.saveTimeZonePrefrenceData();
225 }
Sukanya Pandeyb1f559f2020-04-28 20:18:28 +0530226 }
227 }
228};
229</script>