From 5172e146e125c74a81ef2ad97b205abefebd3789 Mon Sep 17 00:00:00 2001 From: weichien Date: Mon, 17 May 2021 13:47:45 +0800 Subject: [PATCH 01/47] feat: Add module class for update profile feature. --- .../ControllersLogic/UpdateUserLogic.php | 78 +++++++++++++++++++ .../DataTransferObjects/UserObject.php | 30 +++++++ .../Modules/Accounts/Services/UpdatesUser.php | 24 ++++++ .../Standards/Rules/CanUpdateUser.php | 57 ++++++++++++++ .../Validators/UserUpdateValidation.php | 40 ++++++++++ 5 files changed, 229 insertions(+) create mode 100644 app/Classes/Modules/Accounts/ControllersLogic/UpdateUserLogic.php create mode 100644 app/Classes/Modules/Accounts/DataTransferObjects/UserObject.php create mode 100644 app/Classes/Modules/Accounts/Services/UpdatesUser.php create mode 100644 app/Classes/Modules/Accounts/Standards/Rules/CanUpdateUser.php create mode 100644 app/Classes/Modules/Accounts/Standards/Validators/UserUpdateValidation.php diff --git a/app/Classes/Modules/Accounts/ControllersLogic/UpdateUserLogic.php b/app/Classes/Modules/Accounts/ControllersLogic/UpdateUserLogic.php new file mode 100644 index 00000000..7dbfca9e --- /dev/null +++ b/app/Classes/Modules/Accounts/ControllersLogic/UpdateUserLogic.php @@ -0,0 +1,78 @@ + '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()); + } + + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Accounts/DataTransferObjects/UserObject.php b/app/Classes/Modules/Accounts/DataTransferObjects/UserObject.php new file mode 100644 index 00000000..b3988d3a --- /dev/null +++ b/app/Classes/Modules/Accounts/DataTransferObjects/UserObject.php @@ -0,0 +1,30 @@ +name = $name; + } + + /** + * @return string + */ + public function getName(): string + { + return $this->name; + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Accounts/Services/UpdatesUser.php b/app/Classes/Modules/Accounts/Services/UpdatesUser.php new file mode 100644 index 00000000..ef2e8d1a --- /dev/null +++ b/app/Classes/Modules/Accounts/Services/UpdatesUser.php @@ -0,0 +1,24 @@ +name = $object->getName(); + return $this->handler($model); + + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Accounts/Standards/Rules/CanUpdateUser.php b/app/Classes/Modules/Accounts/Standards/Rules/CanUpdateUser.php new file mode 100644 index 00000000..a523ac12 --- /dev/null +++ b/app/Classes/Modules/Accounts/Standards/Rules/CanUpdateUser.php @@ -0,0 +1,57 @@ +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; + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Accounts/Standards/Validators/UserUpdateValidation.php b/app/Classes/Modules/Accounts/Standards/Validators/UserUpdateValidation.php new file mode 100644 index 00000000..9b2f8177 --- /dev/null +++ b/app/Classes/Modules/Accounts/Standards/Validators/UserUpdateValidation.php @@ -0,0 +1,40 @@ + $object->getName(), + ]; + } + + /** + * @return array + */ + protected function rules(): array + { + return [ + 'name' => 'required', + ]; + } + + /** + * @return array + */ + protected function messages(): array + { + return []; + } +} \ No newline at end of file From 5376a2b784ffb9e0d25bc5f0fced3ce3e0004dbb Mon Sep 17 00:00:00 2001 From: weichien Date: Mon, 17 May 2021 17:19:30 +0800 Subject: [PATCH 02/47] feat: add update user update method route. --- routes/account.php | 1 + 1 file changed, 1 insertion(+) diff --git a/routes/account.php b/routes/account.php index 5ce39d98..1525f3fd 100644 --- a/routes/account.php +++ b/routes/account.php @@ -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'); }); }); \ No newline at end of file From 1d25e0f78bae04b7c4263d170bf6655d26b050af Mon Sep 17 00:00:00 2001 From: weichien Date: Mon, 17 May 2021 17:37:43 +0800 Subject: [PATCH 03/47] feat: add edit user fullname component and its corresponding handler function and validator. --- .../elements/UserProfileComponent.vue | 60 +++++++++++++++++++ .../EditUserProfileFullnameFormComponent.vue | 50 ++++++++++++++++ .../mixins/accounts/updateProfileHandler.js | 18 ++++++ .../validation/updateProfileFormValidation.js | 10 ++++ 4 files changed, 138 insertions(+) create mode 100644 resources/assets/vue/components/settings/elements/UserProfileComponent.vue create mode 100644 resources/assets/vue/components/settings/forms/EditUserProfileFullnameFormComponent.vue create mode 100644 resources/assets/vue/general/mixins/accounts/updateProfileHandler.js create mode 100644 resources/assets/vue/general/mixins/accounts/validation/updateProfileFormValidation.js diff --git a/resources/assets/vue/components/settings/elements/UserProfileComponent.vue b/resources/assets/vue/components/settings/elements/UserProfileComponent.vue new file mode 100644 index 00000000..526c68a6 --- /dev/null +++ b/resources/assets/vue/components/settings/elements/UserProfileComponent.vue @@ -0,0 +1,60 @@ + + + diff --git a/resources/assets/vue/components/settings/forms/EditUserProfileFullnameFormComponent.vue b/resources/assets/vue/components/settings/forms/EditUserProfileFullnameFormComponent.vue new file mode 100644 index 00000000..73f5deab --- /dev/null +++ b/resources/assets/vue/components/settings/forms/EditUserProfileFullnameFormComponent.vue @@ -0,0 +1,50 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/accounts/updateProfileHandler.js b/resources/assets/vue/general/mixins/accounts/updateProfileHandler.js new file mode 100644 index 00000000..4979dfd4 --- /dev/null +++ b/resources/assets/vue/general/mixins/accounts/updateProfileHandler.js @@ -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] + +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/accounts/validation/updateProfileFormValidation.js b/resources/assets/vue/general/mixins/accounts/validation/updateProfileFormValidation.js new file mode 100644 index 00000000..8be6ce0b --- /dev/null +++ b/resources/assets/vue/general/mixins/accounts/validation/updateProfileFormValidation.js @@ -0,0 +1,10 @@ +import { required } from "vuelidate/lib/validators"; +import updateProfileHandler from "../updateProfileHandler"; +export default { + validations: { + parameters: { + name: { required } + } + }, + mixins: [updateProfileHandler] +}; From 03b23f3637297661122753d479ab8eec36ba39f8 Mon Sep 17 00:00:00 2001 From: weichien Date: Mon, 17 May 2021 17:39:49 +0800 Subject: [PATCH 04/47] update: manupulate getUserName getter to show updated fullname after success response returned from server. --- resources/assets/vue/vuex/modules/authentication.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/resources/assets/vue/vuex/modules/authentication.js b/resources/assets/vue/vuex/modules/authentication.js index 2fa04b86..6d63f22e 100644 --- a/resources/assets/vue/vuex/modules/authentication.js +++ b/resources/assets/vue/vuex/modules/authentication.js @@ -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,10 @@ export default { }, passwordResetEmail(store, {email}){ store.commit('SET_PASSWORD_RESET_EMAIL', {email}); + }, + updateProfile(store, {fullname}){ + localStorage.setItem('updated-fullname', fullname); + store.commit('UPDATE_FULL_NAME', {fullname}); } } } \ No newline at end of file From 7efcea8eee807afc5e4e7980ff8bf9c656f5cd5a Mon Sep 17 00:00:00 2001 From: weichien Date: Tue, 18 May 2021 16:02:42 +0800 Subject: [PATCH 05/47] fix blade file typo --- app/Classes/Notifications/ResetPasswordEmail.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Classes/Notifications/ResetPasswordEmail.php b/app/Classes/Notifications/ResetPasswordEmail.php index f7a84ab8..d2228e50 100644 --- a/app/Classes/Notifications/ResetPasswordEmail.php +++ b/app/Classes/Notifications/ResetPasswordEmail.php @@ -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]); } From 63ebfc901d65c913fb286a91377eb42b0b6c64d8 Mon Sep 17 00:00:00 2001 From: weichien Date: Sun, 23 May 2021 02:51:56 +0800 Subject: [PATCH 06/47] feat: enable setting button on header and setting page for user. --- resources/views/pages/settings.blade.php | 242 +++++++++------------- resources/views/partials/header.blade.php | 2 +- 2 files changed, 104 insertions(+), 140 deletions(-) diff --git a/resources/views/pages/settings.blade.php b/resources/views/pages/settings.blade.php index 9976e62c..ffb471ce 100644 --- a/resources/views/pages/settings.blade.php +++ b/resources/views/pages/settings.blade.php @@ -1,6 +1,6 @@ @extends('layouts.base_portal') @section('inner_content') -
+
@@ -31,21 +31,23 @@
-
-
-
-
-
-
-
-
- -
-
-
Team
+
@@ -187,46 +189,8 @@
-
-
-
-
Full Name
-
-
-
-
-
-
- Edit -
-
-
-
-
-
Password
-
-
-
********
-
-
-
- Request Password Reset -
-
-
-
-
-
Email Address
-
-
-
-
-
-
- Request Email Change -
-
-
+
+
@@ -457,7 +421,7 @@
-
+
@@ -504,7 +468,7 @@
-
+
diff --git a/resources/views/partials/header.blade.php b/resources/views/partials/header.blade.php index 562bf1e3..f3acab23 100644 --- a/resources/views/partials/header.blade.php +++ b/resources/views/partials/header.blade.php @@ -60,7 +60,7 @@
-
+
From b1ef68e8f681c7f14f60c7f38421e6e2e2d9d84b Mon Sep 17 00:00:00 2001 From: weichien Date: Sun, 23 May 2021 02:54:34 +0800 Subject: [PATCH 07/47] feat: enable route for reset password and forget password --- routes/account.php | 4 ++-- routes/web.php | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/routes/account.php b/routes/account.php index 1525f3fd..f4907313 100644 --- a/routes/account.php +++ b/routes/account.php @@ -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'); }); }); diff --git a/routes/web.php b/routes/web.php index c3c0c925..dbd141c2 100644 --- a/routes/web.php +++ b/routes/web.php @@ -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'); From a51d1dce386dc626a6dd1752d513a02944a94672 Mon Sep 17 00:00:00 2001 From: weichien Date: Sun, 23 May 2021 02:57:14 +0800 Subject: [PATCH 08/47] feat: add reset password and generate reset pasword link controller. --- .../GeneratePasswordResetController.php | 20 +++++++++++++++++++ .../Accounts/ResetPasswordController.php | 20 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 app/Http/Controllers/Accounts/GeneratePasswordResetController.php create mode 100644 app/Http/Controllers/Accounts/ResetPasswordController.php diff --git a/app/Http/Controllers/Accounts/GeneratePasswordResetController.php b/app/Http/Controllers/Accounts/GeneratePasswordResetController.php new file mode 100644 index 00000000..b7e305c7 --- /dev/null +++ b/app/Http/Controllers/Accounts/GeneratePasswordResetController.php @@ -0,0 +1,20 @@ +execute($request); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Accounts/ResetPasswordController.php b/app/Http/Controllers/Accounts/ResetPasswordController.php new file mode 100644 index 00000000..ab20502f --- /dev/null +++ b/app/Http/Controllers/Accounts/ResetPasswordController.php @@ -0,0 +1,20 @@ +execute($request); + } +} \ No newline at end of file From 0886d922a5d2be9fdc5d14c494e5ad141bc59677 Mon Sep 17 00:00:00 2001 From: weichien Date: Sun, 23 May 2021 15:27:04 +0800 Subject: [PATCH 09/47] feat: front-end forget password component and blade update. --- .../forms/ForgetPasswordFormComponent.vue | 43 +++++++++++++------ .../accounts/forms/LoginFormComponent.vue | 2 +- .../views/pages/accounts/login.blade.php | 24 ++++++++++- 3 files changed, 53 insertions(+), 16 deletions(-) diff --git a/resources/assets/vue/components/accounts/forms/ForgetPasswordFormComponent.vue b/resources/assets/vue/components/accounts/forms/ForgetPasswordFormComponent.vue index 6fa4ea8b..ddf52cde 100644 --- a/resources/assets/vue/components/accounts/forms/ForgetPasswordFormComponent.vue +++ b/resources/assets/vue/components/accounts/forms/ForgetPasswordFormComponent.vue @@ -6,27 +6,41 @@ {{error}}
-
-
+
+
-
- - - - - + + +
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+ Your password has been changed successfully +
-
-
-
Back to login
+ +
+
+
Request Reset Link
-
-
Request Reset Link
+
+
Back to login
@@ -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; diff --git a/resources/assets/vue/components/accounts/forms/LoginFormComponent.vue b/resources/assets/vue/components/accounts/forms/LoginFormComponent.vue index 454038a7..2e174168 100644 --- a/resources/assets/vue/components/accounts/forms/LoginFormComponent.vue +++ b/resources/assets/vue/components/accounts/forms/LoginFormComponent.vue @@ -18,7 +18,7 @@
-

Forgot password?

+

Forgot password?

Sign In
diff --git a/resources/views/pages/accounts/login.blade.php b/resources/views/pages/accounts/login.blade.php index 812c56ce..39c81051 100644 --- a/resources/views/pages/accounts/login.blade.php +++ b/resources/views/pages/accounts/login.blade.php @@ -5,7 +5,7 @@
-
+
@@ -27,6 +27,28 @@
+
+
+ +
+
+
+
+
+
Forget Password
+

A reset password link will send to your email account.

+
+
+
+
+
+ +
+
+
+
+
+
From a61d3a37b73c7bd4abaaa847baea41c22e385023 Mon Sep 17 00:00:00 2001 From: weichien Date: Sun, 23 May 2021 15:35:57 +0800 Subject: [PATCH 10/47] feat: front-end add user reset password component. --- .../forms/ResetPasswordFormComponent.vue | 93 +++++++++++++++++++ .../mixins/accounts/resetPasswordHandler.js | 18 ++++ .../validation/resetPasswordFormValidation.js | 10 ++ .../pages/accounts/reset_password.blade.php | 2 +- 4 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 resources/assets/vue/components/accounts/forms/ResetPasswordFormComponent.vue create mode 100644 resources/assets/vue/general/mixins/accounts/resetPasswordHandler.js create mode 100644 resources/assets/vue/general/mixins/accounts/validation/resetPasswordFormValidation.js diff --git a/resources/assets/vue/components/accounts/forms/ResetPasswordFormComponent.vue b/resources/assets/vue/components/accounts/forms/ResetPasswordFormComponent.vue new file mode 100644 index 00000000..33947d06 --- /dev/null +++ b/resources/assets/vue/components/accounts/forms/ResetPasswordFormComponent.vue @@ -0,0 +1,93 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/accounts/resetPasswordHandler.js b/resources/assets/vue/general/mixins/accounts/resetPasswordHandler.js new file mode 100644 index 00000000..ace5e9ed --- /dev/null +++ b/resources/assets/vue/general/mixins/accounts/resetPasswordHandler.js @@ -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] + +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/accounts/validation/resetPasswordFormValidation.js b/resources/assets/vue/general/mixins/accounts/validation/resetPasswordFormValidation.js new file mode 100644 index 00000000..a4f17906 --- /dev/null +++ b/resources/assets/vue/general/mixins/accounts/validation/resetPasswordFormValidation.js @@ -0,0 +1,10 @@ +import { required } from "vuelidate/lib/validators"; +import resetPasswordHandler from "../resetPasswordHandler"; +export default { + validations: { + parameters: { + email: { required } + } + }, + mixins: [resetPasswordHandler] +}; diff --git a/resources/views/pages/accounts/reset_password.blade.php b/resources/views/pages/accounts/reset_password.blade.php index 4fae44b7..a16a540b 100644 --- a/resources/views/pages/accounts/reset_password.blade.php +++ b/resources/views/pages/accounts/reset_password.blade.php @@ -11,7 +11,7 @@
-
+
From 2ed2decf58c85622ed76774c3342bd2a6d35d103 Mon Sep 17 00:00:00 2001 From: weichien Date: Sun, 23 May 2021 15:37:15 +0800 Subject: [PATCH 11/47] feat: front-end add edit fullname and request reset pasword component --- .../elements/UserProfileComponent.vue | 6 ++- .../EditUserProfileFullnameFormComponent.vue | 1 + .../forms/ResetUserPasswordFormComponent.vue | 44 +++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 resources/assets/vue/components/settings/forms/ResetUserPasswordFormComponent.vue diff --git a/resources/assets/vue/components/settings/elements/UserProfileComponent.vue b/resources/assets/vue/components/settings/elements/UserProfileComponent.vue index 526c68a6..d2610144 100644 --- a/resources/assets/vue/components/settings/elements/UserProfileComponent.vue +++ b/resources/assets/vue/components/settings/elements/UserProfileComponent.vue @@ -23,7 +23,7 @@
********
-
+
Request Password Reset
@@ -46,6 +46,10 @@ + + + +
diff --git a/resources/assets/vue/components/settings/forms/EditUserProfileFullnameFormComponent.vue b/resources/assets/vue/components/settings/forms/EditUserProfileFullnameFormComponent.vue index 73f5deab..c427ab16 100644 --- a/resources/assets/vue/components/settings/forms/EditUserProfileFullnameFormComponent.vue +++ b/resources/assets/vue/components/settings/forms/EditUserProfileFullnameFormComponent.vue @@ -10,6 +10,7 @@
+
Full Name
diff --git a/resources/assets/vue/components/settings/forms/ResetUserPasswordFormComponent.vue b/resources/assets/vue/components/settings/forms/ResetUserPasswordFormComponent.vue new file mode 100644 index 00000000..ca22298d --- /dev/null +++ b/resources/assets/vue/components/settings/forms/ResetUserPasswordFormComponent.vue @@ -0,0 +1,44 @@ + + \ No newline at end of file From 9b0213c5afbdfac0f4fffaab68570a67cb2603cf Mon Sep 17 00:00:00 2001 From: weichien Date: Sun, 23 May 2021 15:39:36 +0800 Subject: [PATCH 12/47] update: additional vuex action method on password reset flow. --- resources/assets/vue/vuex/modules/authentication.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/resources/assets/vue/vuex/modules/authentication.js b/resources/assets/vue/vuex/modules/authentication.js index 6d63f22e..f349afa2 100644 --- a/resources/assets/vue/vuex/modules/authentication.js +++ b/resources/assets/vue/vuex/modules/authentication.js @@ -70,6 +70,17 @@ 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); From e392f57df534a59b3c4e0fd1f2b9df58799ff997 Mon Sep 17 00:00:00 2001 From: weichien Date: Sun, 23 May 2021 15:41:32 +0800 Subject: [PATCH 13/47] fix: remove unnecessary dispatch --- .../assets/vue/general/mixins/accounts/resetPasswordHandler.js | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/assets/vue/general/mixins/accounts/resetPasswordHandler.js b/resources/assets/vue/general/mixins/accounts/resetPasswordHandler.js index ace5e9ed..f0e0789c 100644 --- a/resources/assets/vue/general/mixins/accounts/resetPasswordHandler.js +++ b/resources/assets/vue/general/mixins/accounts/resetPasswordHandler.js @@ -6,7 +6,6 @@ export default { successHandler(response){ this.closeModal(); this.formHandler(''); - //this.$store.dispatch('updateProfile', {fullname:response.payload.data.name}); }, errorHandler(error){ console.log("error" ,error); From e926020b580b5e9c776c0cea6a8214d4fd8fea15 Mon Sep 17 00:00:00 2001 From: weichien Date: Mon, 24 May 2021 08:27:02 +0800 Subject: [PATCH 14/47] workaround for path with token --- resources/assets/vue/general/mixins/guards.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/resources/assets/vue/general/mixins/guards.js b/resources/assets/vue/general/mixins/guards.js index 3dbf7f8d..18681e5d 100644 --- a/resources/assets/vue/general/mixins/guards.js +++ b/resources/assets/vue/general/mixins/guards.js @@ -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); } } From e3289b158c2720f0e2813be952dc4d13e5cd5174 Mon Sep 17 00:00:00 2001 From: weichien Date: Mon, 24 May 2021 11:22:14 +0800 Subject: [PATCH 15/47] fix: exlude other setting component for normal user. --- resources/views/pages/settings.blade.php | 384 ++++++++++++----------- 1 file changed, 193 insertions(+), 191 deletions(-) diff --git a/resources/views/pages/settings.blade.php b/resources/views/pages/settings.blade.php index ffb471ce..6bbb779a 100644 --- a/resources/views/pages/settings.blade.php +++ b/resources/views/pages/settings.blade.php @@ -199,219 +199,221 @@
-
-
- -
-
-
-
-
- System's Active Currencies -
-
-
-
-
-
-
-
- Primary Currency -
-
-
-
-
- +
From aa906e710a330edaf465fa683ed6e1937d3a1759 Mon Sep 17 00:00:00 2001 From: Fairuz Date: Tue, 25 May 2021 03:03:36 +0800 Subject: [PATCH 16/47] Fixes for admin can't view document / missing permission --- .../seeds/AdminUserPermissionsTableSeeder.php | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/database/seeds/AdminUserPermissionsTableSeeder.php b/database/seeds/AdminUserPermissionsTableSeeder.php index 0ab43f98..c79dcf1f 100644 --- a/database/seeds/AdminUserPermissionsTableSeeder.php +++ b/database/seeds/AdminUserPermissionsTableSeeder.php @@ -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 @@ -66,29 +66,38 @@ class AdminUserPermissionsTableSeeder extends Seeder /////////////////////////////////////////////////////////////////////// - $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); + //Since same set of permissions, do it one-go at end + //$admin = User::find(1); + //$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); + $admins = User::query()->whereIn('type',Constants\RoleTypes::ADMIN_ROLES)->get(); + foreach ($admins as $admin) { + $admin->assignRole($ultimate_admin_role); + } /////////////////////////////////////////////////////////////////////// } From e1a9606695a1e4fa846f9ab7e2fdc5c31987868d Mon Sep 17 00:00:00 2001 From: Fairuz Date: Tue, 25 May 2021 11:47:27 +0800 Subject: [PATCH 17/47] Fixes for admin can't view document / missing permission --- .../seeds/AdminUserPermissionsTableSeeder.php | 113 +++++++++++------- 1 file changed, 73 insertions(+), 40 deletions(-) diff --git a/database/seeds/AdminUserPermissionsTableSeeder.php b/database/seeds/AdminUserPermissionsTableSeeder.php index c79dcf1f..fca79e46 100644 --- a/database/seeds/AdminUserPermissionsTableSeeder.php +++ b/database/seeds/AdminUserPermissionsTableSeeder.php @@ -19,50 +19,56 @@ 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); + } /////////////////////////////////////////////////////////////////////// @@ -77,10 +83,14 @@ class AdminUserPermissionsTableSeeder extends Seeder $shadow_admin_role->givePermissionTo(Permission::all()); - //Since same set of permissions, do it one-go at end + //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::updateOrCreate( @@ -94,11 +104,34 @@ class AdminUserPermissionsTableSeeder extends Seeder $ultimate_admin_role->givePermissionTo(Permission::all()); - $admins = User::query()->whereIn('type',Constants\RoleTypes::ADMIN_ROLES)->get(); - foreach ($admins as $admin) { - $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); } + $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); + } /////////////////////////////////////////////////////////////////////// } } From b32d5ae2c0274a177e4ff6eceecbb42d4cf197d7 Mon Sep 17 00:00:00 2001 From: Fairuz Date: Tue, 25 May 2021 12:35:42 +0800 Subject: [PATCH 18/47] Fixes for admin can't view document / missing permission --- .../Modules/Documents/Standards/Rules/CanListDocuments.php | 4 +++- database/seeds/AdminUserPermissionsTableSeeder.php | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/Classes/Modules/Documents/Standards/Rules/CanListDocuments.php b/app/Classes/Modules/Documents/Standards/Rules/CanListDocuments.php index d94068b7..f5145df6 100644 --- a/app/Classes/Modules/Documents/Standards/Rules/CanListDocuments.php +++ b/app/Classes/Modules/Documents/Standards/Rules/CanListDocuments.php @@ -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; diff --git a/database/seeds/AdminUserPermissionsTableSeeder.php b/database/seeds/AdminUserPermissionsTableSeeder.php index fca79e46..132184d7 100644 --- a/database/seeds/AdminUserPermissionsTableSeeder.php +++ b/database/seeds/AdminUserPermissionsTableSeeder.php @@ -109,6 +109,7 @@ class AdminUserPermissionsTableSeeder extends Seeder $super_admin->assignRole($ultimate_admin_role); } + /* Disable normal admin role for now, will comeback later to this $admin_role = Role::updateOrCreate( ['name' => 'Admin'], [ @@ -132,6 +133,7 @@ class AdminUserPermissionsTableSeeder extends Seeder foreach ($admins as $admin) { $admin->assignRole($admin_role); } + */ /////////////////////////////////////////////////////////////////////// } } From 897f46b84d77e1481a784b47dba9b3c5057eaa2e Mon Sep 17 00:00:00 2001 From: omair saleh Date: Wed, 26 May 2021 14:03:09 +0800 Subject: [PATCH 19/47] add temporary button to show quick view for the customer details in the customers list --- .../elements/CompanyListComponent.vue | 5 +++-- .../CompanyQuickViewSectionComponent.vue | 20 +++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/resources/assets/vue/components/companies/elements/CompanyListComponent.vue b/resources/assets/vue/components/companies/elements/CompanyListComponent.vue index e3da2853..9fe3c96a 100644 --- a/resources/assets/vue/components/companies/elements/CompanyListComponent.vue +++ b/resources/assets/vue/components/companies/elements/CompanyListComponent.vue @@ -1,13 +1,14 @@