mirror of
https://gitlab.com/CIEFWorldwideSdnBhd/exchange-2.0.git
synced 2026-08-21 21:43:57 +00:00
Merge branch 'master' into '152_annoucment'
merge master to my working branch See merge request CIEFWorldwideSdnBhd/exchange-2.0!49
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\General\Eloquent\Filters;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class IssuerIn implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Builder $builder
|
||||
* @param $value
|
||||
* @return Builder|mixed
|
||||
*/
|
||||
public static function apply(Builder $builder, $value)
|
||||
{
|
||||
return $builder->whereIn('issuer', $value);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounts\ControllersLogic;
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
|
||||
use App\Classes\Modules\Accounts\Standards\Rules\CanCreateUser;
|
||||
use App\Classes\Modules\Accounts\Services\CreatesUser;
|
||||
use App\Classes\Modules\Accounts\DataTransferObjects\RegistrationObject;
|
||||
use App\Http\Resources\UserResource;
|
||||
use App\Classes\ValueObjects\Constants\RoleTypes;
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
|
||||
use ErrorException;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class CreateAdminUserLogic extends AbstractControllerLogic
|
||||
{
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Created Account',
|
||||
'message' => 'You have successfully created a new Account'
|
||||
];
|
||||
}
|
||||
|
||||
/** @var CanCreateUser */
|
||||
private $canCreateUser;
|
||||
|
||||
/** @var CreatesUser */
|
||||
private $createsUser;
|
||||
|
||||
|
||||
/**
|
||||
* CreateUserLogic constructor.
|
||||
* @param CanCreateUser $canCreateUser
|
||||
* @param CreatesUser $createsUser
|
||||
*/
|
||||
public function __construct(
|
||||
CanCreateUser $canCreateUser,
|
||||
CreatesUser $createsUser
|
||||
)
|
||||
{
|
||||
$this->canCreateUser = $canCreateUser;
|
||||
$this->createsUser = $createsUser;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
* @throws \App\Classes\Exceptions\AccessForbiddenException
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
* @throws \App\Classes\Exceptions\RequestValidationException
|
||||
*/
|
||||
public function logic(Request $request) : JsonResponse
|
||||
{
|
||||
|
||||
$user_object = new RegistrationObject($request->input('name'), $request->input('email'),
|
||||
$request->input('password'), $request->input('password_confirmation'),
|
||||
RoleTypes::ADMIN, ApprovalStatus::APPROVED);
|
||||
|
||||
$this->canCreateUser->passes($user_object);
|
||||
|
||||
$user = $this->createsUser->execute($user_object);
|
||||
|
||||
return $this->resourceResponse(new UserResource($user));
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounts\ControllersLogic;
|
||||
|
||||
use App\Http\Resources\UserResource;
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
|
||||
use App\Classes\Modules\Accounts\Services\FetchesUser;
|
||||
|
||||
use App\Classes\Modules\Accounts\Standards\Rules\CanDeleteUser;
|
||||
use App\Classes\Modules\Accounts\Services\DeletesUser;
|
||||
|
||||
use ErrorException;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class DeleteUserLogic extends AbstractControllerLogic
|
||||
{
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function notification():array {
|
||||
return [
|
||||
'title' => 'Delete User',
|
||||
'message' => 'You have successfully deleted the User'
|
||||
];
|
||||
}
|
||||
|
||||
/** @var CanDeleteUser */
|
||||
private $canDeleteUser;
|
||||
|
||||
/** @var DeletesUser */
|
||||
private $deletesUser;
|
||||
|
||||
/** @var FetchesUser */
|
||||
private $fetchesUser;
|
||||
|
||||
|
||||
public function __construct(
|
||||
CanDeleteUser $canDeleteUser,
|
||||
DeletesUser $deletesUser,
|
||||
FetchesUser $fetchesUser
|
||||
)
|
||||
{
|
||||
$this->canDeleteUser = $canDeleteUser;
|
||||
$this->deletesUser = $deletesUser;
|
||||
$this->fetchesUser = $fetchesUser;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return JsonResponse
|
||||
* @throws ErrorException
|
||||
*/
|
||||
public function logic(Request $request) : JsonResponse
|
||||
{
|
||||
try {
|
||||
DB::beginTransaction();
|
||||
|
||||
$user = $this->fetchesUser->execute(['id' => $request->route('id')]);
|
||||
$this->canDeleteUser->passes();
|
||||
$this->deletesUser->execute($user);
|
||||
|
||||
DB::commit();
|
||||
|
||||
return $this->resourceResponse(new UserResource($user));
|
||||
|
||||
} catch (\Exception $exception){
|
||||
throw new ErrorException($exception->getMessage(), $exception->getCode());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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,99 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounts\DataTransferObjects;
|
||||
|
||||
use App\Classes\General\Interfaces\DataTransferObject;
|
||||
use App\Classes\ValueObjects\Constants\ApprovalStatus;
|
||||
use App\Classes\ValueObjects\Constants\RoleTypes;
|
||||
|
||||
class UserObject implements DataTransferObject
|
||||
{
|
||||
/** @var string */
|
||||
private $name;
|
||||
|
||||
/** @var string */
|
||||
private $email;
|
||||
|
||||
/** @var string */
|
||||
private $password;
|
||||
|
||||
/** @var string */
|
||||
private $passwordConfirmation;
|
||||
|
||||
/** @var int|null */
|
||||
private $type;
|
||||
|
||||
/** @var int|null */
|
||||
private $status;
|
||||
|
||||
/**
|
||||
* UserObject constructor.
|
||||
* @param string $name
|
||||
* @param string $email
|
||||
* @param string $password
|
||||
* @param string $passwordConfirmation
|
||||
* @param int|null $type
|
||||
* @param int|null $status
|
||||
*/
|
||||
public function __construct(string $name, string $email, string $password, string $passwordConfirmation, ?int $type = RoleTypes::USER, ?int $status = ApprovalStatus::PENDING_VERIFICATION)
|
||||
{
|
||||
$this->name = $name;
|
||||
$this->email = $email;
|
||||
$this->password = $password;
|
||||
$this->passwordConfirmation = $passwordConfirmation;
|
||||
$this->type = $type;
|
||||
$this->status = $status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getName(): string
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getEmail(): string
|
||||
{
|
||||
return $this->email;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getPassword(): string
|
||||
{
|
||||
return $this->password;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getPasswordConfirmation(): string
|
||||
{
|
||||
return $this->passwordConfirmation;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getType(): int
|
||||
{
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getStatus(): int
|
||||
{
|
||||
return $this->status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -51,7 +51,6 @@ class AuthenticationProcessor
|
||||
* @return array
|
||||
* @throws \App\Classes\Exceptions\AccessForbiddenException
|
||||
* @throws \App\Classes\Exceptions\AccessUnauthorisedException
|
||||
* @throws \App\Classes\Exceptions\InternalServerErrorException
|
||||
* @throws \App\Classes\Exceptions\RequestValidationException
|
||||
*/
|
||||
public function execute(Request $request): array {
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounts\Services;
|
||||
|
||||
use App\Classes\General\Eloquent\AbstractDeleteRecord;
|
||||
use App\Models\User;
|
||||
|
||||
class DeletesUser extends AbstractDeleteRecord
|
||||
{
|
||||
|
||||
/**
|
||||
* @param User $model
|
||||
* @return mixed
|
||||
* @throws \App\Classes\Exceptions\MalformedRequestException
|
||||
*/
|
||||
public function execute(User $model) {
|
||||
return $this->handler($model);
|
||||
}
|
||||
}
|
||||
@@ -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\RegistrationObject;
|
||||
use App\Classes\Modules\Accounts\Standards\Validators\UserCreateValidation;
|
||||
|
||||
class CanCreateUser extends AbstractRule
|
||||
{
|
||||
|
||||
/** @var UserCreateValidation */
|
||||
private $userCreateValidation;
|
||||
|
||||
/**
|
||||
* CanCreateAddress constructor.
|
||||
* @param UserCreateValidation $userCreateValidation
|
||||
*/
|
||||
public function __construct(UserCreateValidation $userCreateValidation)
|
||||
{
|
||||
$this->userCreateValidation = $userCreateValidation;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
protected function authorized(): bool
|
||||
{
|
||||
// TODO Set Authorization rules
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param RegistrationObject $object
|
||||
* @return bool
|
||||
* @throws \App\Classes\Exceptions\RequestValidationException
|
||||
*/
|
||||
protected function validators($object): bool
|
||||
{
|
||||
return $this->userCreateValidation->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\Rules;
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractRule;
|
||||
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject;
|
||||
|
||||
class CanDeleteUser extends AbstractRule
|
||||
{
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
protected function authorized(): bool
|
||||
{
|
||||
// TODO Set Authorization rules
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param UserObject $object
|
||||
* @return bool
|
||||
*/
|
||||
protected function validators($object): bool
|
||||
{
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param UserObject $object
|
||||
* @return bool
|
||||
*/
|
||||
protected function criteria($object): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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,44 @@
|
||||
<?php
|
||||
|
||||
namespace App\Classes\Modules\Accounts\Standards\Validators;
|
||||
|
||||
use App\Classes\General\Abstracts\AbstractValidation;
|
||||
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject;
|
||||
|
||||
class UserCreateValidation extends AbstractValidation
|
||||
{
|
||||
|
||||
|
||||
/**
|
||||
* @param UserObject $object
|
||||
* @return array
|
||||
*/
|
||||
protected function data($object): array
|
||||
{
|
||||
return [
|
||||
'name' => $object->getName(),
|
||||
'email' => $object->getEmail(),
|
||||
'password' => $object->getPassword(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function rules(): array
|
||||
{
|
||||
return [
|
||||
'name' => 'required',
|
||||
'email' => 'required|unique:users',
|
||||
'password' => 'required',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function messages(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -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 [];
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ namespace App\Classes\Modules\Addresses\ControllersLogic;
|
||||
use App\Classes\General\Abstracts\AbstractControllerLogic;
|
||||
use App\Classes\Modules\Addresses\Services\UpdatesAddress;
|
||||
use App\Classes\Modules\Addresses\Services\FetchesAddress;
|
||||
use App\Classes\Modules\Addresses\Services\FetchesDistrict;
|
||||
use App\Classes\Modules\Addresses\Standards\Rules\CanUpdateAddress;
|
||||
use App\Classes\Modules\Addresses\DataTransferObjects\AddressObject;
|
||||
use App\Http\Resources\AddressResource;
|
||||
@@ -35,17 +36,22 @@ class UpdateAddressLogic extends AbstractControllerLogic
|
||||
/** @var FetchesAddress */
|
||||
private $fetchesAddress;
|
||||
|
||||
/** @var FetchesDistrict */
|
||||
private $fetchesDistrict;
|
||||
|
||||
/**
|
||||
* UpdateAddressLogic constructor.
|
||||
* @param CanUpdateAddress $canUpdateAddress
|
||||
* @param UpdatesAddress $updatesAddress
|
||||
* @param FetchesAddress $fetchesAddress
|
||||
* @param FetchesDistrict $fetchesDistrict
|
||||
*/
|
||||
public function __construct(CanUpdateAddress $canUpdateAddress, UpdatesAddress $updatesAddress, FetchesAddress $fetchesAddress)
|
||||
public function __construct(CanUpdateAddress $canUpdateAddress, UpdatesAddress $updatesAddress, FetchesAddress $fetchesAddress, FetchesDistrict $fetchesDistrict)
|
||||
{
|
||||
$this->canUpdateAddress = $canUpdateAddress;
|
||||
$this->updatesAddress = $updatesAddress;
|
||||
$this->fetchesAddress = $fetchesAddress;
|
||||
$this->fetchesDistrict = $fetchesDistrict;
|
||||
}
|
||||
|
||||
|
||||
@@ -58,7 +64,9 @@ class UpdateAddressLogic extends AbstractControllerLogic
|
||||
{
|
||||
try {
|
||||
|
||||
$object = new AddressObject($request->input('company_id'), $request->input('street_one'), $request->input('street_two'), $request->input('city'), $request->input('state'), $request->input('post_code'), $request->input('country'), $request->input('default'), $request->input('billing'));
|
||||
$district = $this->fetchesDistrict->execute(['id' => $request->input('district_id')]);
|
||||
$object = new AddressObject($request->input('street_one'), $request->input('street_two'), $district->country_id, $district->state_id, $district->id, $request->input('post_code'));
|
||||
//$object = new AddressObject($request->input('company_id'), $request->input('street_one'), $request->input('street_two'), $request->input('city'), $request->input('state'), $request->input('post_code'), $request->input('country'), $request->input('default'), $request->input('billing'));
|
||||
|
||||
$this->canUpdateAddress->passes($object);
|
||||
|
||||
|
||||
@@ -17,15 +17,15 @@ class UpdatesAddress extends AbstractUpdateRecord
|
||||
*/
|
||||
public function execute(Address $model, AddressObject $object) {
|
||||
|
||||
$model->company_id = $object->getCompanyId();
|
||||
//$model->company_id = $object->getCompanyId();
|
||||
$model->street_one = $object->getStreetOne();
|
||||
$model->street_two = $object->getStreetTwo();
|
||||
$model->city = $object->getCity();
|
||||
$model->state = $object->getState();
|
||||
$model->post_code = $object->getPostCode();
|
||||
$model->country = $object->getCountry();
|
||||
$model->default = $object->getDefault();
|
||||
$model->billing = $object->getBilling();
|
||||
$model->district_id = $object->getDistrictId();
|
||||
$model->state_id = $object->getStateId();
|
||||
$model->postcode = $object->getPostCode();
|
||||
$model->country_id = $object->getCountryId();
|
||||
//$model->default = $object->getDefault();
|
||||
//$model->billing = $object->getBilling();
|
||||
|
||||
return $this->handler($model);
|
||||
|
||||
|
||||
@@ -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,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Accounts;
|
||||
|
||||
|
||||
use App\Classes\Modules\Accounts\ControllersLogic\CreateAdminUserLogic;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class CreateAdminUserController
|
||||
{
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @param CreateAdminUserLogic $logic
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function create(Request $request, CreateAdminUserLogic $logic): JsonResponse {
|
||||
return $logic->execute($request);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Accounts;
|
||||
|
||||
use App\Classes\Modules\Accounts\ControllersLogic\DeleteUserLogic;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class DeleteUserController
|
||||
{
|
||||
/**
|
||||
* @param Request $request
|
||||
* @param DeleteUserLogic $logic
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function delete(Request $request, DeleteUserLogic $logic): JsonResponse {
|
||||
return $logic->execute($request);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Bookings;
|
||||
namespace App\Http\Controllers\Accounts;
|
||||
|
||||
use App\Classes\Modules\Bookings\ControllersLogic\DeleteBookingLogic;
|
||||
use App\Classes\Modules\Accounts\ControllersLogic\DeleteBookingLogic;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\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>
|
||||
@@ -12,7 +12,7 @@
|
||||
<div class="col">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<span class="fs-10 muted">{{address.street_one}} {{address.street_two}} {{address.city}} {{address.state}} {{address.post_code}} {{address.country}}</span>
|
||||
<span class="fs-10 muted">{{address.street_one}} {{address.street_two}} {{address.city}} {{address.state.name}} {{address.post_code}} {{address.country.name}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -20,7 +20,7 @@
|
||||
<div class="row h-100">
|
||||
<div class="col">
|
||||
<div class="row no-margin">
|
||||
<div class="col-auto text-right p-t-10 p-b-10 bg-master-lightest m-r-5 ml-auto">
|
||||
<div class="col-auto text-right p-t-10 p-b-10 bg-master-lightest m-r-5 ml-auto" @click="deleteAddress(address.id)">
|
||||
<a class="requestModal pointer" data-type="delete">
|
||||
<div data-toggle="tooltip" title="" data-placement="bottom" class="row link align-items-center justify-content-center" data-original-title="Delete">
|
||||
<div class="col">
|
||||
@@ -29,7 +29,7 @@
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-auto text-right p-t-10 p-b-10 bg-master-lightest">
|
||||
<div class="col-auto text-right p-t-10 p-b-10 bg-master-lightest" @click="updateAddress(address.id)">
|
||||
<a class="pointer">
|
||||
<div data-toggle="tooltip" title="" data-placement="bottom" class="row link align-items-center justify-content-center" data-original-title="Delete">
|
||||
<div class="col">
|
||||
@@ -45,29 +45,33 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-4 m-l-15 d-flex align-items-center">
|
||||
<div class="row align-items-center" :class="[{'requestModal': !address.default}, {'pointer': !address.default}, {'link': !address.default}]" data-type="setDefault">
|
||||
<div class="col-auto text-right p-t-5 p-b-5" :class="[{'bg-warning-lighter': address.default}, {'bg-master-light': !address.default}]">
|
||||
<div data-toggle="tooltip" class="row align-items-center justify-content-center" :class="{'link': !address.default}">
|
||||
<div class="row align-items-center" :class="[{'requestModal': !address.billing}, {'pointer': !address.billing}, {'link': !address.billing}]" data-type="setDefault" @click="!address.billing ? setDefaultAddress() : null">
|
||||
<div class="col-auto text-right p-t-5 p-b-5" :class="[{'bg-warning-lighter': address.billing}, {'bg-master-light': !address.billing}]">
|
||||
<div data-toggle="tooltip" class="row align-items-center justify-content-center" :class="{'link': !address.billing}">
|
||||
<div class="col">
|
||||
<i class="fa fa-star" :class="[{'text-warning': address.default}, {'text-master': !address.default}]"></i>
|
||||
<i class="fa fa-star" :class="[{'text-warning': address.billing}, {'text-master': !address.billing}]"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col bg-white p-t-5 p-b-5">
|
||||
<small class="fs-12 all-caps bold" :class="[{'text-warning': address.default}, {'text-master': !address.default}]">Default Address</small>
|
||||
<small class="fs-12 all-caps bold" :class="[{'text-warning': address.billing}, {'text-master': !address.billing}]">Default Address</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import FormHandler from '../../../general/mixins/formHandler';
|
||||
|
||||
export default {
|
||||
props: {
|
||||
'data': {
|
||||
type: Object,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
@@ -79,6 +83,20 @@
|
||||
this.address = this.data;
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
setDefaultAddress(){
|
||||
this.submit(route('api.address.default',this.address.id), 'put', this.section, true, true);
|
||||
},
|
||||
updateAddress(id){
|
||||
this.$root.$emit('updateAddressForm', this.address, true);
|
||||
},
|
||||
deleteAddress(id){
|
||||
this.$root.$emit('deleteAddressConfirm', id);
|
||||
},
|
||||
successHandler(){
|
||||
this.$store.dispatch('reloadList', {'name': "addresslist"});
|
||||
}
|
||||
},
|
||||
mixins: [FormHandler]
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,54 @@
|
||||
<template>
|
||||
<div class="row m-b-10 parentContainer">
|
||||
<div class="col">
|
||||
<div class="row align-items-center">
|
||||
<div class="col p-t-5 p-b-5">
|
||||
<div class="col text-center">
|
||||
<div class="row m-b-20">
|
||||
<div class="col">
|
||||
<h5 class="all-caps">Delete address</h5>
|
||||
<div class="fs-11">Are you sure you want to delete? This action is undoable.</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col p-r-5">
|
||||
<div data-dismiss="modal" class="btn btn-sm btn-default bg-master-lighter btn-block b-rad-none">Cancel</div>
|
||||
</div>
|
||||
<div class="col p-l-5">
|
||||
<div data-dismiss="modal" class="btn btn-sm btn-success btn-block b-rad-none" @click="deleteAddress()">Delete</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import componentHandler from '../../../general/mixins/componentHandler';
|
||||
import staticFormHandler from '../../../general/mixins/staticFormHandler'
|
||||
export default {
|
||||
props: {
|
||||
'address_id' : {
|
||||
type: Number,
|
||||
required:true,
|
||||
},
|
||||
},
|
||||
data(){
|
||||
return {
|
||||
parameters:null,
|
||||
isLoading: false,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
deleteAddress(){
|
||||
this.submit(route('api.address.delete',this.address_id), 'delete', this.section, true, true);
|
||||
},
|
||||
successHandler(){
|
||||
this.$store.dispatch('reloadList', {'name': "addresslist"});
|
||||
},
|
||||
},
|
||||
mixins: [componentHandler, staticFormHandler]
|
||||
}
|
||||
</script>
|
||||
@@ -39,7 +39,8 @@
|
||||
<div class="col">
|
||||
<div class="row">
|
||||
<div class="col text-right">
|
||||
<button type="button" class="btn btn-sm btn-success b-rad-none" @click="submitForm()">Create Billing Address</button>
|
||||
<button type="button" class="btn btn-sm btn-success b-rad-none" @click="submitForm()">{{(this.type==3)?"Update":"Create"}} Billing Address</button>
|
||||
<button v-show="this.type==3" type="button" class="btn btn-sm bg-master-lighter b-rad-none m-l-5" @click="closeForm()">Cancel</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -56,20 +57,36 @@
|
||||
required: true
|
||||
},
|
||||
type: {
|
||||
//Npte: type 1 = create, type 2 = update set default, type 3 = update address
|
||||
type: Number,
|
||||
default: 1
|
||||
},
|
||||
addressData: {
|
||||
type: Object,
|
||||
default: {},
|
||||
required:false
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
'id': function() {
|
||||
this.parameters.company_id = this.id;
|
||||
},
|
||||
'addressData': function() {
|
||||
this.resetForm();
|
||||
this.parameters = {
|
||||
company_id: this.id,
|
||||
street_one: this.addressData.street_one,
|
||||
street_two: this.addressData.street_two,
|
||||
district_id: this.addressData.district.id,
|
||||
post_code: this.addressData.post_code,
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
parameters : {
|
||||
company_id: this.id,
|
||||
street_one: '',
|
||||
street_one: '',
|
||||
street_two: '',
|
||||
district_id: '',
|
||||
post_code: '',
|
||||
@@ -87,11 +104,23 @@
|
||||
},
|
||||
methods:{
|
||||
submitForm(){
|
||||
this.submit((this.route('api.address.create')), 'post', 'bookingDetailSection', true, true)
|
||||
if(this.type==3){
|
||||
this.submit((this.route('api.address.update',this.addressData.id)), 'put', 'bookingDetailSection', true, true)
|
||||
}else {
|
||||
this.submit((this.route('api.address.create')), 'post', 'bookingDetailSection', true, true)
|
||||
}
|
||||
},
|
||||
closeForm(){
|
||||
this.$root.$emit('updateAddressForm', {}, false);
|
||||
},
|
||||
successHandler(response){
|
||||
this.type !== 2 ? this.$emit('updateDefaultAddress', response.payload.data) : this.$emit('createdAddress', response.payload.data);
|
||||
this.resetForm();
|
||||
if(this.type==3){
|
||||
this.closeForm();
|
||||
this.$store.dispatch('reloadList', {'name': "addresslist"});
|
||||
}else {
|
||||
this.type !== 2 ? this.$emit('updateDefaultAddress', response.payload.data) : this.$emit('createdAddress', response.payload.data);
|
||||
this.resetForm();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
<div class="row m-b-10">
|
||||
<div class="col">
|
||||
<validation-wrapper-component :validator="$v.parameters.bank_branch">
|
||||
<label class="muted">Bank Branch</label>
|
||||
<label class="muted">Bank Branch / 所在地</label>
|
||||
<input type="text" class="form-control" v-model="parameters.bank_branch">
|
||||
</validation-wrapper-component>
|
||||
</div>
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<div class="col" v-if="$store.getters.isAdmin">
|
||||
<div class="font-heading fs-10 muted all-caps">Marking</div>
|
||||
<div class="font-heading fs-12">
|
||||
{{this.item.company.reference}}
|
||||
<a :href="route('customer.profile', item.company.id)">{{this.item.company.reference}}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
{{item.original_currency.short_code}} {{(Math.round((item.original_amount + Number.EPSILON) * 100) / 100).toFixed(2).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",")}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto text-right">
|
||||
<div v-if="!no_action" class="col-auto text-right">
|
||||
<button class="btn btn-xs btn-outline-danger b-rad-none m-r-5 requestModal" data-type="rejectPayment">
|
||||
<i class="fa fa-times fa-fw"></i>
|
||||
</button>
|
||||
@@ -132,6 +132,9 @@
|
||||
import componentHandler from '../../../general/mixins/componentHandler';
|
||||
import staticFormHandler from '../../../general/mixins/staticFormHandler'
|
||||
export default {
|
||||
props: {
|
||||
no_action: Boolean
|
||||
},
|
||||
methods: {
|
||||
approvePayment(status){
|
||||
this.isLoading = true;
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@
|
||||
<div class="col-8 p-r-0">
|
||||
<div class="btn btn-xs btn-outline-primary btn-block text-left b-rad-none p-t-0 p-b-0 p-l-15 p-r-15" @click="selectedSupplier.status = !selectedSupplier.status">
|
||||
<div class="row">
|
||||
<div class="col p-t-5 p-b-5">
|
||||
<div class="col p-t-5 p-b-5 fs-9">
|
||||
{{selectedSupplier.name}}
|
||||
</div>
|
||||
<div class="col-auto b-l b-success">
|
||||
|
||||
@@ -1,13 +1,6 @@
|
||||
<template>
|
||||
<div class="row align-items-center m-b-10 parentContainer">
|
||||
<div class="container p-0 m-0" @click="backToCompanyList()">
|
||||
<i class="fa fa-arrow-left fs-11 align-middle"></i>
|
||||
<span class="fs-11 m-0 align-middle pl-2 text-uppercase">Back to list</span>
|
||||
</div>
|
||||
<div class="row w-100 m-0 p-0">
|
||||
<div class="col-auto p-0 pt-2 m-b-10" :style="minWidth">
|
||||
<div class="h5 m-0">{{this.company_details.name ? this.company_details.name : ""}}</div>
|
||||
</div>
|
||||
<div class="row w-100 m-0 p-0" v-show="!displayAddressForm">
|
||||
<div class="col-12 p-0">
|
||||
<label class="muted" :style="minWidth">Reference</label>
|
||||
<label>{{this.company_details.reference ? this.company_details.reference : ""}}</label>
|
||||
@@ -16,6 +9,10 @@
|
||||
<label class="muted" :style="minWidth">Business Type</label>
|
||||
<label>{{this.company_details.business_type ? getBusinessTypeDesc(this.company_details.business_type) : ""}}</label>
|
||||
</div>
|
||||
<div class="col-12 p-0">
|
||||
<label class="muted" :style="minWidth">Email</label>
|
||||
<label><i class="fa fa-envelope text-primary fs-10"></i> {{this.company_details.employee ? this.company_details.employee.email : ""}}</label>
|
||||
</div>
|
||||
<div class="col-12 p-0">
|
||||
<label class="muted" :style="minWidth">Contacts</label>
|
||||
<label><i class="fa fa-envelope text-primary fs-10"></i> {{this.company_details.contact ? this.company_details.contact.email : ""}}</label>
|
||||
@@ -24,14 +21,47 @@
|
||||
<label class="muted" :style="minWidth"> </label>
|
||||
<label><i class="fa fa-phone text-primary fs-10"></i> {{this.company_details.contact ? this.company_details.contact.phone : ""}}</label>
|
||||
</div>
|
||||
<div class="col-12 p-0">
|
||||
<label class="muted" :style="minWidth">Total Booking</label>
|
||||
<label>{{this.company_details.bookings ? this.company_details.bookings.length : ""}}</label>
|
||||
<div class="col-12 p-0" v-if="this.company_details.identification && this.company_details.identification.document_type">
|
||||
<label class="muted pull-left" :style="minWidth">Identification</label>
|
||||
<div class="col-4 pull-left p-l-0 p-b-5">
|
||||
<label>{{ this.company_details.identification.document_type === 'IDENTITY_CARD' ? 'IC' : 'SSM Registration' }}</label>
|
||||
<div class="row no-margin pull-right">
|
||||
<div v-for="file in this.company_details.identification.files" v-bind:key="file.id" class="col-auto no-padding m-r-5">
|
||||
<document-file-viewer-component :file="file">
|
||||
<template slot="button">
|
||||
<div class="icon-thumbnail fs-11 text-white icon-25 bg-primary btn-rounded float-left m-r-5">
|
||||
<i class="fa fa-file-image-o fs-10"></i>
|
||||
</div>
|
||||
</template>
|
||||
</document-file-viewer-component>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 p-0">
|
||||
<label class="muted m-b-0" :style="minWidth">Address </label>
|
||||
</div>
|
||||
<div class="col-12 b-t b-b b-grey p-t-5 p-b-5 m-t-5 m-b-5 p-l-0 p-r-0">
|
||||
<list-component key="2" section="addresslist" :endpoint="route('api.address.list')" :options="{'company_id':this.company_details.id}" v-if="this.company_details.id">
|
||||
<template slot="list" slot-scope="{data}">
|
||||
<address-component :data="data" section="addressListItem"></address-component>
|
||||
</template>
|
||||
</list-component>
|
||||
</div>
|
||||
<div class="col-12 p-0" style="width: 500px; height:350px">
|
||||
<canvas id="booking-chart"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col" v-show="this.displayAddressForm">
|
||||
<div>Address form</div>
|
||||
<address-form-component :id="parseInt(this.company_details.id)" :type="3" :addressData="this.address" v-if="this.company_details.id"></address-form-component>
|
||||
</div>
|
||||
|
||||
<modal-component id="deleteAddressModal">
|
||||
<address-modal-component section="deleteAddressModal" :address_id="this.address_id"></address-modal-component>
|
||||
</modal-component>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -46,6 +76,20 @@
|
||||
required:true
|
||||
},
|
||||
},
|
||||
mounted(){
|
||||
this.$root.$on('deleteAddressConfirm', (id) => {
|
||||
this.address_id=id;
|
||||
$("#deleteAddressModal").closest('.modal').modal('show');
|
||||
});
|
||||
this.$root.$on('updateAddressForm', (address, show) => {
|
||||
if(show) {
|
||||
this.address = address;
|
||||
this.displayAddressForm = true;
|
||||
}else{
|
||||
this.displayAddressForm = false;
|
||||
}
|
||||
});
|
||||
},
|
||||
data(){
|
||||
return {
|
||||
minWidth:{
|
||||
@@ -54,10 +98,15 @@
|
||||
minWidth150:{
|
||||
minWidth:'150px',
|
||||
},
|
||||
address_id:0,
|
||||
address:{},
|
||||
displayAddressForm:false
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
company_details: function(newVal, oldVal) {
|
||||
this.company_details=newVal;
|
||||
|
||||
if(newVal !== null) {
|
||||
|
||||
let approved = 0, completed = 0, rejected = 0, expired = 0, pending = 0;
|
||||
@@ -106,16 +155,16 @@
|
||||
},
|
||||
options: {
|
||||
responsive: true,
|
||||
plugins: {
|
||||
legend: {
|
||||
position: 'bottom',
|
||||
},
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Booking Activity'
|
||||
}
|
||||
maintainAspectRatio: false,
|
||||
legend: {
|
||||
position: 'right',
|
||||
},
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Booking Activity (Total: '+this.company_details.bookings.length+')'
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
<template>
|
||||
<div class="row align-items-center m-b-10 parentContainer">
|
||||
<div class="row w-100 m-0 p-0 ">
|
||||
<div class="col-8 pull-left mt-2 pr-0">
|
||||
<div class="col pull-left mt-2 pr-0">
|
||||
<div class="font-heading all-caps fs-11">{{this.item.name}}</div>
|
||||
</div>
|
||||
<div class="col-2 text-center mt-2">
|
||||
<div class="font-heading all-caps fs-11">{{this.item.bookings.length}}</div>
|
||||
</div>
|
||||
<div class="col-2 text-right pull-right">
|
||||
<div class="col-3 text-right pull-right">
|
||||
<button type="button" @click="viewCompany()" class="btn btn-xs btn-info fs-11"><i class="fa fa-angle-down"></i></button>
|
||||
<a :href="route('customer.profile', item.id)">
|
||||
<button type="button" class="btn btn-xs btn-primary fs-11">View</button>
|
||||
</a>
|
||||
|
||||
+9
-11
@@ -2,17 +2,15 @@
|
||||
<div class="col-12">
|
||||
<div class="b-b b-dashed b-grey p-b-25" v-show="!this.show_details">
|
||||
<div class="row align-items-center m-b-5 parentContainer">
|
||||
|
||||
<div class="col-8">
|
||||
<div class="font-heading fs-10 muted all-caps">Company</div>
|
||||
</div>
|
||||
<div class="col-2 text-center">
|
||||
<div class="font-heading fs-10 muted all-caps">Booking</div>
|
||||
</div>
|
||||
<div class="col-2 text-right pull-right">
|
||||
<div class="font-heading fs-10 muted all-caps">Action</div>
|
||||
</div>
|
||||
|
||||
<div class="col">
|
||||
<div class="font-heading fs-10 muted all-caps">Company</div>
|
||||
</div>
|
||||
<div class="col-2 text-center">
|
||||
<div class="font-heading fs-10 muted all-caps">Booking</div>
|
||||
</div>
|
||||
<div class="col-3 text-right pull-right">
|
||||
<div class="font-heading fs-10 muted all-caps">Action</div>
|
||||
</div>
|
||||
</div>
|
||||
<list-component key="2" :section="this.section" :endpoint="route('api.company.list')" :options="{'business_type': 2, with_bookings:true}">
|
||||
<template slot="list" slot-scope="{data}">
|
||||
|
||||
+28
-25
File diff suppressed because one or more lines are too long
+393
-56
File diff suppressed because one or more lines are too long
@@ -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>
|
||||
+51
@@ -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>
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,33 @@
|
||||
<template>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<loading-component style="height: 300px; top: 0;" key="1" color="success" v-show="isLoading" ></loading-component>
|
||||
<div class="row justify-content-center" v-show="!isLoading">
|
||||
<div class="col">
|
||||
<div class="row m-b-20">
|
||||
<div class="col">
|
||||
<h3 class="all-caps">Are you Sure?</h3>
|
||||
<div class="fs-11">Are you sure you want to delete this admin account?</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col p-r-5">
|
||||
<div class="btn btn-sm btn-success btn-block b-rad-none" data-dismiss="modal">Cancel</div>
|
||||
</div>
|
||||
<div class="col p-l-5">
|
||||
<div class="btn btn-sm btn-danger btn-block b-rad-none" @click="submit(route('api.account.user.delete', item.id), 'delete', section, true, true)">Delete</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import componentHandler from '../../../general/mixins/componentHandler';
|
||||
import ModalFormHandler from '../../../general/mixins/modalFormHandler';
|
||||
export default {
|
||||
mixins: [componentHandler, ModalFormHandler]
|
||||
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,117 @@
|
||||
<template>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<loading-component style="height: 50px; top: 0;" key="1" color="success" v-show="$store.getters.isLoading(section)"></loading-component>
|
||||
<div class="row" v-show="!$store.getters.isLoading(section)">
|
||||
<div class="col">
|
||||
<div class="row m-b-20">
|
||||
<div class="col">
|
||||
<h6 class="all-caps m-b-5 bold no-margin">Add Admin Account</h6>
|
||||
</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 m-b-10">
|
||||
<div class="col">
|
||||
<validation-wrapper-component :validator="$v.parameters.name">
|
||||
<label class="muted">Name</label>
|
||||
<input type="text" class="form-control" v-model="parameters.name">
|
||||
</validation-wrapper-component>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row m-b-10">
|
||||
<div class="col">
|
||||
<validation-wrapper-component :validator="$v.parameters.email">
|
||||
<label class="muted">Email</label>
|
||||
<input type="text" class="form-control" v-model="parameters.email">
|
||||
</validation-wrapper-component>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row m-b-10">
|
||||
<div class="col">
|
||||
<validation-wrapper-component :validator="$v.parameters.password">
|
||||
<label class="muted">Password</label>
|
||||
<input type="password" class="form-control" v-model="parameters.password">
|
||||
</validation-wrapper-component>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row m-b-10">
|
||||
<div class="col">
|
||||
<validation-wrapper-component :validator="$v.parameters.password_confirmation">
|
||||
<label class="muted">Password Confirmation</label>
|
||||
<input type="password" class="form-control" v-model="parameters.password_confirmation">
|
||||
</validation-wrapper-component>
|
||||
</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="closable ? 'modal' : ''" @click="$emit('close')">Cancel</div>
|
||||
</div>
|
||||
<div class="col p-l-5">
|
||||
<div class="btn btn-sm btn-success btn-block b-rad-none" @click="submitForm()">Add Admin</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import FormHandler from '../../../general/mixins/formHandler';
|
||||
import { required, sameAs, minLength , email} from "vuelidate/lib/validators";
|
||||
export default {
|
||||
props : {
|
||||
closable: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
},
|
||||
data(){
|
||||
return {
|
||||
parameters: {
|
||||
name: '',
|
||||
email: '',
|
||||
password: '',
|
||||
password_confirmation: '',
|
||||
}
|
||||
}
|
||||
},
|
||||
validations: {
|
||||
parameters: {
|
||||
name: {
|
||||
required
|
||||
},
|
||||
email: {
|
||||
required,
|
||||
email
|
||||
},
|
||||
password: {
|
||||
required,
|
||||
minLength: minLength(6)
|
||||
},
|
||||
password_confirmation: {
|
||||
required,
|
||||
sameAsPassword: sameAs('password')
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
submitForm(){
|
||||
this.submit(route('api.account.user.admin.create'), 'post', this.section, true, false);
|
||||
},
|
||||
successHandler(response){
|
||||
this.closeModal();
|
||||
this.$emit('createdAdmin', response.payload.data);
|
||||
this.formHandler();
|
||||
this.resetForm();
|
||||
},
|
||||
errorHandler(error){
|
||||
this.formHandler(error.message);
|
||||
}
|
||||
},
|
||||
mixins: [FormHandler]
|
||||
}
|
||||
</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]
|
||||
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
import { required } from "vuelidate/lib/validators";
|
||||
import resetPasswordHandler from "../resetPasswordHandler";
|
||||
export default {
|
||||
validations: {
|
||||
parameters: {
|
||||
email: { required }
|
||||
}
|
||||
},
|
||||
mixins: [resetPasswordHandler]
|
||||
};
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
import { required } from "vuelidate/lib/validators";
|
||||
import updateProfileHandler from "../updateProfileHandler";
|
||||
export default {
|
||||
validations: {
|
||||
parameters: {
|
||||
name: { required }
|
||||
}
|
||||
},
|
||||
mixins: [updateProfileHandler]
|
||||
};
|
||||
+6
-2
@@ -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
@@ -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});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
@extends('layouts.base_portal')
|
||||
@section('inner_content')
|
||||
<div class="row">
|
||||
<div class="col-4 bg-white p-t-15 p-b-15">
|
||||
<div class="row no-margin">
|
||||
<div class="col">
|
||||
<div class="row m-b-15 p-b-10 b-b b-grey">
|
||||
<div class="col">
|
||||
<small class="all-caps muted fs-10">Complete Payments</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<list-component key="2" section="paymentVerificationSection" :endpoint="route('api.transaction.list')" :options="{'type': 1, 'status': 3}">
|
||||
<template slot="list" slot-scope="{data}">
|
||||
<payment-verification-component section="paymentVerificationSection" :data="data" :no_action="true"></payment-verification-component>
|
||||
</template>
|
||||
</list-component>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
File diff suppressed because one or more lines are too long
@@ -26,6 +26,11 @@
|
||||
<div class="col-auto p-r-20">
|
||||
<a href="{{route('dashboard')}}"><div class="text-white all-caps fs-12">Dashboard</div></a>
|
||||
</div>
|
||||
<div class="col-auto p-r-20" v-if="$store.getters.isAdmin">
|
||||
<a href="{{route('payment.complete')}}">
|
||||
<div class="text-white all-caps fs-12">Payments & Billing</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-auto p-r-20" v-if="$store.getters.isAdmin">
|
||||
<a href="{{route('booking.complete')}}">
|
||||
<div class="text-white all-caps fs-12">Completed Transfers</div>
|
||||
@@ -64,7 +69,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">
|
||||
|
||||
+6
-2
@@ -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,9 @@ 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');
|
||||
|
||||
Route::post('/admin/create', 'CreateAdminUserController@create')->name('admin.create');
|
||||
Route::delete('/delete/{id}', 'DeleteUserController@delete')->name('delete');
|
||||
});
|
||||
});
|
||||
@@ -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');
|
||||
@@ -38,6 +42,10 @@ Route::get('/customer/{id}', function ($id) {
|
||||
return view('pages.customers', ['id' => $id]);
|
||||
})->name('customer.profile');
|
||||
|
||||
Route::get('/payment/complete', function () {
|
||||
return view('pages.payment_complete');
|
||||
})->name('payment.complete');
|
||||
|
||||
Route::get('/booking/complete', function () {
|
||||
return view('pages.booking_complete');
|
||||
})->name('booking.complete');
|
||||
|
||||
Reference in New Issue
Block a user