Finalize email/password changing in UI
This commit is contained in:
parent
81da55d46b
commit
0cc895f2d5
10 changed files with 158 additions and 23 deletions
|
@ -2,6 +2,7 @@ import Vue from 'vue';
|
|||
import Vuex from 'vuex';
|
||||
import vuexI18n from 'vuex-i18n';
|
||||
import VueRouter from 'vue-router';
|
||||
import VeeValidate from 'vee-validate';
|
||||
|
||||
Vue.config.productionTip = false;
|
||||
require('./bootstrap');
|
||||
|
@ -19,6 +20,7 @@ window.Ziggy = Ziggy;
|
|||
Vue.use(Vuex);
|
||||
Vue.use(VueRouter);
|
||||
Vue.use(vuexI18n.plugin, store);
|
||||
Vue.use(VeeValidate);
|
||||
|
||||
const route = require('./../../../vendor/tightenco/ziggy/src/js/route').default;
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<modal :show="modalVisible" v-on:close="modalVisible = false">
|
||||
<TwoFactorAuthentication/>
|
||||
</modal>
|
||||
<flash container="mt-2 sm:mt-6 mb-2 sm:mx-4"/>
|
||||
<flash container="mt-2 sm:mt-6 mb-2"/>
|
||||
<div class="flex flex-wrap">
|
||||
<div class="w-full md:w-1/2">
|
||||
<div class="sm:m-4 md:ml-0">
|
||||
|
|
|
@ -1,20 +1,34 @@
|
|||
<template>
|
||||
<div>
|
||||
<form action="" method="post">
|
||||
<form method="post" v-on:submit.prevent="submitForm">
|
||||
<div class="content-box">
|
||||
<h2 class="mb-6 text-grey-darkest font-medium">Change your password</h2>
|
||||
<div class="mt-6">
|
||||
<label for="grid-password-current" class="input-label">Current password</label>
|
||||
<input id="grid-password-current" name="password" type="password" class="input" required>
|
||||
<input id="grid-password-current" name="current_password" type="password" class="input" required
|
||||
ref="current"
|
||||
v-model="current"
|
||||
>
|
||||
</div>
|
||||
<div class="mt-6">
|
||||
<label for="grid-password-new" class="input-label">New password</label>
|
||||
<input id="grid-password-new" name="password" type="password" class="input" required>
|
||||
<p class="input-help">Your new password should be at least 8 characters in length, contain one number, and be mixed case.</p>
|
||||
<input id="grid-password-new" name="password" type="password" class="input" required
|
||||
:class="{ error: errors.has('password') }"
|
||||
v-model="newPassword"
|
||||
v-validate="'min:8'"
|
||||
>
|
||||
<p class="input-help error" v-show="errors.has('password')">{{ errors.first('password') }}</p>
|
||||
<p class="input-help">Your new password should be at least 8 characters in length.</p>
|
||||
</div>
|
||||
<div class="mt-6">
|
||||
<label for="grid-password-new-confirm" class="input-label">Confirm new password</label>
|
||||
<input id="grid-password-new-confirm" name="password_confirmation" type="password" class="input" required>
|
||||
<input id="grid-password-new-confirm" name="password_confirmation" type="password" class="input" required
|
||||
:class="{ error: errors.has('password_confirmation') }"
|
||||
v-model="confirmNew"
|
||||
v-validate="{is: newPassword}"
|
||||
data-vv-as="password"
|
||||
>
|
||||
<p class="input-help error" v-show="errors.has('password_confirmation')">{{ errors.first('password_confirmation') }}</p>
|
||||
</div>
|
||||
<div class="mt-6 text-right">
|
||||
<button class="btn btn-blue btn-sm text-right" type="submit">Save</button>
|
||||
|
@ -25,7 +39,53 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import isObject from 'lodash/isObject';
|
||||
|
||||
export default {
|
||||
name: 'change-password'
|
||||
name: 'change-password',
|
||||
data: function () {
|
||||
return {
|
||||
current: '',
|
||||
newPassword: '',
|
||||
confirmNew: '',
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
submitForm: function () {
|
||||
window.axios.put(this.route('api.client.account.update-password'), {
|
||||
current_password: this.$data.current,
|
||||
password: this.$data.newPassword,
|
||||
password_confirmation: this.$data.confirmNew,
|
||||
})
|
||||
.finally(() => {
|
||||
this.clearFlashes();
|
||||
this.$validator.pause();
|
||||
this.$data.current = '';
|
||||
this.$refs.current.focus();
|
||||
})
|
||||
.then(() => {
|
||||
this.$data.newPassword = '';
|
||||
this.$data.confirmNew = '';
|
||||
|
||||
this.success('Your password has been updated.');
|
||||
})
|
||||
.catch(err => {
|
||||
if (!err.response) {
|
||||
return console.error(err);
|
||||
}
|
||||
|
||||
const response = err.response;
|
||||
if (response.data && isObject(response.data.errors)) {
|
||||
response.data.errors.forEach(error => {
|
||||
this.error(error.detail);
|
||||
});
|
||||
}
|
||||
})
|
||||
.finally(() => {
|
||||
this.$validator.resume();
|
||||
})
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
|
|
@ -6,9 +6,11 @@
|
|||
<div>
|
||||
<label for="grid-email" class="input-label">Email address</label>
|
||||
<input id="grid-email" name="email" type="email" class="input" required
|
||||
v-model="email"
|
||||
:class="{ error: errors.has('email') }"
|
||||
v-validate
|
||||
v-model="email"
|
||||
>
|
||||
<p class="input-help">If your email is no longer {{ user.email }} enter a new email in the field above.</p>
|
||||
<p class="input-help error" v-show="errors.has('email')">{{ errors.first('email') }}</p>
|
||||
</div>
|
||||
<div class="mt-6">
|
||||
<label for="grid-password" class="input-label">Password</label>
|
||||
|
@ -25,14 +27,14 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import isObject from 'lodash/isObject';
|
||||
import { isObject, get } from 'lodash';
|
||||
import { mapState, mapActions } from 'vuex';
|
||||
|
||||
export default {
|
||||
name: 'update-email',
|
||||
data: function () {
|
||||
return {
|
||||
email: '',
|
||||
email: get(this.$store.state, 'auth.user.email', ''),
|
||||
password: '',
|
||||
};
|
||||
},
|
||||
|
@ -41,7 +43,6 @@
|
|||
user: state => state.auth.user,
|
||||
})
|
||||
},
|
||||
|
||||
methods: {
|
||||
/**
|
||||
* Update a user's email address on the Panel.
|
||||
|
@ -52,9 +53,11 @@
|
|||
email: this.$data.email,
|
||||
password: this.$data.password
|
||||
})
|
||||
.finally(() => {
|
||||
this.$data.password = '';
|
||||
})
|
||||
.then(() => {
|
||||
this.success('Your email address has been updated.');
|
||||
this.$data.password = '';
|
||||
})
|
||||
.catch(error => {
|
||||
if (!error.response) {
|
||||
|
|
|
@ -49,12 +49,20 @@ textarea, select, input, button {
|
|||
&:required, &:invalid {
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
&.error {
|
||||
@apply .text-red-dark .border-red;
|
||||
}
|
||||
}
|
||||
|
||||
.input-label {
|
||||
@apply .block .uppercase .tracking-wide .text-grey-darkest .text-xs .font-bold .mb-1;
|
||||
@apply .block .uppercase .tracking-wide .text-grey-darkest .text-xs .font-bold .mb-2;
|
||||
}
|
||||
|
||||
.input-help {
|
||||
@apply .text-xs .text-grey .pt-2;
|
||||
|
||||
&.error {
|
||||
@apply .text-red-dark;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue