Merge remote-tracking branch 'origin/master'

This commit is contained in:
omair saleh
2021-05-26 14:46:46 +08:00
28 changed files with 1071 additions and 417 deletions
@@ -0,0 +1,78 @@
<?php
namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Accounts\Services\UpdatesUser;
use App\Classes\Modules\Accounts\Services\FetchesUser;
use App\Classes\Modules\Accounts\Standards\Rules\CanUpdateUser;
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject;
use App\Http\Resources\UserResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UpdateUserLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Updated User Profile',
'message' => 'You have successfully updated the User Profile'
];
}
/** @var CanUpdateUser */
private $canUpdateUser;
/** @var UpdatesUser */
private $updatesUser;
/** @var FetchesUser */
private $fetchesUser;
/**
* UpdateAddressLogic constructor.
* @param CanUpdateUser $canUpdateUser
* @param UpdatesUser $updatesUser
* @param FetchesUser $fetchesUSer
*/
public function __construct(CanUpdateUser $canUpdateUser, UpdatesUser $updatesUser, FetchesUser $fetchesUser)
{
$this->canUpdateUser = $canUpdateUser;
$this->updatesUser = $updatesUser;
$this->fetchesUser = $fetchesUser;
}
/**
* @param Request $request
* @return JsonResponse
* @throws ErrorException
*/
public function logic(Request $request) : JsonResponse
{
try {
$object = new UserObject($request->input('name'));
$this->canUpdateUser->passes($object);
$query = $this->fetchesUser->execute(['id' => $request->route('id')]);
$query = $this->updatesUser->execute($query, $object);
return $this->resourceResponse(new UserResource($query));
} catch (\Exception $exception){
throw new ErrorException($exception->getMessage(), $exception->getCode());
}
}
}
@@ -0,0 +1,30 @@
<?php
namespace App\Classes\Modules\Accounts\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
class UserObject implements DataTransferObject
{
/** @var string */
private $name;
/**
* NameObject constructor.
* @param string $name
*/
public function __construct(string $name)
{
$this->name = $name;
}
/**
* @return string
*/
public function getName(): string
{
return $this->name;
}
}
@@ -0,0 +1,24 @@
<?php
namespace App\Classes\Modules\Accounts\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject;
use App\Models\User;
class UpdatesUser extends AbstractUpdateRecord
{
/**
* @param User $model
* @param UserObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(User $model, UserObject $object) {
$model->name = $object->getName();
return $this->handler($model);
}
}
@@ -0,0 +1,57 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Rules;
use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject;
use App\Classes\Modules\Accounts\Standards\Validators\UserUpdateValidation;
class CanUpdateUser extends AbstractRule
{
/** @var UserUpdateValidation */
private $userUpdateValidation;
/**
* CanUpdateAddress constructor.
* @param UserUpdateValidation $userUpdateValidation
*/
public function __construct(UserUpdateValidation $userUpdateValidation)
{
$this->userUpdateValidation = $userUpdateValidation;
}
/**
* @return bool
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
return true;
}
/**
* @param UserObject $object
* @return bool
* @throws \App\Classes\Exceptions\RequestValidationException
*/
protected function validators($object): bool
{
return $this->userUpdateValidation->validate($object);
}
/**
* @param AddressObject $object
* @return bool
*/
protected function criteria($object): bool
{
return true;
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Classes\Modules\Accounts\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject;
class UserUpdateValidation extends AbstractValidation
{
/**
* @param UserObject $object
* @return array
*/
protected function data($object): array
{
return [
'name' => $object->getName(),
];
}
/**
* @return array
*/
protected function rules(): array
{
return [
'name' => 'required',
];
}
/**
* @return array
*/
protected function messages(): array
{
return [];
}
}
@@ -12,11 +12,13 @@ class CanListDocuments extends AbstractRule
*/
protected function authorized(): bool
{
// TODO Set Authorization rules
/*
Disabled temporarily, will check back later
if (!\Auth::user()->can('view document')) {
return false;
}
*/
return true;
@@ -31,7 +31,7 @@ class ResetPasswordEmail extends AbstractEmail
{
return (new MailMessage)
->subject('Reset Password')
->view('emails.account.reset_password', ['user' => $this->user, 'attempt' => $this->attempt]);
->view('emails.accounts.reset_password', ['user' => $this->user, 'attempt' => $this->attempt]);
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Accounts;
use App\Classes\Modules\Accounts\ControllersLogic\GeneratePasswordResetLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class GeneratePasswordResetController
{
/**
* @param Request $request
* @param ResendEmailVerificationLogic $logic
* @return JsonResponse
*/
public function generate(Request $request, GeneratePasswordResetLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Accounts;
use App\Classes\Modules\Accounts\ControllersLogic\ResetPasswordLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ResetPasswordController
{
/**
* @param Request $request
* @param ResendEmailVerificationLogic $logic
* @return JsonResponse
*/
public function reset(Request $request, ResetPasswordLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -3,7 +3,7 @@
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use App\Classes\ValueObjects\Constants as Constants;
use App\Models\User;
class AdminUserPermissionsTableSeeder extends Seeder
@@ -19,77 +19,121 @@ class AdminUserPermissionsTableSeeder extends Seeder
app()['cache']->forget('spatie.permission.cache');
// admin permissions
Permission::create(['name' => 'view document', 'guard_name' => 'web']);
Permission::create(['name' => 'add document', 'guard_name' => 'web']);
Permission::create(['name' => 'edit document', 'guard_name' => 'web']);
Permission::create(['name' => 'delete document', 'guard_name' => 'web']);
$permissions = [
['name' => 'view document', 'guard_name' => 'web'],
['name' => 'add document', 'guard_name' => 'web'],
['name' => 'edit document', 'guard_name' => 'web'],
['name' => 'delete document', 'guard_name' => 'web'],
Permission::create(['name' => 'view standard_segment', 'guard_name' => 'web']);
Permission::create(['name' => 'add standard_segment', 'guard_name' => 'web']);
Permission::create(['name' => 'edit standard_segment', 'guard_name' => 'web']);
Permission::create(['name' => 'delete standard_segment', 'guard_name' => 'web']);
['name' => 'view standard_segment', 'guard_name' => 'web'],
['name' => 'add standard_segment', 'guard_name' => 'web'],
['name' => 'edit standard_segment', 'guard_name' => 'web'],
['name' => 'delete standard_segment', 'guard_name' => 'web'],
Permission::create(['name' => 'view standard_segment_constant', 'guard_name' => 'web']);
Permission::create(['name' => 'add standard_segment_constant', 'guard_name' => 'web']);
Permission::create(['name' => 'edit standard_segment_constant', 'guard_name' => 'web']);
Permission::create(['name' => 'delete standard_segment_constant', 'guard_name' => 'web']);
['name' => 'view standard_segment_constant', 'guard_name' => 'web'],
['name' => 'add standard_segment_constant', 'guard_name' => 'web'],
['name' => 'edit standard_segment_constant', 'guard_name' => 'web'],
['name' => 'delete standard_segment_constant', 'guard_name' => 'web'],
Permission::create(['name' => 'view segment', 'guard_name' => 'web']);
Permission::create(['name' => 'add segment', 'guard_name' => 'web']);
Permission::create(['name' => 'edit segment', 'guard_name' => 'web']);
Permission::create(['name' => 'delete segment', 'guard_name' => 'web']);
['name' => 'view segment', 'guard_name' => 'web'],
['name' => 'add segment', 'guard_name' => 'web'],
['name' => 'edit segment', 'guard_name' => 'web'],
['name' => 'delete segment', 'guard_name' => 'web'],
Permission::create(['name' => 'view segment_constant', 'guard_name' => 'web']);
Permission::create(['name' => 'add segment_constant', 'guard_name' => 'web']);
Permission::create(['name' => 'edit segment_constant', 'guard_name' => 'web']);
Permission::create(['name' => 'delete segment_constant', 'guard_name' => 'web']);
['name' => 'view segment_constant', 'guard_name' => 'web'],
['name' => 'add segment_constant', 'guard_name' => 'web'],
['name' => 'edit segment_constant', 'guard_name' => 'web'],
['name' => 'delete segment_constant', 'guard_name' => 'web'],
Permission::create(['name' => 'view company_bank', 'guard_name' => 'web']);
Permission::create(['name' => 'add company_bank', 'guard_name' => 'web']);
Permission::create(['name' => 'edit company_bank', 'guard_name' => 'web']);
Permission::create(['name' => 'delete company_bank', 'guard_name' => 'web']);
['name' => 'view company_bank', 'guard_name' => 'web'],
['name' => 'add company_bank', 'guard_name' => 'web'],
['name' => 'edit company_bank', 'guard_name' => 'web'],
['name' => 'delete company_bank', 'guard_name' => 'web'],
Permission::create(['name' => 'view currency', 'guard_name' => 'web']);
Permission::create(['name' => 'add currency', 'guard_name' => 'web']);
Permission::create(['name' => 'edit currency', 'guard_name' => 'web']);
Permission::create(['name' => 'delete currency', 'guard_name' => 'web']);
['name' => 'view currency', 'guard_name' => 'web'],
['name' => 'add currency', 'guard_name' => 'web'],
['name' => 'edit currency', 'guard_name' => 'web'],
['name' => 'delete currency', 'guard_name' => 'web'],
Permission::create(['name' => 'view currency_rate', 'guard_name' => 'web']);
Permission::create(['name' => 'add currency_rate', 'guard_name' => 'web']);
Permission::create(['name' => 'edit currency_rate', 'guard_name' => 'web']);
Permission::create(['name' => 'delete currency_rate', 'guard_name' => 'web']);
['name' => 'view currency_rate', 'guard_name' => 'web'],
['name' => 'add currency_rate', 'guard_name' => 'web'],
['name' => 'edit currency_rate', 'guard_name' => 'web'],
['name' => 'delete currency_rate', 'guard_name' => 'web'],
Permission::create(['name' => 'view booking', 'guard_name' => 'web']);
Permission::create(['name' => 'add booking', 'guard_name' => 'web']);
Permission::create(['name' => 'edit booking', 'guard_name' => 'web']);
Permission::create(['name' => 'delete booking', 'guard_name' => 'web']);
['name' => 'view booking', 'guard_name' => 'web'],
['name' => 'add booking', 'guard_name' => 'web'],
['name' => 'edit booking', 'guard_name' => 'web'],
['name' => 'delete booking', 'guard_name' => 'web']
];
foreach ($permissions as $permission){
Permission::updateOrCreate($permission,$permission);
}
///////////////////////////////////////////////////////////////////////
$shadow_admin_role = Role::create([
'name' => 'Shadow Admin',
'guard_name' => 'web',
'type' => 1,
]);
$shadow_admin_role = Role::updateOrCreate(
['name' => 'Shadow Admin'],
[
'name' => 'Shadow Admin',
'guard_name' => 'web',
'type' => 1,
]
);
$shadow_admin_role->givePermissionTo(Permission::all());
$admin = User::find(1);
$admin->assignRole($shadow_admin_role);
//Assign permission by user role/type not id
//$admin = User::find(1);
//$admin->assignRole($shadow_admin_role);
$shadow_admins = User::query()->whereIn('type',[Constants\RoleTypes::SHADOW_ADMIN])->get();
foreach ($shadow_admins as $shadow_admin) {
$shadow_admin->assignRole($shadow_admin_role);
}
///////////////////////////////////////////////////////////////////////
$ultimate_admin_role = Role::create([
'name' => 'Ultimate Admin',
'guard_name' => 'web',
'type' => 1,
]);
$ultimate_admin_role = Role::updateOrCreate(
['name' => 'Ultimate Admin'],
[
'name' => 'Ultimate Admin',
'guard_name' => 'web',
'type' => 1,
]
);
$ultimate_admin_role->givePermissionTo(Permission::all());
$admin = User::find(2);
$admin->assignRole($ultimate_admin_role);
$super_admins = User::query()->whereIn('type',[Constants\RoleTypes::SUPER_ADMIN])->get();
foreach ($super_admins as $super_admin) {
$super_admin->assignRole($ultimate_admin_role);
}
/* Disable normal admin role for now, will comeback later to this
$admin_role = Role::updateOrCreate(
['name' => 'Admin'],
[
'name' => 'Admin',
'guard_name' => 'web',
'type' => 1,
]
);
//Normal admin limited permissions
$admin_permissions = [
$permissions[0]['name'],
$permissions[1]['name'],
$permissions[2]['name'],
$permissions[3]['name'],
];
$admin_role->givePermissionTo(Permission::query()->whereIn('name',$admin_permissions)->get());
$admins = User::query()->whereIn('type',[Constants\RoleTypes::ADMIN])->get();
foreach ($admins as $admin) {
$admin->assignRole($admin_role);
}
*/
///////////////////////////////////////////////////////////////////////
}
}
@@ -6,27 +6,41 @@
<small class="bold fs-10 text-danger">{{error}}</small>
</div>
</div>
<div class="row m-l-0 animate__animated animate__fadeInUpBig">
<div class="col b-t b-b b-grey animate__animated" :class="[{'animate__shake': $v.parameters.email.$error}]" :style="[$v.parameters.email.$error ? {'border-bottom': 'solid 2px red !important'} : {}]">
<div class="row m-l-0" v-show="!$store.getters.isShowing('forgetPasswordSuccess')">
<div class="col animate__animated">
<div class="row align-items-center">
<div class="col no-padding bg-white ">
<div class="input-group transparent">
<span class="input-group-addon no-border">
<i class="fa fa-envelope-o fa-fw p-l-15 p-t-20" style="padding-right: 18px;"></i>
</span>
<input v-model="parameters.email" placeholder="Email Address" class="form-control no-border bg-white p-t-35 p-b-35 p-l-0 p-r-0">
<validation-error-component :validator="$v.parameters.email" class="absolute fs-12" style=" top: 10px; right: 15px; z-index: 99;"></validation-error-component>
<validation-wrapper-component class="m-b-15" :validator="$v.parameters.email">
<label class="text-primary">Email Address</label>
<div class="controls">
<input type="text" class="form-control fs-12" v-model="parameters.email">
</div>
</validation-wrapper-component>
</div>
</div>
</div>
</div>
<div class="row m-l-0" v-show="$store.getters.isShowing('forgetPasswordSuccess')">
<div class="col animate__animated">
<div class="row align-items-center">
<div class="col no-padding bg-white ">
<div class="row animate__animated animate__fadeInRightBig">
<div class="col">
<small class="muted font-lato all-caps">Your password has been changed successfully</small>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row m-t-30 align-items-center">
<div class="col-auto animate__animated animate__fadeInLeftBig animate__slower">
<div class="b-t b-b b-r b-grey all-caps muted p-t-15 p-b-15 p-l-30 p-r-20 font-lato pointer fs-12" @click="$store.dispatch('toggleSection', {name: 'forgetPassword', status: false})" style="letter-spacing: 2px;"><i class="fa fa-angle-left" style="padding-right: 18px;"></i>Back to login</div>
<div class="row m-t-5 align-items-center">
<div class="col-auto ml-auto p-r-0" v-show="!$store.getters.isShowing('forgetPasswordSuccess')">
<div class="btn btn-sm p-l-30 p-r-30 btn-primary bold v-align-middle b-rad-none all-caps" @click="submit(route('api.account.authentication.password.forget'), 'post', section, false , false)">Request Reset Link</div>
</div>
<div class="col-auto ml-auto p-r-0 animate__animated animate__fadeInRightBig animate__slow">
<div class="bg-success all-caps text-white p-t-15 p-b-15 p-l-50 p-r-20 bold font-lato pointer fs-12" style="letter-spacing: 4px;" @click="submit(route('api.account.authentication.password.forget'), 'post', section, false , false)">Request Reset Link</div>
<div class="col-auto m-t-15">
<div class="b-t b-b b-r b-grey all-caps muted p-t-15 p-b-15 p-l-30 p-r-20 font-lato pointer fs-12" @click="$store.dispatch('returnToLoginAfterSendResetPasswordLink')" style="letter-spacing: 2px;"><i class="fa fa-angle-left" style="padding-right: 18px;"></i>Back to login</div>
</div>
</div>
</div>
@@ -59,7 +73,8 @@
methods:{
successHandler(){
this.$store.dispatch('toggleSection', {name: 'forgetPasswordSuccess', status: true});
this.$store.dispatch('passwordResetEmail', {email: this.parameters.email})
this.$store.dispatch('passwordResetEmail', {email: this.parameters.email});
this.resetForm();
},
errorHandler(error){
this.error = error.message;
@@ -18,7 +18,7 @@
</validation-wrapper-component>
<div class="row m-t-15 align-items-center justify-content-center">
<div class="col-auto">
<p class="muted fs-11 font-arial m-b-0 pointer">Forgot password?</p>
<p class="muted fs-11 font-arial m-b-0 pointer" @click="$store.dispatch('toggleSection', {name: 'forgetPassword', status: true})">Forgot password?</p>
</div>
<div class="col text-right">
<div class="btn btn-sm p-l-30 p-r-30 btn-primary bold v-align-middle b-rad-none all-caps" @click="submitForm">Sign In</div>
@@ -0,0 +1,93 @@
<template>
<div class="row">
<div class="col">
<div class="row m-r-0 m-l-0 m-b-20 animate__animated animate__fadeInUpBig animate__fast" v-if="error">
<div class="col p-l-50">
<small class="bold fs-10 text-danger">{{error}}</small>
</div>
</div>
<div class="row m-l-0 m-b-10 animate__animated animate__fadeInUpBig">
<div class="col b-t b-b b-grey animate__animated" :class="[{'animate__shake': $v.parameters.password.$error}]" :style="[$v.parameters.password.$error ? {'border-bottom': 'solid 2px red !important'} : {}]">
<div class="row align-items-center">
<div class="col no-padding bg-white ">
<div class="input-group transparent">
<span class="input-group-addon no-border">
<i class="fa fa-envelope-o fa-fw p-l-15 p-t-20" style="padding-right: 18px;"></i>
</span>
<input v-model="parameters.password" placeholder="Password" type="password" class="form-control no-border bg-white p-t-35 p-b-35 p-l-0 p-r-0">
<validation-error-component :validator="$v.parameters.password" class="absolute fs-12" style=" top: 10px; right: 15px; z-index: 99;"></validation-error-component>
</div>
</div>
</div>
</div>
</div>
<div class="row m-l-0 m-b-10 animate__animated animate__fadeInUpBig">
<div class="col b-t b-b b-grey animate__animated" :class="[{'animate__shake': $v.parameters.confirmPassword.$error}]" :style="[$v.parameters.confirmPassword.$error ? {'border-bottom': 'solid 2px red !important'} : {}]">
<div class="row align-items-center">
<div class="col no-padding bg-white ">
<div class="input-group transparent">
<span class="input-group-addon no-border">
<i class="fa fa-envelope-o fa-fw p-l-15 p-t-20" style="padding-right: 18px;"></i>
</span>
<input v-model="parameters.confirmPassword" placeholder="Confirm Password" type="password" class="form-control no-border bg-white p-t-35 p-b-35 p-l-0 p-r-0">
<validation-error-component :validator="$v.parameters.confirmPassword" class="absolute fs-12" style=" top: 10px; right: 15px; z-index: 99;"></validation-error-component>
</div>
</div>
</div>
</div>
</div>
<div class="row m-t-30 align-items-center">
<div class="col-auto ml-auto p-r-0 animate__animated animate__fadeInRightBig animate__slow">
<div class="bg-success all-caps text-white p-t-15 p-b-15 p-l-50 p-r-20 bold font-lato pointer fs-12" style="letter-spacing: 4px;" @click="submit(route('api.account.authentication.password.reset'), 'post', section, false , false)">Reset Password</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { required } from "vuelidate/lib/validators";
import request from '../../../general/mixins/request'
export default {
props: {
section:{
type: String,
required: true
},
token:{
type: String,
required: true
}
},
data() {
return {
error: '',
parameters: {
email: '',
confirmPassword:'',
token:this.token,
}
};
},
validations: {
parameters: {
password:{required},
confirmPassword: {required},
token: {required}
}
},
methods:{
successHandler(response){
this.$store.dispatch('toggleSection', {name: 'resetPasswordSuccess', status: true});
this.$store.dispatch('passwordReset', response)
},
errorHandler(error){
this.error = error.message;
}
},
mixins: [request]
}
</script>
@@ -0,0 +1,64 @@
<template>
<div class="col">
<div class="row align-items-center m-b-30">
<div class="col-3 p-l-0">
<div class="font-heading fs-11 bold text-info">Full Name</div>
</div>
<div class="col m-r-50">
<div class="font-heading fs-11 muted" v-text="$store.getters.getUserName"></div>
</div>
<div class="col-auto p-r-0">
<div class="btn btn-xs btn-default bg-master-lighter btn-rounded p-r-20 p-l-15 requestModal" data-type="editFullName">
<i class="fa fa-pencil m-r-10"></i>Edit
</div>
</div>
</div>
<div class="row align-items-center m-b-30">
<div class="col-3 p-l-0">
<div class="font-heading fs-11 bold text-info">Password</div>
</div>
<div class="col m-r-50">
<div class="font-heading fs-11 muted">********</div>
</div>
<div class="col-auto p-r-0">
<div class="btn btn-xs btn-default bg-master-lighter btn-rounded p-r-20 p-l-15 requestModal" data-type="resetPassword">
<i class="fa fa-lock m-r-10"></i>Request Password Reset
</div>
</div>
</div>
<div class="row align-items-center">
<div class="col-3 p-l-0">
<div class="font-heading fs-11 bold text-info">Email Address</div>
</div>
<div class="col m-r-50">
<div class="font-heading fs-11 muted" v-text="$store.getters.getUserEmail"></div>
</div>
<div class="col-auto p-r-0">
<div class="btn btn-xs btn-default bg-master-lighter btn-rounded p-r-20 p-l-15">
<i class="fa fa-envelope-open-o m-r-10"></i>Request Email Change
</div>
</div>
</div>
<modal-component class="animate__animated animate__fast animate__fadeIn" styleType="fill-in" type="editFullName">
<edit-user-profile-fullname-form-component :data="{name: $store.getters.getUserName}" :section="section"></edit-user-profile-fullname-form-component>
</modal-component>
<modal-component class="animate__animated animate__fast animate__fadeIn" styleType="fill-in" type="resetPassword">
<reset-user-password-form-component :data="{email: $store.getters.getUserEmail}" section="resetPassword"></reset-user-password-form-component>
</modal-component>
</div>
</template>
<script>
export default {
props: {
section: {
default: "editFullNameSection",
},
},
};
</script>
@@ -0,0 +1,51 @@
<template>
<div class="row">
<div class="col">
<div class="row">
<div class="col">
<div class="row m-b-10">
<div class="col">
<h3 class="all-caps m-b-5 bold no-margin">Edit Full Name</h3>
</div>
</div>
<div class="row m-b-10">
<div class="col">
<div class="fs-12">Full Name</div>
<validation-wrapper-component :validator="$v.parameters.name">
<input type="text" class="form-control" v-model="parameters.name">
</validation-wrapper-component>
</div>
</div>
<div class="row m-b-5 animate__animated animate__fadeInUpBig animate__fast" v-if="error">
<div class="col">
<small class="bold fs-10 text-danger">{{error}}</small>
</div>
</div>
<div class="row">
<div class="col p-r-5">
<div class="btn btn-sm btn-default bg-master-lightest btn-block b-rad-none" data-dismiss="modal">Cancel</div>
</div>
<div class="col p-l-5">
<div class="btn btn-sm btn-success btn-block b-rad-none" @click="submit(route('api.account.user.update', '1'), 'put', section, true, true)">Update</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import updateProfileFormValidation from '../../../general/mixins/accounts/validation/updateProfileFormValidation';
export default {
data(){
return {
error: '',
parameters: {
name: ''
}
}
},
mixins: [updateProfileFormValidation]
}
</script>
@@ -0,0 +1,44 @@
<template>
<div class="row">
<div class="col">
<div class="row">
<div class="col">
<div class="row m-b-10">
<div class="col">
<h3 class="all-caps m-b-5 bold no-margin">Reset Password</h3>
<p>A reset password link will send to your email account</p>
</div>
</div>
<div class="row m-b-5 animate__animated animate__fadeInUpBig animate__fast" v-if="error">
<div class="col">
<small class="bold fs-10 text-danger">{{error}}</small>
</div>
</div>
<div class="row">
<div class="col p-r-5">
<div class="btn btn-sm btn-default bg-master-lightest btn-block b-rad-none" data-dismiss="modal">Cancel</div>
</div>
<div class="col p-l-5">
<div class="btn btn-sm btn-success btn-block b-rad-none" @click="submit(route('api.account.authentication.password.forget', '1'), 'post', section, true, true)">Confirm</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import resetPasswordFormValidation from '../../../general/mixins/accounts/validation/resetPasswordFormValidation';
export default {
data(){
return {
error: '',
parameters: {
email: ''
}
}
},
mixins: [resetPasswordFormValidation]
}
</script>
@@ -0,0 +1,17 @@
import errorMessageHandler from "../errorMessageHandler";
import formHandler from "../formHandler";
export default {
methods: {
successHandler(response){
this.closeModal();
this.formHandler('');
},
errorHandler(error){
console.log("error" ,error);
this.formHandler(error.message);
}
},
mixins: [errorMessageHandler, formHandler]
}
@@ -0,0 +1,18 @@
import errorMessageHandler from "../errorMessageHandler";
import formHandler from "../formHandler";
export default {
methods: {
successHandler(response){
this.closeModal();
this.formHandler('');
this.$store.dispatch('updateProfile', {fullname:response.payload.data.name});
},
errorHandler(error){
console.log("error" ,error);
this.formHandler(error.message);
}
},
mixins: [errorMessageHandler, formHandler]
}
@@ -0,0 +1,10 @@
import { required } from "vuelidate/lib/validators";
import resetPasswordHandler from "../resetPasswordHandler";
export default {
validations: {
parameters: {
email: { required }
}
},
mixins: [resetPasswordHandler]
};
@@ -0,0 +1,10 @@
import { required } from "vuelidate/lib/validators";
import updateProfileHandler from "../updateProfileHandler";
export default {
validations: {
parameters: {
name: { required }
}
},
mixins: [updateProfileHandler]
};
+6 -2
View File
@@ -1,12 +1,16 @@
export default {
methods: {
routesGuard(){
(!this.$store.getters.isAuthenticated && this.isProtectedRoute()) ? window.location.href = this.route('login') : '';
(this.$store.getters.isAuthenticated && !this.isProtectedRoute()) ? window.location.href = this.route('dashboard') : '';
(!this.$store.getters.isAuthenticated && this.isProtectedRoute()&& this.isWithTokenRoute()) ? window.location.href = this.route('login') : '';
(this.$store.getters.isAuthenticated && !this.isProtectedRoute()&& this.isWithTokenRoute()) ? window.location.href = this.route('dashboard') : '';
},
isProtectedRoute(){
const unprotectedRoutes = [this.route('login'), this.route('account.email.verification')];
return !unprotectedRoutes.includes(window.location.href);
},
isWithTokenRoute(){
const unprotectedRoutesWithToken = [this.route('account.password.reset')];
return !window.location.href.includes(unprotectedRoutesWithToken);
}
}
+22 -2
View File
@@ -2,6 +2,7 @@ import jwt_decode from "jwt-decode";
export default {
state: {
resetPasswordEmail: '',
updatedFullname:localStorage.getItem('updated-fullname') || '',
authentication: {
access_token: localStorage.getItem('user-token') || ''
}
@@ -12,7 +13,7 @@ export default {
isSuperAdmin: (state, getters) => getters.getDecodedAccessToken.user.type === 0 || getters.getDecodedAccessToken.user.type === 1,
isAdmin: (state, getters) => getters.getDecodedAccessToken.user.type === 0 || getters.getDecodedAccessToken.user.type === 1 || getters.getDecodedAccessToken.user.type === 2,
getUserName: (state, getters) => getters.getDecodedAccessToken.user.name,
getUserName: (state, getters) => getters.getUpdatedFullname || getters.getDecodedAccessToken.user.name,
getUserId: (state, getters) => getters.getDecodedAccessToken.user.id,
getUserEmail: (state, getters) => getters.getDecodedAccessToken.user.email,
getCompanyId: (state, getters) => getters.getDecodedAccessToken.user.company_id,
@@ -34,7 +35,8 @@ export default {
}
},
getResetPasswordEmail: state => state.resetPasswordEmail
getResetPasswordEmail: state => state.resetPasswordEmail,
getUpdatedFullname: state => state.updatedFullname
},
mutations: {
SET_AUTHENTICATION(state, {access_token}){
@@ -42,6 +44,9 @@ export default {
},
SET_PASSWORD_RESET_EMAIL(state, {email}){
state.resetPasswordEmail = email;
},
UPDATE_FULL_NAME(state, {fullname}){
state.updatedFullname = fullname;
}
},
actions: {
@@ -65,6 +70,21 @@ export default {
},
passwordResetEmail(store, {email}){
store.commit('SET_PASSWORD_RESET_EMAIL', {email});
store.dispatch('toggleLoading', {name: 'forgetPasswordSection', status: true});
setTimeout(function(){
store.dispatch('toggleLoading', {name: 'forgetPasswordSection', status: false});
}, 2000);
},
passwordReset(store){
store.dispatch('toggleLoading', {name: 'resetPasswordSection', status: true});
},
returnToLoginAfterSendResetPasswordLink(store){
store.dispatch('toggleSection', {name: 'forgetPassword', status: false})
store.dispatch('toggleSection', {name: 'forgetPasswordSuccess', status: false});
},
updateProfile(store, {fullname}){
localStorage.setItem('updated-fullname', fullname);
store.commit('UPDATE_FULL_NAME', {fullname});
}
}
}
+23 -1
View File
@@ -5,7 +5,7 @@
<div class="row" key="1">
<div class="col no-padding" v-show="!$store.getters.isShowing('registrationForm')">
<div class="padding-50 bg-white h-100">
<div class="row">
<div class="row" v-show="!$store.getters.isShowing('forgetPassword')">
<div class="col">
<loading-component style="height: 350px;" key="1" color="primary" v-show="$store.getters.isLoading('loginSection')"></loading-component>
<div class="row" v-show="!$store.getters.isLoading('loginSection')">
@@ -27,6 +27,28 @@
</div>
</div>
</div>
<div class="row" v-show="$store.getters.isShowing('forgetPassword')">
<div class="col">
<loading-component style="height: 350px;" key="1" color="primary" v-show="$store.getters.isLoading('forgetPasswordSection')"></loading-component>
<div class="row" v-show="!$store.getters.isLoading('forgetPasswordSection')">
<div class="col">
<div class="row m-b-15">
<div class="col">
<div class="inline v-align-middle">
<div class="font-heading fs-20 all-caps text-primary no-margin lh-28 bold">Forget Password</div>
<p class="no-margin fs-11 muted light">A reset password link will send to your email account.</p>
</div>
</div>
</div>
<div class="row">
<div class="col">
<forget-password-form-component section="forgetPasswordSection"></forget-password-form-component>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col p-l-0 p-r-0 p-t-15 p-b-15">
@@ -11,7 +11,7 @@
</div>
<div class="row w-100">
<div class="col">
<div class="row">
<div class="row" v-show="!$store.getters.isShowing('resetPassword')">
<div class="col no-padding relative">
<transition-component group enter-class="animate__animated animate__fadeInUpBig animate__faster" leave-class="animate__animated animate__fadeOutRightBig">
<loading-component style="height: 350px;" key="1" color="primary" v-show="$store.getters.isLoading('resetPasswordSection')"></loading-component>
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -64,7 +64,7 @@
</div>
</div>
</div>
<div class="col-auto m-r-5" v-if="$store.getters.isAdmin">
<div class="col-auto m-r-5">
<a href="{{route('settings')}}">
<div class="row align-items-center justify-content-center b-a b-thick h-100" style="border-color: #ffffff3d">
<div class="col p-r-10 p-l-10">
+3 -2
View File
@@ -18,8 +18,8 @@ Route::group(['prefix' => 'account', 'namespace' => 'Accounts', 'as' => 'account
});
Route::group(['prefix' => 'password', 'as' => 'password.'], function () {
// Route::post('/forget', 'GeneratePasswordResetController@generate')->name('forget');
// Route::post('/reset', 'ResetPasswordController@reset')->name('reset');
Route::post('/forget', 'GeneratePasswordResetController@generate')->name('forget');
Route::post('/reset', 'ResetPasswordController@reset')->name('reset');
});
});
@@ -37,5 +37,6 @@ Route::group(['prefix' => 'account', 'namespace' => 'Accounts', 'as' => 'account
Route::group(['prefix' => 'user', 'as' => 'user.'], function () {
Route::post('/show', 'FetchUserController@fetch')->name('show');
Route::get('/list', 'ListUsersController@list')->name('list');
Route::put('/update/{id}', 'UpdateUserController@update')->name('update');
});
});
+4
View File
@@ -21,6 +21,10 @@ Route::get('/account/email/verification/{token}', function ($token) {
return view('pages.accounts.email_verified', ['token' => $token]);
})->name('account.email.verification');
Route::get('/account/password/reset/{token}', function ($token) {
return view('pages.accounts.reset_password', ['token' => $token]);
})->name('account.password.reset');
Route::get('/dashboard', function () {
return view('pages.dashboards.index');
})->name('dashboard');