- redirect after sign in/up to payment page

- extended /api/oasis/subscribe function
- setup:dev extended data
This commit is contained in:
Peter Papp
2021-03-24 11:38:15 +01:00
parent 1bb3ca4fb5
commit af79a28361
17 changed files with 1542 additions and 314 deletions

View File

@@ -805,6 +805,10 @@ class SetupDevEnvironment extends Command
'name' => 'registration',
'value' => 1,
],
[
'name' => 'app_payments_active',
'value' => 1,
],
[
'name' => 'storage_limitation',
'value' => 1,

View File

@@ -3,6 +3,7 @@
namespace App\Http\Controllers\Oasis;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\CreateUserByAdmin;
use App\Http\Resources\UserResource;
use App\Models\User;
use App\Models\UserSettings;
@@ -45,7 +46,7 @@ class AdminController extends Controller
* @param Request $request
* @return Application|ResponseFactory|Response
*/
public function register_new_client(Request $request)
public function create_order(Request $request)
{
// Create user
$newbie = User::create([
@@ -91,4 +92,33 @@ class AdminController extends Controller
new UserResource($newbie), 201
);
}
/**
* Create new user by admin
*
* @param CreateUserByAdmin $request
* @return UserResource|Application|ResponseFactory|Response
*/
public function create_user(CreateUserByAdmin $request)
{
// Create user
$user = User::forceCreate([
'role' => $request->role,
'email' => $request->email,
'password' => \Illuminate\Support\Facades\Hash::make($request->password),
]);
UserSettings::unguard();
$user
->settings()
->create([
'name' => $request->name,
'avatar' => store_avatar($request, 'avatar'),
'storage_capacity' => $request->storage_capacity,
'payment_activation' => 1,
]);
return response(new UserResource($user), 201);
}
}

View File

@@ -60,24 +60,43 @@ class SubscriptionController extends Controller
*/
public function subscribe(Request $request, SubscriptionRequest $order)
{
// Create subscription
$order->user
->newSubscription('main', $order->requested_plan)
->create(
$this->stripe->getOrSetDefaultPaymentMethod($request, $order->user)
);
// Make subscription from subscription request
if ($order->exists) {
// Get requested plan
$plan = $this->stripe
->getPlan($order->requested_plan);
// Create subscription
$order->user
->newSubscription('main', $order->requested_plan)
->create(
$this->stripe->getOrSetDefaultPaymentMethod($request, $order->user)
);
// Update Subscription request
$order->update([
'status' => 'payed'
]);
// Update Subscription request
$order->update(['status' => 'payed']);
$user = $order->user;
}
// Make subscription after user sign up and pay for the plan
if (!$order->exists) {
$user = Auth::user();
// Set user billing
$user->setBilling($request->billing);
// Update stripe customer billing info
$this->stripe->updateCustomerDetails($user);
// Make subscription
$this->stripe->createOrReplaceSubscription($request, $user);
}
// Get plan
$plan = $this->stripe->getPlan(
$order->requested_plan ?? $request->input('plan.data.id')
);
// Update user storage limit
$order->user
$user
->settings()
->update([
'storage_capacity' => $plan['product']['metadata']['capacity'],

View File

@@ -42,15 +42,18 @@ class UserResource extends JsonResource
'id' => $this->id,
'type' => 'settings',
'attributes' => [
'avatar' => $this->settings->avatar,
'name' => $this->settings->name,
'address' => $this->settings->address,
'state' => $this->settings->state,
'city' => $this->settings->city,
'postal_code' => $this->settings->postal_code,
'country' => $this->settings->country,
'phone_number' => $this->settings->phone_number,
'timezone' => $this->settings->timezone
'avatar' => $this->settings->avatar,
'name' => $this->settings->name,
'address' => $this->settings->address,
'state' => $this->settings->state,
'city' => $this->settings->city,
'postal_code' => $this->settings->postal_code,
'country' => $this->settings->country,
'phone_number' => $this->settings->phone_number,
'timezone' => $this->settings->timezone,
// OasisDrive
'payment_activation' => $this->settings->payment_activation
]
]
],

View File

@@ -3,7 +3,7 @@
"/css/app.css": "/css/app.css",
"/chunks/admin.js": "/chunks/admin.js?id=7875b08fc6fb75a7ad1f",
"/chunks/admin-account.js": "/chunks/admin-account.js?id=b1d2758e439eb303f5ee",
"/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~9fa266bc.js": "/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~9fa266bc.js?id=81dea7680f4bfde55278",
"/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~74bf0fcb.js": "/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~74bf0fcb.js?id=6b6737a58e371fc4434b",
"/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~c7a13fb0.js": "/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~c7a13fb0.js?id=62b552a0492fe95b2223",
"/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~a001bb84.js": "/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~a001bb84.js?id=0cad8279d29d79cd0e82",
"/chunks/admin~chunks/files~chunks/settings~chunks/shared-files~chunks/shared/file-browser.js": "/chunks/admin~chunks/files~chunks/settings~chunks/shared-files~chunks/shared/file-browser.js?id=f1e1597205ff30d4fa4a",
@@ -31,10 +31,10 @@
"/chunks/dynamic-page.js": "/chunks/dynamic-page.js?id=6dccc2158cc6278f683d",
"/chunks/environment-setup.js": "/chunks/environment-setup.js?id=123776e4ad431b2af406",
"/chunks/files.js": "/chunks/files.js?id=40b4464ce393cb112111",
"/chunks/files~chunks/oasis/platba~chunks/settings-subscription~chunks/shared-files~chunks/shared/file~9d1352fd.js": "/chunks/files~chunks/oasis/platba~chunks/settings-subscription~chunks/shared-files~chunks/shared/file~9d1352fd.js?id=4030b241faac6b31341f",
"/chunks/files~chunks/platform~chunks/shared-files~chunks/shared/file-browser.js": "/chunks/files~chunks/platform~chunks/shared-files~chunks/shared/file-browser.js?id=c2c86f2168e863fbd49e",
"/chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser.js": "/chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser.js?id=885dd88f0e8d5c499a48",
"/chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser~chunks/sha~8510f6c9.js": "/chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser~chunks/sha~8510f6c9.js?id=02131dc9a3e5fb2ccfcc",
"/chunks/files~chunks/settings-subscription~chunks/shared-files~chunks/shared/file-browser~chunks/user~9058a49f.js": "/chunks/files~chunks/settings-subscription~chunks/shared-files~chunks/shared/file-browser~chunks/user~9058a49f.js?id=31a17ad1d2536342abbe",
"/chunks/files~chunks/shared-files~chunks/shared/file-browser.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser.js?id=07de5a0fc9944e819154",
"/chunks/files~chunks/shared-files~chunks/shared/file-browser~chunks/shared/single-file.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser~chunks/shared/single-file.js?id=150772c0920d1a8694cc",
"/chunks/files~chunks/shared/file-browser.js": "/chunks/files~chunks/shared/file-browser.js?id=b2a355bb27f40ee0e386",
@@ -43,6 +43,8 @@
"/chunks/installation-disclaimer.js": "/chunks/installation-disclaimer.js?id=7543bc0ebd67a282779a",
"/chunks/invoices.js": "/chunks/invoices.js?id=98c2b0d4a83f4e0cc6d9",
"/chunks/not-found-shared.js": "/chunks/not-found-shared.js?id=7fc7f9b6f10bdfac770e",
"/chunks/oasis/platba.js": "/chunks/oasis/platba.js?id=e92773ec90d60d1cd788",
"/chunks/oasis/platba~chunks/upgrade-billing~chunks/upgrade-plan.js": "/chunks/oasis/platba~chunks/upgrade-billing~chunks/upgrade-plan.js?id=443cc6055897091f6676",
"/chunks/page-edit.js": "/chunks/page-edit.js?id=234551fa36d21e29606e",
"/chunks/pages.js": "/chunks/pages.js?id=eddb0354939e959cea11",
"/chunks/plan.js": "/chunks/plan.js?id=56ff26197c3ddab55605",
@@ -57,7 +59,7 @@
"/chunks/profile~chunks/settings-password.js": "/chunks/profile~chunks/settings-password.js?id=9202f2cff7c80a561718",
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=01dafc8397bda91a47f5",
"/chunks/settings.js": "/chunks/settings.js?id=713564bcdbe44aa66df1",
"/chunks/settings-create-payment-methods.js": "/chunks/settings-create-payment-methods.js?id=9c088cb1b14836d13648",
"/chunks/settings-create-payment-methods.js": "/chunks/settings-create-payment-methods.js?id=25a7e5e91b236debdae9",
"/chunks/settings-invoices.js": "/chunks/settings-invoices.js?id=c765f8563393c27bc6a6",
"/chunks/settings-password.js": "/chunks/settings-password.js?id=201b3cbada273dacd46e",
"/chunks/settings-payment-methods.js": "/chunks/settings-payment-methods.js?id=535472f0e43f64ec0ccc",
@@ -69,278 +71,67 @@
"/chunks/shared/authenticate.js": "/chunks/shared/authenticate.js?id=3d5c7754d438830a4204",
"/chunks/shared/file-browser.js": "/chunks/shared/file-browser.js?id=3127fab4cfd3d5f00a72",
"/chunks/shared/single-file.js": "/chunks/shared/single-file.js?id=e8aedb75df7fe227d693",
"/chunks/sign-in.js": "/chunks/sign-in.js?id=92a1de80f254cfc9ac91",
"/chunks/sign-up.js": "/chunks/sign-up.js?id=a51dd0f046981790d60c",
"/chunks/sign-in.js": "/chunks/sign-in.js?id=96596a96b8c810d752e2",
"/chunks/sign-up.js": "/chunks/sign-up.js?id=2d6782121f7dde627401",
"/chunks/stripe-credentials.js": "/chunks/stripe-credentials.js?id=6eb1bdf3942d7b2dd06f",
"/chunks/subscription-plans.js": "/chunks/subscription-plans.js?id=8048188a201c41f248c6",
"/chunks/subscription-service.js": "/chunks/subscription-service.js?id=90c1aa9431689a89eb3d",
"/chunks/upgrade-billing.js": "/chunks/upgrade-billing.js?id=830456726847f435144e",
"/chunks/upgrade-billing~chunks/upgrade-plan.js": "/chunks/upgrade-billing~chunks/upgrade-plan.js?id=2b555924c945cbcd23f5",
"/chunks/upgrade-plan.js": "/chunks/upgrade-plan.js?id=9c61721d5e30ef544377",
"/chunks/upgrade-billing.js": "/chunks/upgrade-billing.js?id=db93044d81a1e1b75cf2",
"/chunks/upgrade-plan.js": "/chunks/upgrade-plan.js?id=35939b91f0dd6357b9c2",
"/chunks/user.js": "/chunks/user.js?id=8e96e769d9df5c5f7364",
"/chunks/user-create.js": "/chunks/user-create.js?id=421558158a756e7f87b0",
"/chunks/user-create.js": "/chunks/user-create.js?id=15fa75e2184472b203ef",
"/chunks/user-delete.js": "/chunks/user-delete.js?id=78a10edafd58a4abad26",
"/chunks/user-detail.js": "/chunks/user-detail.js?id=039a3d421f7d8b8b3ce3",
"/chunks/user-invoices.js": "/chunks/user-invoices.js?id=8da7b23dc11d9e2e6c99",
"/chunks/user-password.js": "/chunks/user-password.js?id=31bcde6d4cfb29b1c894",
"/chunks/user-storage.js": "/chunks/user-storage.js?id=f1d8f104599fa982991e",
"/chunks/user-subscription.js": "/chunks/user-subscription.js?id=3b8974eb8af615d517f4",
"/chunks/users.js": "/chunks/users.js?id=5a137097e3c880c7c73d",
"/vendors~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-i~68e3c6cf.js": "/vendors~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-i~68e3c6cf.js?id=b490efdc8470a6c2f625",
"/vendors~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-i~a4a4a595.js": "/vendors~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-i~a4a4a595.js?id=be99c10088b00578891b",
"/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser~ch~52c14f2e.js": "/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser~ch~52c14f2e.js?id=66afa0e341251a68c3d3",
"/js/main.15462e4af4d55df66973.hot-update.js": "/js/main.15462e4af4d55df66973.hot-update.js",
"/js/main.cbbb4b7ba2d3799084b1.hot-update.js": "/js/main.cbbb4b7ba2d3799084b1.hot-update.js",
"/chunks/user-create.cbbb4b7ba2d3799084b1.hot-update.js": "/chunks/user-create.cbbb4b7ba2d3799084b1.hot-update.js",
"/chunks/user-create.54a4449fe2276fba9662.hot-update.js": "/chunks/user-create.54a4449fe2276fba9662.hot-update.js",
"/js/main.8aa438d501df2f11f4fb.hot-update.js": "/js/main.8aa438d501df2f11f4fb.hot-update.js",
"/js/main.c819f952ef8d64da2c7f.hot-update.js": "/js/main.c819f952ef8d64da2c7f.hot-update.js",
"/chunks/user-create.c819f952ef8d64da2c7f.hot-update.js": "/chunks/user-create.c819f952ef8d64da2c7f.hot-update.js",
"/js/main.3fa488b1ce9a72e510d9.hot-update.js": "/js/main.3fa488b1ce9a72e510d9.hot-update.js",
"/chunks/user-create.3fa488b1ce9a72e510d9.hot-update.js": "/chunks/user-create.3fa488b1ce9a72e510d9.hot-update.js",
"/chunks/user-create.a5516d3706d718944d86.hot-update.js": "/chunks/user-create.a5516d3706d718944d86.hot-update.js",
"/chunks/user-create.e3b89a488b7f5d464cb6.hot-update.js": "/chunks/user-create.e3b89a488b7f5d464cb6.hot-update.js",
"/js/main.2e41c3c6d72ca60cdfa5.hot-update.js": "/js/main.2e41c3c6d72ca60cdfa5.hot-update.js",
"/chunks/user-create.a71b18b949a40aa877db.hot-update.js": "/chunks/user-create.a71b18b949a40aa877db.hot-update.js",
"/chunks/user-create.919c3693ad6edad72622.hot-update.js": "/chunks/user-create.919c3693ad6edad72622.hot-update.js",
"/chunks/user-create.ff44a8c6547514b0555e.hot-update.js": "/chunks/user-create.ff44a8c6547514b0555e.hot-update.js",
"/chunks/user-create.f71649c0af0138fd392a.hot-update.js": "/chunks/user-create.f71649c0af0138fd392a.hot-update.js",
"/chunks/user-create.a0975461a82aa011ae08.hot-update.js": "/chunks/user-create.a0975461a82aa011ae08.hot-update.js",
"/chunks/user-create.22963a8eb879a70de8e8.hot-update.js": "/chunks/user-create.22963a8eb879a70de8e8.hot-update.js",
"/chunks/user-create.00fae37c8caaf9c4116c.hot-update.js": "/chunks/user-create.00fae37c8caaf9c4116c.hot-update.js",
"/chunks/user-create.bd8ce06e31babb0d83bf.hot-update.js": "/chunks/user-create.bd8ce06e31babb0d83bf.hot-update.js",
"/chunks/user-create.533a9769278591f0a35f.hot-update.js": "/chunks/user-create.533a9769278591f0a35f.hot-update.js",
"/chunks/user-create.4de58d114340c037c334.hot-update.js": "/chunks/user-create.4de58d114340c037c334.hot-update.js",
"/chunks/user-create.bc5c6db3b1f40958cee6.hot-update.js": "/chunks/user-create.bc5c6db3b1f40958cee6.hot-update.js",
"/chunks/user-create.61c4327d1b8cc3882ca3.hot-update.js": "/chunks/user-create.61c4327d1b8cc3882ca3.hot-update.js",
"/chunks/user-create.c7a824a1651301799e6f.hot-update.js": "/chunks/user-create.c7a824a1651301799e6f.hot-update.js",
"/chunks/user-create.a5037bab9efc816329c2.hot-update.js": "/chunks/user-create.a5037bab9efc816329c2.hot-update.js",
"/chunks/user-create.872040ca690570f5940a.hot-update.js": "/chunks/user-create.872040ca690570f5940a.hot-update.js",
"/chunks/user-create.ed26b4426b06a08c6c6f.hot-update.js": "/chunks/user-create.ed26b4426b06a08c6c6f.hot-update.js",
"/chunks/user-create.925215955f57702fc155.hot-update.js": "/chunks/user-create.925215955f57702fc155.hot-update.js",
"/chunks/user-create.a91d2252b68a6c00ef00.hot-update.js": "/chunks/user-create.a91d2252b68a6c00ef00.hot-update.js",
"/chunks/user-create.8d5c86849f2e3abbaa16.hot-update.js": "/chunks/user-create.8d5c86849f2e3abbaa16.hot-update.js",
"/chunks/user-create.d393a841297e7b3b49bc.hot-update.js": "/chunks/user-create.d393a841297e7b3b49bc.hot-update.js",
"/chunks/user-create.fe44ba1ff26e3a796548.hot-update.js": "/chunks/user-create.fe44ba1ff26e3a796548.hot-update.js",
"/chunks/user-create.b84bc5bf54478d757615.hot-update.js": "/chunks/user-create.b84bc5bf54478d757615.hot-update.js",
"/chunks/user-create.858d43e043ecfbf1f34e.hot-update.js": "/chunks/user-create.858d43e043ecfbf1f34e.hot-update.js",
"/chunks/user-create.ebf58013ad50ee56a3c9.hot-update.js": "/chunks/user-create.ebf58013ad50ee56a3c9.hot-update.js",
"/chunks/user-create.522c330a0f5f932859b6.hot-update.js": "/chunks/user-create.522c330a0f5f932859b6.hot-update.js",
"/chunks/user-create.d84da8c0b8db7571999d.hot-update.js": "/chunks/user-create.d84da8c0b8db7571999d.hot-update.js",
"/chunks/user-create.0a7c147f41bbd509a7bb.hot-update.js": "/chunks/user-create.0a7c147f41bbd509a7bb.hot-update.js",
"/chunks/user-create.a74b6607e7cdac972430.hot-update.js": "/chunks/user-create.a74b6607e7cdac972430.hot-update.js",
"/chunks/user-create.2f4fb0da79ad0e978ccb.hot-update.js": "/chunks/user-create.2f4fb0da79ad0e978ccb.hot-update.js",
"/chunks/user-create.5c5c4eca7bf7386f694d.hot-update.js": "/chunks/user-create.5c5c4eca7bf7386f694d.hot-update.js",
"/chunks/user-create.90b8d2a51502ba505aa0.hot-update.js": "/chunks/user-create.90b8d2a51502ba505aa0.hot-update.js",
"/chunks/user-create.375793ace33f5a7418dc.hot-update.js": "/chunks/user-create.375793ace33f5a7418dc.hot-update.js",
"/chunks/user-create.dc4df3471eeb2ed2b3d1.hot-update.js": "/chunks/user-create.dc4df3471eeb2ed2b3d1.hot-update.js",
"/chunks/user-create.0f84d6d095759bce0dbd.hot-update.js": "/chunks/user-create.0f84d6d095759bce0dbd.hot-update.js",
"/chunks/user-create.242c21dfba3203d52ef2.hot-update.js": "/chunks/user-create.242c21dfba3203d52ef2.hot-update.js",
"/chunks/user-create.266c0ca93a6735ef3a84.hot-update.js": "/chunks/user-create.266c0ca93a6735ef3a84.hot-update.js",
"/chunks/user-create.1acc9e0da68e66d210a4.hot-update.js": "/chunks/user-create.1acc9e0da68e66d210a4.hot-update.js",
"/chunks/user-create.dcb0117f4b7d769dc082.hot-update.js": "/chunks/user-create.dcb0117f4b7d769dc082.hot-update.js",
"/chunks/user-create.5dfbd0729d493c839a29.hot-update.js": "/chunks/user-create.5dfbd0729d493c839a29.hot-update.js",
"/chunks/user-create.73770f0976d9d5a25b8c.hot-update.js": "/chunks/user-create.73770f0976d9d5a25b8c.hot-update.js",
"/chunks/user-create.54ae66ab0f6535ab88fd.hot-update.js": "/chunks/user-create.54ae66ab0f6535ab88fd.hot-update.js",
"/chunks/user-create.71d6353646d0b450dc3a.hot-update.js": "/chunks/user-create.71d6353646d0b450dc3a.hot-update.js",
"/chunks/user-create.4eb624ae9661c486f5e9.hot-update.js": "/chunks/user-create.4eb624ae9661c486f5e9.hot-update.js",
"/chunks/user-create.f23c32bee25bc81f6689.hot-update.js": "/chunks/user-create.f23c32bee25bc81f6689.hot-update.js",
"/chunks/user-create.85fe12a3027d6207f6f2.hot-update.js": "/chunks/user-create.85fe12a3027d6207f6f2.hot-update.js",
"/chunks/user-create.c02151f6030597407506.hot-update.js": "/chunks/user-create.c02151f6030597407506.hot-update.js",
"/chunks/user-create.17b4bfca823d5896046d.hot-update.js": "/chunks/user-create.17b4bfca823d5896046d.hot-update.js",
"/chunks/user-create.adf62e112c213ee53ae5.hot-update.js": "/chunks/user-create.adf62e112c213ee53ae5.hot-update.js",
"/chunks/user-create.9f42e3864e1b8da68fba.hot-update.js": "/chunks/user-create.9f42e3864e1b8da68fba.hot-update.js",
"/chunks/user-create.10bb5e47f31788c3c76b.hot-update.js": "/chunks/user-create.10bb5e47f31788c3c76b.hot-update.js",
"/chunks/user-create.7d2b032edb567a50bcd8.hot-update.js": "/chunks/user-create.7d2b032edb567a50bcd8.hot-update.js",
"/chunks/user-create.8006779f958f7169e9d5.hot-update.js": "/chunks/user-create.8006779f958f7169e9d5.hot-update.js",
"/js/main.69efc639b7a35270363d.hot-update.js": "/js/main.69efc639b7a35270363d.hot-update.js",
"/chunks/user-create.69efc639b7a35270363d.hot-update.js": "/chunks/user-create.69efc639b7a35270363d.hot-update.js",
"/chunks/users.1643485e962ee8d6de38.hot-update.js": "/chunks/users.1643485e962ee8d6de38.hot-update.js",
"/chunks/users.c5edaed550eebf8241ec.hot-update.js": "/chunks/users.c5edaed550eebf8241ec.hot-update.js",
"/chunks/users.1d23b81f37ced25c5000.hot-update.js": "/chunks/users.1d23b81f37ced25c5000.hot-update.js",
"/chunks/users.95851214144197354979.hot-update.js": "/chunks/users.95851214144197354979.hot-update.js",
"/chunks/users.ebf3344fcab1a32d2b99.hot-update.js": "/chunks/users.ebf3344fcab1a32d2b99.hot-update.js",
"/chunks/user-create.c89e2097ceac3e5394d5.hot-update.js": "/chunks/user-create.c89e2097ceac3e5394d5.hot-update.js",
"/js/main.41c24977104696892944.hot-update.js": "/js/main.41c24977104696892944.hot-update.js",
"/chunks/user-create.41c24977104696892944.hot-update.js": "/chunks/user-create.41c24977104696892944.hot-update.js",
"/chunks/users.41c24977104696892944.hot-update.js": "/chunks/users.41c24977104696892944.hot-update.js",
"/chunks/users.94c5a3524848fcd48ce3.hot-update.js": "/chunks/users.94c5a3524848fcd48ce3.hot-update.js",
"/js/main.c37139a7ae727fbb4c02.hot-update.js": "/js/main.c37139a7ae727fbb4c02.hot-update.js",
"/js/main.75a7330f169a31271b4c.hot-update.js": "/js/main.75a7330f169a31271b4c.hot-update.js",
"/chunks/users.75a7330f169a31271b4c.hot-update.js": "/chunks/users.75a7330f169a31271b4c.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.cec600408276af5260fe.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.cec600408276af5260fe.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.dbdbf80723e41e072d01.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.dbdbf80723e41e072d01.hot-update.js",
"/chunks/users.2b4b9dbd972d7a9d7c83.hot-update.js": "/chunks/users.2b4b9dbd972d7a9d7c83.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.d4f9806caf6c6d5f1344.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.d4f9806caf6c6d5f1344.hot-update.js",
"/js/main.55cf4e9bc02bec922581.hot-update.js": "/js/main.55cf4e9bc02bec922581.hot-update.js",
"/js/main.b52ecb4afdc47584e38f.hot-update.js": "/js/main.b52ecb4afdc47584e38f.hot-update.js",
"/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~74bf0fcb.js": "/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~74bf0fcb.js?id=6b6737a58e371fc4434b",
"/chunks/oasis/platba.js": "/chunks/oasis/platba.js?id=7805c58cc0a244525e88",
"/chunks/oasis/platba~chunks/upgrade-billing~chunks/upgrade-plan.js": "/chunks/oasis/platba~chunks/upgrade-billing~chunks/upgrade-plan.js?id=4781f8460c7f0f8b21a5",
"/chunks/users.js": "/chunks/users.js?id=12b2b13cacbe991481bb",
"/vendors~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-i~0a9c5e33.js": "/vendors~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-i~0a9c5e33.js?id=b28978d3c8aae9b949a5",
"/vendors~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-i~8394cf85.js": "/vendors~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-i~8394cf85.js?id=d25da0762af813ea588c",
"/chunks/oasis/platba.f2d7a060bf88fd2d9403.hot-update.js": "/chunks/oasis/platba.f2d7a060bf88fd2d9403.hot-update.js",
"/chunks/oasis/platba.79f86d9923a5b3d8f77b.hot-update.js": "/chunks/oasis/platba.79f86d9923a5b3d8f77b.hot-update.js",
"/chunks/oasis/platba.960030e55311860adad8.hot-update.js": "/chunks/oasis/platba.960030e55311860adad8.hot-update.js",
"/js/main.b089e299b2beda8c4435.hot-update.js": "/js/main.b089e299b2beda8c4435.hot-update.js",
"/chunks/oasis/platba.0975d1f12bf7fcd32825.hot-update.js": "/chunks/oasis/platba.0975d1f12bf7fcd32825.hot-update.js",
"/chunks/oasis/platba.b1513de9a1f782c9fcf9.hot-update.js": "/chunks/oasis/platba.b1513de9a1f782c9fcf9.hot-update.js",
"/chunks/oasis/platba.6101685137fe4c159b2f.hot-update.js": "/chunks/oasis/platba.6101685137fe4c159b2f.hot-update.js",
"/js/main.4e81e4ea624ef84cb166.hot-update.js": "/js/main.4e81e4ea624ef84cb166.hot-update.js",
"/chunks/oasis/platba.4e81e4ea624ef84cb166.hot-update.js": "/chunks/oasis/platba.4e81e4ea624ef84cb166.hot-update.js",
"/js/main.9d41d45200d1397f7d1f.hot-update.js": "/js/main.9d41d45200d1397f7d1f.hot-update.js",
"/chunks/oasis/platba.9d41d45200d1397f7d1f.hot-update.js": "/chunks/oasis/platba.9d41d45200d1397f7d1f.hot-update.js",
"/chunks/oasis/platba.7295a36fd456e216edb5.hot-update.js": "/chunks/oasis/platba.7295a36fd456e216edb5.hot-update.js",
"/chunks/oasis/platba.42cfd9642e72806e1d73.hot-update.js": "/chunks/oasis/platba.42cfd9642e72806e1d73.hot-update.js",
"/chunks/oasis/platba.eb85a1eef45f79ca4c3e.hot-update.js": "/chunks/oasis/platba.eb85a1eef45f79ca4c3e.hot-update.js",
"/chunks/admin-account.9b07cca19b41d1b68e00.hot-update.js": "/chunks/admin-account.9b07cca19b41d1b68e00.hot-update.js",
"/chunks/app-setup.9b07cca19b41d1b68e00.hot-update.js": "/chunks/app-setup.9b07cca19b41d1b68e00.hot-update.js",
"/chunks/billings-detail.9b07cca19b41d1b68e00.hot-update.js": "/chunks/billings-detail.9b07cca19b41d1b68e00.hot-update.js",
"/chunks/database.9b07cca19b41d1b68e00.hot-update.js": "/chunks/database.9b07cca19b41d1b68e00.hot-update.js",
"/chunks/environment-setup.9b07cca19b41d1b68e00.hot-update.js": "/chunks/environment-setup.9b07cca19b41d1b68e00.hot-update.js",
"/chunks/installation-disclaimer.9b07cca19b41d1b68e00.hot-update.js": "/chunks/installation-disclaimer.9b07cca19b41d1b68e00.hot-update.js",
"/chunks/purchase-code.9b07cca19b41d1b68e00.hot-update.js": "/chunks/purchase-code.9b07cca19b41d1b68e00.hot-update.js",
"/chunks/stripe-credentials.9b07cca19b41d1b68e00.hot-update.js": "/chunks/stripe-credentials.9b07cca19b41d1b68e00.hot-update.js",
"/chunks/subscription-plans.9b07cca19b41d1b68e00.hot-update.js": "/chunks/subscription-plans.9b07cca19b41d1b68e00.hot-update.js",
"/chunks/subscription-service.9b07cca19b41d1b68e00.hot-update.js": "/chunks/subscription-service.9b07cca19b41d1b68e00.hot-update.js",
"/chunks/oasis/platba.cba2f2943cb866639e8c.hot-update.js": "/chunks/oasis/platba.cba2f2943cb866639e8c.hot-update.js",
"/js/main.031a4600b295390c58e8.hot-update.js": "/js/main.031a4600b295390c58e8.hot-update.js",
"/chunks/admin-account.031a4600b295390c58e8.hot-update.js": "/chunks/admin-account.031a4600b295390c58e8.hot-update.js",
"/chunks/app-setup.031a4600b295390c58e8.hot-update.js": "/chunks/app-setup.031a4600b295390c58e8.hot-update.js",
"/chunks/billings-detail.031a4600b295390c58e8.hot-update.js": "/chunks/billings-detail.031a4600b295390c58e8.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.031a4600b295390c58e8.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.031a4600b295390c58e8.hot-update.js",
"/chunks/database.031a4600b295390c58e8.hot-update.js": "/chunks/database.031a4600b295390c58e8.hot-update.js",
"/chunks/environment-setup.031a4600b295390c58e8.hot-update.js": "/chunks/environment-setup.031a4600b295390c58e8.hot-update.js",
"/chunks/installation-disclaimer.031a4600b295390c58e8.hot-update.js": "/chunks/installation-disclaimer.031a4600b295390c58e8.hot-update.js",
"/chunks/purchase-code.031a4600b295390c58e8.hot-update.js": "/chunks/purchase-code.031a4600b295390c58e8.hot-update.js",
"/chunks/stripe-credentials.031a4600b295390c58e8.hot-update.js": "/chunks/stripe-credentials.031a4600b295390c58e8.hot-update.js",
"/chunks/subscription-plans.031a4600b295390c58e8.hot-update.js": "/chunks/subscription-plans.031a4600b295390c58e8.hot-update.js",
"/chunks/subscription-service.031a4600b295390c58e8.hot-update.js": "/chunks/subscription-service.031a4600b295390c58e8.hot-update.js",
"/chunks/user-create.031a4600b295390c58e8.hot-update.js": "/chunks/user-create.031a4600b295390c58e8.hot-update.js",
"/chunks/users.031a4600b295390c58e8.hot-update.js": "/chunks/users.031a4600b295390c58e8.hot-update.js",
"/js/main.e09be2a3c6f157576cd1.hot-update.js": "/js/main.e09be2a3c6f157576cd1.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.e09be2a3c6f157576cd1.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.e09be2a3c6f157576cd1.hot-update.js",
"/chunks/user-create.e09be2a3c6f157576cd1.hot-update.js": "/chunks/user-create.e09be2a3c6f157576cd1.hot-update.js",
"/chunks/users.e09be2a3c6f157576cd1.hot-update.js": "/chunks/users.e09be2a3c6f157576cd1.hot-update.js",
"/js/main.0f9a8ae65e8eef72679b.hot-update.js": "/js/main.0f9a8ae65e8eef72679b.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.0f9a8ae65e8eef72679b.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.0f9a8ae65e8eef72679b.hot-update.js",
"/chunks/user-create.0f9a8ae65e8eef72679b.hot-update.js": "/chunks/user-create.0f9a8ae65e8eef72679b.hot-update.js",
"/chunks/users.0f9a8ae65e8eef72679b.hot-update.js": "/chunks/users.0f9a8ae65e8eef72679b.hot-update.js",
"/js/main.71290e1b9d55d97cdb77.hot-update.js": "/js/main.71290e1b9d55d97cdb77.hot-update.js",
"/js/main.7bea7c94a5a2ebfec4aa.hot-update.js": "/js/main.7bea7c94a5a2ebfec4aa.hot-update.js",
"/js/main.b35488f9ab66392c897e.hot-update.js": "/js/main.b35488f9ab66392c897e.hot-update.js",
"/chunks/user-create.b35488f9ab66392c897e.hot-update.js": "/chunks/user-create.b35488f9ab66392c897e.hot-update.js",
"/chunks/users.b35488f9ab66392c897e.hot-update.js": "/chunks/users.b35488f9ab66392c897e.hot-update.js",
"/js/main.7e1fd694df45763849ec.hot-update.js": "/js/main.7e1fd694df45763849ec.hot-update.js",
"/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.7e1fd694df45763849ec.hot-update.js": "/chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/settings-payment-meth~0bfeabca.7e1fd694df45763849ec.hot-update.js",
"/chunks/user-create.7e1fd694df45763849ec.hot-update.js": "/chunks/user-create.7e1fd694df45763849ec.hot-update.js",
"/chunks/users.7e1fd694df45763849ec.hot-update.js": "/chunks/users.7e1fd694df45763849ec.hot-update.js",
"/chunks/oasis/platba.42fd0177e215d3516bfe.hot-update.js": "/chunks/oasis/platba.42fd0177e215d3516bfe.hot-update.js",
"/chunks/oasis/platba.2bfe3d5044285222d2a5.hot-update.js": "/chunks/oasis/platba.2bfe3d5044285222d2a5.hot-update.js",
"/chunks/oasis/platba.f0e5d3accb7dbdddb2a1.hot-update.js": "/chunks/oasis/platba.f0e5d3accb7dbdddb2a1.hot-update.js",
"/chunks/oasis/platba.53d1b1594090e41edee0.hot-update.js": "/chunks/oasis/platba.53d1b1594090e41edee0.hot-update.js",
"/chunks/oasis/platba.88046b64ea7a1ecadc41.hot-update.js": "/chunks/oasis/platba.88046b64ea7a1ecadc41.hot-update.js",
"/chunks/oasis/platba.8470878c9420955d827c.hot-update.js": "/chunks/oasis/platba.8470878c9420955d827c.hot-update.js",
"/chunks/oasis/platba.f770bc9c5f7ce1baf7bd.hot-update.js": "/chunks/oasis/platba.f770bc9c5f7ce1baf7bd.hot-update.js",
"/chunks/oasis/platba.c22211f85d4e9c4f0187.hot-update.js": "/chunks/oasis/platba.c22211f85d4e9c4f0187.hot-update.js",
"/chunks/oasis/platba.c6784090b07e1acea3a4.hot-update.js": "/chunks/oasis/platba.c6784090b07e1acea3a4.hot-update.js",
"/chunks/oasis/platba.6dca55ec338a4adf73d5.hot-update.js": "/chunks/oasis/platba.6dca55ec338a4adf73d5.hot-update.js",
"/chunks/oasis/platba.c179b9444a3c304bd743.hot-update.js": "/chunks/oasis/platba.c179b9444a3c304bd743.hot-update.js",
"/chunks/oasis/platba.e64577edb6db58c5ce89.hot-update.js": "/chunks/oasis/platba.e64577edb6db58c5ce89.hot-update.js",
"/chunks/oasis/platba.752087d6897e8437d5fd.hot-update.js": "/chunks/oasis/platba.752087d6897e8437d5fd.hot-update.js",
"/chunks/oasis/platba.4a0d0bb38b403c4f63dc.hot-update.js": "/chunks/oasis/platba.4a0d0bb38b403c4f63dc.hot-update.js",
"/chunks/oasis/platba.677433c80d5c448beadb.hot-update.js": "/chunks/oasis/platba.677433c80d5c448beadb.hot-update.js",
"/chunks/oasis/platba.2a47eb5d8bdf839e007c.hot-update.js": "/chunks/oasis/platba.2a47eb5d8bdf839e007c.hot-update.js",
"/chunks/oasis/platba.d722b95e88e73ea2eb8f.hot-update.js": "/chunks/oasis/platba.d722b95e88e73ea2eb8f.hot-update.js",
"/chunks/oasis/platba.c854da135da3e531f267.hot-update.js": "/chunks/oasis/platba.c854da135da3e531f267.hot-update.js",
"/chunks/oasis/platba.15eb2d0c40be7dab8890.hot-update.js": "/chunks/oasis/platba.15eb2d0c40be7dab8890.hot-update.js",
"/chunks/oasis/platba.fe7c9541b5daa645c34b.hot-update.js": "/chunks/oasis/platba.fe7c9541b5daa645c34b.hot-update.js",
"/chunks/oasis/platba.17abba54e59018b56c20.hot-update.js": "/chunks/oasis/platba.17abba54e59018b56c20.hot-update.js",
"/chunks/oasis/platba.3433a1392fa4859957a5.hot-update.js": "/chunks/oasis/platba.3433a1392fa4859957a5.hot-update.js",
"/chunks/oasis/platba.46173a77ba5029b94428.hot-update.js": "/chunks/oasis/platba.46173a77ba5029b94428.hot-update.js",
"/js/main.8665af5c4b5bb3b34562.hot-update.js": "/js/main.8665af5c4b5bb3b34562.hot-update.js",
"/chunks/files~chunks/oasis/platba~chunks/settings-subscription~chunks/shared-files~chunks/shared/file~9d1352fd.js": "/chunks/files~chunks/oasis/platba~chunks/settings-subscription~chunks/shared-files~chunks/shared/file~9d1352fd.js?id=4030b241faac6b31341f",
"/chunks/oasis/platba.8665af5c4b5bb3b34562.hot-update.js": "/chunks/oasis/platba.8665af5c4b5bb3b34562.hot-update.js",
"/chunks/oasis/platba.80793d2faf022b06bc1b.hot-update.js": "/chunks/oasis/platba.80793d2faf022b06bc1b.hot-update.js",
"/chunks/oasis/platba.7e7c5b2678cf3b582143.hot-update.js": "/chunks/oasis/platba.7e7c5b2678cf3b582143.hot-update.js",
"/chunks/oasis/platba.faec9574fd98fd673669.hot-update.js": "/chunks/oasis/platba.faec9574fd98fd673669.hot-update.js",
"/chunks/oasis/platba.38cb9664a00c8d666200.hot-update.js": "/chunks/oasis/platba.38cb9664a00c8d666200.hot-update.js",
"/js/main.936a7e143e3f61eb3914.hot-update.js": "/js/main.936a7e143e3f61eb3914.hot-update.js",
"/chunks/oasis/platba.1808d1c8a24374407483.hot-update.js": "/chunks/oasis/platba.1808d1c8a24374407483.hot-update.js",
"/chunks/oasis/platba.1a91b409bac6643cd1ea.hot-update.js": "/chunks/oasis/platba.1a91b409bac6643cd1ea.hot-update.js",
"/js/main.95d371bd6f737548111d.hot-update.js": "/js/main.95d371bd6f737548111d.hot-update.js",
"/chunks/oasis/platba.95d371bd6f737548111d.hot-update.js": "/chunks/oasis/platba.95d371bd6f737548111d.hot-update.js",
"/js/main.f95f311e9ef928cbdb24.hot-update.js": "/js/main.f95f311e9ef928cbdb24.hot-update.js",
"/chunks/oasis/platba.f95f311e9ef928cbdb24.hot-update.js": "/chunks/oasis/platba.f95f311e9ef928cbdb24.hot-update.js",
"/chunks/oasis/platba.f70ad75ee7d8391c7ee9.hot-update.js": "/chunks/oasis/platba.f70ad75ee7d8391c7ee9.hot-update.js",
"/chunks/oasis/platba.311873ae6c05a6ed334c.hot-update.js": "/chunks/oasis/platba.311873ae6c05a6ed334c.hot-update.js",
"/chunks/oasis/platba.ab3e0239345bccbd7ceb.hot-update.js": "/chunks/oasis/platba.ab3e0239345bccbd7ceb.hot-update.js",
"/chunks/oasis/platba.549be1f1e9c63457b0b3.hot-update.js": "/chunks/oasis/platba.549be1f1e9c63457b0b3.hot-update.js",
"/chunks/oasis/platba.3e92922e3734893c7f75.hot-update.js": "/chunks/oasis/platba.3e92922e3734893c7f75.hot-update.js",
"/chunks/oasis/platba.a313317565ce32b43ea2.hot-update.js": "/chunks/oasis/platba.a313317565ce32b43ea2.hot-update.js",
"/chunks/oasis/platba.533a4dfdf46a35484a36.hot-update.js": "/chunks/oasis/platba.533a4dfdf46a35484a36.hot-update.js",
"/chunks/oasis/platba.f009c76893caadff04e9.hot-update.js": "/chunks/oasis/platba.f009c76893caadff04e9.hot-update.js",
"/chunks/oasis/platba.a611d3444f94bfdce48a.hot-update.js": "/chunks/oasis/platba.a611d3444f94bfdce48a.hot-update.js",
"/chunks/oasis/platba.da13b9373a1e8b01b6be.hot-update.js": "/chunks/oasis/platba.da13b9373a1e8b01b6be.hot-update.js",
"/chunks/oasis/platba.94b702f11bbb84b2a26a.hot-update.js": "/chunks/oasis/platba.94b702f11bbb84b2a26a.hot-update.js",
"/chunks/oasis/platba.7f2261220d4558187716.hot-update.js": "/chunks/oasis/platba.7f2261220d4558187716.hot-update.js",
"/chunks/oasis/platba.0cc8322034321a3f07a5.hot-update.js": "/chunks/oasis/platba.0cc8322034321a3f07a5.hot-update.js",
"/chunks/oasis/platba.097292fe9503aae25f5c.hot-update.js": "/chunks/oasis/platba.097292fe9503aae25f5c.hot-update.js",
"/chunks/oasis/platba.e13e95a4c77c1e976d93.hot-update.js": "/chunks/oasis/platba.e13e95a4c77c1e976d93.hot-update.js",
"/chunks/oasis/platba.0b778201954aeee92d9e.hot-update.js": "/chunks/oasis/platba.0b778201954aeee92d9e.hot-update.js",
"/chunks/oasis/platba.f1ff98bc8e156ba0717a.hot-update.js": "/chunks/oasis/platba.f1ff98bc8e156ba0717a.hot-update.js",
"/chunks/oasis/platba.fce89888954988c4aa4a.hot-update.js": "/chunks/oasis/platba.fce89888954988c4aa4a.hot-update.js",
"/chunks/oasis/platba.1ce9cba436d1432e1e7b.hot-update.js": "/chunks/oasis/platba.1ce9cba436d1432e1e7b.hot-update.js",
"/chunks/oasis/platba.088494b6c1bcac641ea8.hot-update.js": "/chunks/oasis/platba.088494b6c1bcac641ea8.hot-update.js",
"/chunks/oasis/platba.3047a4259cf8eced1123.hot-update.js": "/chunks/oasis/platba.3047a4259cf8eced1123.hot-update.js",
"/chunks/oasis/platba.7bd73539c1fa196e533a.hot-update.js": "/chunks/oasis/platba.7bd73539c1fa196e533a.hot-update.js",
"/chunks/oasis/platba.83349d896d0f64bf6b61.hot-update.js": "/chunks/oasis/platba.83349d896d0f64bf6b61.hot-update.js",
"/chunks/oasis/platba.36d8bb78dffde4b370ac.hot-update.js": "/chunks/oasis/platba.36d8bb78dffde4b370ac.hot-update.js",
"/chunks/oasis/platba.e14b1782f40a456176f6.hot-update.js": "/chunks/oasis/platba.e14b1782f40a456176f6.hot-update.js",
"/chunks/oasis/platba.0079b4d40fea3603cb73.hot-update.js": "/chunks/oasis/platba.0079b4d40fea3603cb73.hot-update.js",
"/chunks/oasis/platba.f24075402b37513bd698.hot-update.js": "/chunks/oasis/platba.f24075402b37513bd698.hot-update.js",
"/chunks/oasis/platba.97687a998911e67890ea.hot-update.js": "/chunks/oasis/platba.97687a998911e67890ea.hot-update.js",
"/chunks/oasis/platba.3b905c02d19f06f61235.hot-update.js": "/chunks/oasis/platba.3b905c02d19f06f61235.hot-update.js",
"/chunks/oasis/platba.d010b9f954f6daafb11f.hot-update.js": "/chunks/oasis/platba.d010b9f954f6daafb11f.hot-update.js",
"/chunks/oasis/platba.6a9e275749c1e5c79937.hot-update.js": "/chunks/oasis/platba.6a9e275749c1e5c79937.hot-update.js",
"/chunks/oasis/platba.7b807076b0666c4cd619.hot-update.js": "/chunks/oasis/platba.7b807076b0666c4cd619.hot-update.js",
"/chunks/oasis/platba.56b15fbaf67d621e3e83.hot-update.js": "/chunks/oasis/platba.56b15fbaf67d621e3e83.hot-update.js",
"/chunks/oasis/platba.66260c70f44ceeabfa27.hot-update.js": "/chunks/oasis/platba.66260c70f44ceeabfa27.hot-update.js",
"/chunks/oasis/platba.387fbc7cc613892f7f4d.hot-update.js": "/chunks/oasis/platba.387fbc7cc613892f7f4d.hot-update.js",
"/chunks/oasis/platba.d7b9c7357f63d3a5b75d.hot-update.js": "/chunks/oasis/platba.d7b9c7357f63d3a5b75d.hot-update.js",
"/chunks/oasis/platba.a22fd03d833229ca8765.hot-update.js": "/chunks/oasis/platba.a22fd03d833229ca8765.hot-update.js",
"/chunks/oasis/platba.1586fec26eed41a695d2.hot-update.js": "/chunks/oasis/platba.1586fec26eed41a695d2.hot-update.js",
"/chunks/oasis/platba.9a79174527f191ff0b5e.hot-update.js": "/chunks/oasis/platba.9a79174527f191ff0b5e.hot-update.js",
"/chunks/oasis/platba.e5077bc37cb72c3edd7e.hot-update.js": "/chunks/oasis/platba.e5077bc37cb72c3edd7e.hot-update.js",
"/chunks/oasis/platba.986e6b3c9af7ed074912.hot-update.js": "/chunks/oasis/platba.986e6b3c9af7ed074912.hot-update.js",
"/chunks/oasis/platba.b1719d99dc48ed7f5077.hot-update.js": "/chunks/oasis/platba.b1719d99dc48ed7f5077.hot-update.js",
"/chunks/oasis/platba.6724e6452a635403e038.hot-update.js": "/chunks/oasis/platba.6724e6452a635403e038.hot-update.js",
"/js/main.bfcc51c8cbe19d02e689.hot-update.js": "/js/main.bfcc51c8cbe19d02e689.hot-update.js",
"/chunks/oasis/platba.bfcc51c8cbe19d02e689.hot-update.js": "/chunks/oasis/platba.bfcc51c8cbe19d02e689.hot-update.js",
"/chunks/oasis/platba.24a6a7a972761fae8ba1.hot-update.js": "/chunks/oasis/platba.24a6a7a972761fae8ba1.hot-update.js",
"/chunks/oasis/platba.a2302361e8c18757ed61.hot-update.js": "/chunks/oasis/platba.a2302361e8c18757ed61.hot-update.js",
"/chunks/oasis/platba.59c33cfbcba62481c77a.hot-update.js": "/chunks/oasis/platba.59c33cfbcba62481c77a.hot-update.js",
"/chunks/oasis/platba.2654656e07f9c3d6b517.hot-update.js": "/chunks/oasis/platba.2654656e07f9c3d6b517.hot-update.js",
"/chunks/oasis/platba.343235256283a5425feb.hot-update.js": "/chunks/oasis/platba.343235256283a5425feb.hot-update.js",
"/chunks/oasis/platba.d91711ab4e599d95ac40.hot-update.js": "/chunks/oasis/platba.d91711ab4e599d95ac40.hot-update.js",
"/chunks/oasis/platba.7c440bd5167b5f691bc1.hot-update.js": "/chunks/oasis/platba.7c440bd5167b5f691bc1.hot-update.js",
"/chunks/oasis/platba.f78f245efdfd2705115d.hot-update.js": "/chunks/oasis/platba.f78f245efdfd2705115d.hot-update.js",
"/chunks/oasis/platba.520ba6d75a64d6f10fdc.hot-update.js": "/chunks/oasis/platba.520ba6d75a64d6f10fdc.hot-update.js",
"/chunks/oasis/platba.06ace6b4690832e8d596.hot-update.js": "/chunks/oasis/platba.06ace6b4690832e8d596.hot-update.js",
"/chunks/oasis/platba.38a0815c3b0389ce5797.hot-update.js": "/chunks/oasis/platba.38a0815c3b0389ce5797.hot-update.js",
"/js/main.d67879825385082f0d36.hot-update.js": "/js/main.d67879825385082f0d36.hot-update.js",
"/chunks/oasis/platba.40f4fdbfe7c883c81eec.hot-update.js": "/chunks/oasis/platba.40f4fdbfe7c883c81eec.hot-update.js",
"/chunks/oasis/platba.9a1b581e7c8bf5a6e420.hot-update.js": "/chunks/oasis/platba.9a1b581e7c8bf5a6e420.hot-update.js",
"/chunks/oasis/platba.a303b57f74a3b5c0e553.hot-update.js": "/chunks/oasis/platba.a303b57f74a3b5c0e553.hot-update.js",
"/chunks/oasis/platba.73ec768e1fe32c114a28.hot-update.js": "/chunks/oasis/platba.73ec768e1fe32c114a28.hot-update.js",
"/chunks/oasis/platba.3bc4d9afa4d0dc248145.hot-update.js": "/chunks/oasis/platba.3bc4d9afa4d0dc248145.hot-update.js",
"/chunks/oasis/platba.7b31d89b8593042dbcbd.hot-update.js": "/chunks/oasis/platba.7b31d89b8593042dbcbd.hot-update.js",
"/chunks/oasis/platba.5cb5e899ea459f99df6d.hot-update.js": "/chunks/oasis/platba.5cb5e899ea459f99df6d.hot-update.js",
"/chunks/oasis/platba.52a9e7ecff39884a88b0.hot-update.js": "/chunks/oasis/platba.52a9e7ecff39884a88b0.hot-update.js",
"/chunks/oasis/platba.585762ed0d7dc06714fd.hot-update.js": "/chunks/oasis/platba.585762ed0d7dc06714fd.hot-update.js",
"/chunks/sign-up.f07bfc6e1ac48990d173.hot-update.js": "/chunks/sign-up.f07bfc6e1ac48990d173.hot-update.js",
"/chunks/oasis/platba.7d9316390f22ac19e2d0.hot-update.js": "/chunks/oasis/platba.7d9316390f22ac19e2d0.hot-update.js",
"/chunks/oasis/platba.c61378e3b0b6389cb731.hot-update.js": "/chunks/oasis/platba.c61378e3b0b6389cb731.hot-update.js",
"/chunks/oasis/platba.54736d5bf911a2179219.hot-update.js": "/chunks/oasis/platba.54736d5bf911a2179219.hot-update.js",
"/chunks/oasis/platba.3012a18c6b196cc483bc.hot-update.js": "/chunks/oasis/platba.3012a18c6b196cc483bc.hot-update.js"
"/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser~ch~52c14f2e.js": "/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser~ch~52c14f2e.js?id=66afa0e341251a68c3d3",
"/js/main.3b480391731f365a3f52.hot-update.js": "/js/main.3b480391731f365a3f52.hot-update.js",
"/chunks/sign-up.3b480391731f365a3f52.hot-update.js": "/chunks/sign-up.3b480391731f365a3f52.hot-update.js",
"/js/main.b99919a59e160ee65c8a.hot-update.js": "/js/main.b99919a59e160ee65c8a.hot-update.js",
"/js/main.45d1c61bb2e9e8cf0302.hot-update.js": "/js/main.45d1c61bb2e9e8cf0302.hot-update.js",
"/chunks/oasis/platba~chunks/upgrade-billing~chunks/upgrade-plan.21f7553d47cd910da71f.hot-update.js": "/chunks/oasis/platba~chunks/upgrade-billing~chunks/upgrade-plan.21f7553d47cd910da71f.hot-update.js",
"/chunks/oasis/platba~chunks/upgrade-billing~chunks/upgrade-plan.8fe37df7d20aae5efa18.hot-update.js": "/chunks/oasis/platba~chunks/upgrade-billing~chunks/upgrade-plan.8fe37df7d20aae5efa18.hot-update.js",
"/js/main.3965bf7a3c03b257c027.hot-update.js": "/js/main.3965bf7a3c03b257c027.hot-update.js",
"/chunks/upgrade-billing.3965bf7a3c03b257c027.hot-update.js": "/chunks/upgrade-billing.3965bf7a3c03b257c027.hot-update.js",
"/chunks/upgrade-plan.3965bf7a3c03b257c027.hot-update.js": "/chunks/upgrade-plan.3965bf7a3c03b257c027.hot-update.js",
"/chunks/upgrade-plan.15d252c8c555b127c42b.hot-update.js": "/chunks/upgrade-plan.15d252c8c555b127c42b.hot-update.js",
"/chunks/oasis/platba~chunks/upgrade-billing~chunks/upgrade-plan.3a539ad9e2ef806281f8.hot-update.js": "/chunks/oasis/platba~chunks/upgrade-billing~chunks/upgrade-plan.3a539ad9e2ef806281f8.hot-update.js",
"/chunks/upgrade-plan.9a9ce5e9b7e36469f74e.hot-update.js": "/chunks/upgrade-plan.9a9ce5e9b7e36469f74e.hot-update.js",
"/chunks/upgrade-plan.ede8c9e527137d31a622.hot-update.js": "/chunks/upgrade-plan.ede8c9e527137d31a622.hot-update.js",
"/chunks/sign-up.f3d31da706b7dcb3a4ba.hot-update.js": "/chunks/sign-up.f3d31da706b7dcb3a4ba.hot-update.js",
"/chunks/sign-up.f745f46af4eead0393c7.hot-update.js": "/chunks/sign-up.f745f46af4eead0393c7.hot-update.js",
"/chunks/upgrade-billing.401f6b87c092047810c0.hot-update.js": "/chunks/upgrade-billing.401f6b87c092047810c0.hot-update.js",
"/js/main.c80c8fc3f6218d5e6816.hot-update.js": "/js/main.c80c8fc3f6218d5e6816.hot-update.js",
"/js/main.eb0461bd5943997e26af.hot-update.js": "/js/main.eb0461bd5943997e26af.hot-update.js",
"/js/main.758ad421dd696a61c775.hot-update.js": "/js/main.758ad421dd696a61c775.hot-update.js",
"/js/main.ab71c889f8d1e54b5b98.hot-update.js": "/js/main.ab71c889f8d1e54b5b98.hot-update.js",
"/js/main.229d883586f78d0e6d3c.hot-update.js": "/js/main.229d883586f78d0e6d3c.hot-update.js",
"/js/main.a61c752fd4acec546d0c.hot-update.js": "/js/main.a61c752fd4acec546d0c.hot-update.js",
"/js/main.bab802281f4e57253350.hot-update.js": "/js/main.bab802281f4e57253350.hot-update.js",
"/js/main.d0d5a027ce7a2506cd84.hot-update.js": "/js/main.d0d5a027ce7a2506cd84.hot-update.js",
"/chunks/upgrade-plan.c1f75fabde65df187895.hot-update.js": "/chunks/upgrade-plan.c1f75fabde65df187895.hot-update.js",
"/chunks/upgrade-billing.1f9bf9b4bc3242ba97d4.hot-update.js": "/chunks/upgrade-billing.1f9bf9b4bc3242ba97d4.hot-update.js",
"/js/main.c021f4f05b81201d60ea.hot-update.js": "/js/main.c021f4f05b81201d60ea.hot-update.js",
"/chunks/upgrade-billing.c021f4f05b81201d60ea.hot-update.js": "/chunks/upgrade-billing.c021f4f05b81201d60ea.hot-update.js",
"/chunks/upgrade-plan.c021f4f05b81201d60ea.hot-update.js": "/chunks/upgrade-plan.c021f4f05b81201d60ea.hot-update.js",
"/chunks/upgrade-billing.5b3d4d331b634d87c44d.hot-update.js": "/chunks/upgrade-billing.5b3d4d331b634d87c44d.hot-update.js",
"/chunks/upgrade-billing.5547ab6008a5996a98b6.hot-update.js": "/chunks/upgrade-billing.5547ab6008a5996a98b6.hot-update.js",
"/chunks/upgrade-billing.b26f4786a324bbd9cbd4.hot-update.js": "/chunks/upgrade-billing.b26f4786a324bbd9cbd4.hot-update.js",
"/chunks/upgrade-billing.ad94563aa4b2181888c5.hot-update.js": "/chunks/upgrade-billing.ad94563aa4b2181888c5.hot-update.js",
"/chunks/sign-up.e8a4dab23ad7f21529fa.hot-update.js": "/chunks/sign-up.e8a4dab23ad7f21529fa.hot-update.js",
"/chunks/sign-in.f1bd5c8d04bcb5c18126.hot-update.js": "/chunks/sign-in.f1bd5c8d04bcb5c18126.hot-update.js",
"/js/main.ffc459445ac0b65eb2e3.hot-update.js": "/js/main.ffc459445ac0b65eb2e3.hot-update.js",
"/chunks/sign-up.ffc459445ac0b65eb2e3.hot-update.js": "/chunks/sign-up.ffc459445ac0b65eb2e3.hot-update.js",
"/js/main.f2c6c4eca35dbea2b7e9.hot-update.js": "/js/main.f2c6c4eca35dbea2b7e9.hot-update.js",
"/chunks/user-create.6515bf69d96cf308f3bf.hot-update.js": "/chunks/user-create.6515bf69d96cf308f3bf.hot-update.js",
"/js/main.f067e231445340555f56.hot-update.js": "/js/main.f067e231445340555f56.hot-update.js",
"/chunks/user-create.f067e231445340555f56.hot-update.js": "/chunks/user-create.f067e231445340555f56.hot-update.js",
"/js/main.640c17e6e068fed6dedf.hot-update.js": "/js/main.640c17e6e068fed6dedf.hot-update.js",
"/js/main.ad221a56a771ab3db438.hot-update.js": "/js/main.ad221a56a771ab3db438.hot-update.js",
"/js/main.59227361266169b6d123.hot-update.js": "/js/main.59227361266169b6d123.hot-update.js"
}

View File

@@ -0,0 +1,232 @@
<template>
<div id="single-page">
<div id="page-content" class="small-width">
<MobileHeader :title="$router.currentRoute.meta.title"/>
<PageHeader :can-back="true" :title="$router.currentRoute.meta.title"/>
<div class="content-page">
<ValidationObserver @submit.prevent="createUser" ref="createUser" v-slot="{ invalid }" tag="form" class="form block-form">
<div class="form-group">
<FormLabel>{{ $t('admin_page_user.create_user.group_details') }}</FormLabel>
<!--Avatar-->
<div class="block-wrapper">
<label>{{ $t('admin_page_user.create_user.avatar') }}</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="avatar" v-slot="{ errors }">
<ImageInput v-model="user.avatar" :error="errors[0]" />
</ValidationProvider>
</div>
<!--Email-->
<div class="block-wrapper">
<label>{{ $t('page_registration.label_email') }}</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="email" rules="required" v-slot="{ errors }">
<input v-model="user.email" :placeholder="$t('admin_page_user.create_user.label_email')" type="email" class="focus-border-theme" :class="{'is-error': errors[0]}"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<!--Name-->
<div class="block-wrapper">
<label>{{ $t('page_registration.label_name') }}</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="user name" rules="required" v-slot="{ errors }">
<input v-model="user.name" :placeholder="$t('admin_page_user.create_user.label_name')" type="text" class="focus-border-theme" :class="{'is-error': errors[0]}"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<!--Password-->
<div class="wrapper-inline">
<div class="block-wrapper">
<label>{{ $t('page_registration.label_pass') }}</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="password" rules="required" v-slot="{ errors }">
<input v-model="user.password" :placeholder="$t('page_registration.placeholder_pass')" type="password" class="focus-border-theme" :class="{'is-error': errors[0]}"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>{{ $t('page_registration.label_confirm_pass') }}</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="password confirm" rules="required" v-slot="{ errors }">
<input v-model="user.password_confirmation" :placeholder="$t('admin_page_user.create_user.label_conf_pass')" type="password" class="focus-border-theme" :class="{'is-error': errors[0]}"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
</div>
</div>
<div class="form-group">
<FormLabel>{{ $t('admin_page_user.create_user.group_settings') }}</FormLabel>
<!--User Role-->
<div class="block-wrapper">
<label>{{ $t('admin_page_user.select_role') }}:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="permission" rules="required" v-slot="{ errors }">
<SelectInput v-model="user.role" :options="roles" :placeholder="$t('admin_page_user.select_role')" :isError="errors[0]"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<!--Storage Capacity-->
<div class="block-wrapper">
<label>{{ $t('admin_page_user.label_change_capacity') }}</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="storage capacity" rules="required" v-slot="{ errors }">
<input v-model="user.storage_capacity" min="1" max="999999999" :placeholder="$t('admin_page_user.label_change_capacity')" type="number" class="focus-border-theme" :class="{'is-error': errors[0]}"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
</div>
<div class="form-group">
<ButtonBase :disabled="isLoading" :loading="isLoading" button-style="theme" type="submit">
{{ $t('admin_page_user.create_user.submit') }}
</ButtonBase>
</div>
</ValidationObserver>
</div>
</div>
</div>
</template>
<script>
import {ValidationProvider, ValidationObserver} from 'vee-validate/dist/vee-validate.full'
import SelectInput from '@/components/Others/Forms/SelectInput'
import ImageInput from '@/components/Others/Forms/ImageInput'
import FormLabel from '@/components/Others/Forms/FormLabel'
import MobileHeader from '@/components/Mobile/MobileHeader'
import SectionTitle from '@/components/Others/SectionTitle'
import ButtonBase from '@/components/FilesView/ButtonBase'
import PageHeader from '@/components/Others/PageHeader'
import {required} from 'vee-validate/dist/rules'
import { mapGetters } from 'vuex'
import {events} from "@/bus"
import axios from 'axios'
export default {
name: 'Profile',
components: {
ValidationProvider,
ValidationObserver,
SectionTitle,
MobileHeader,
SelectInput,
ButtonBase,
ImageInput,
PageHeader,
FormLabel,
required,
},
computed: {
...mapGetters(['roles']),
},
data() {
return {
isLoading: false,
user: {
role: '',
avatar: undefined,
name: '',
email: '',
password: '',
password_confirmation: '',
storage_capacity: 5,
},
}
},
methods: {
async createUser() {
// Validate fields
const isValid = await this.$refs.createUser.validate();
if (!isValid) return;
// Start loading
this.isLoading = true
// Create form
let formData = new FormData()
// Add image to form
formData.append('name', this.user.name)
formData.append('role', this.user.role)
formData.append('email', this.user.email)
formData.append('password', this.user.password)
formData.append('storage_capacity', this.user.storage_capacity)
formData.append('password_confirmation', this.user.password_confirmation)
// Append avatar if exist
if (this.user.avatar)
formData.append('avatar', this.user.avatar)
// Send request to get user token
axios
.post('/api/oasis/admin/users/create-user', formData, {
headers: {
'Content-Type': 'multipart/form-data',
}
})
.then(response => {
// End loading
this.isLoading = false
// Show toaster
events.$emit('toaster', {
type: 'success',
message: this.$t('toaster.created_user'),
})
// Go to User page
this.$router.push({name: 'UserDetail', params: {id: response.data.data.id}})
})
.catch(error => {
// Validation errors
if (error.response.status == 422) {
// Email validation error
if (error.response.data.errors['email']) {
this.$refs.createUser.setErrors({
'email': error.response.data.errors['email']
});
}
// Password validation error
if (error.response.data.errors['password']) {
this.$refs.createUser.setErrors({
'password': error.response.data.errors['password']
});
}
// Password validation error
if (error.response.data.errors['storage_capacity']) {
this.$refs.createUser.setErrors({
'storage capacity': this.$t('errors.capacity_digit')
});
}
} else {
events.$emit('alert:open', {
title: this.$t('popup_error.title'),
message: this.$t('popup_error.message'),
})
}
// End loading
this.isLoading = false
})
}
},
}
</script>
<style lang="scss" scoped>
@import '@assets/vuefilemanager/_variables';
@import '@assets/vuefilemanager/_mixins';
@import '@assets/vuefilemanager/_forms';
</style>

View File

@@ -212,7 +212,7 @@
this.isLoading = true
axios
.post('/api/oasis/admin/users/create', this.user)
.post('/api/oasis/admin/users/create-order', this.user)
.then(response => {
// Show toaster

View File

@@ -0,0 +1,198 @@
<template>
<AuthContentWrapper ref="auth">
<!--Registration-->
<AuthContent name="sign-up" :visible="true">
<img v-if="config.app_logo" class="logo" :src="$getImage(config.app_logo)" :alt="config.app_name">
<b v-if="! config.app_logo" class="auth-logo-text">{{ config.app_name }}</b>
<h1>{{ $t('page_registration.title') }}</h1>
<h2>{{ $t('page_registration.subtitle') }}</h2>
<ValidationObserver @submit.prevent="signUp" ref="sign_up" v-slot="{ invalid }" tag="form"
class="form block-form">
<div class="block-wrapper">
<label>{{ $t('page_registration.label_email') }}</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="E-Mail" rules="required"
v-slot="{ errors }">
<input v-model="register.email" :placeholder="$t('page_registration.placeholder_email')" type="email"
class="focus-border-theme"
:class="{'is-error': errors[0]}"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>{{ $t('page_registration.label_name') }}</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Full Name" rules="required"
v-slot="{ errors }">
<input v-model="register.name" :placeholder="$t('page_registration.placeholder_name')" type="text"
class="focus-border-theme"
:class="{'is-error': errors[0]}"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>{{ $t('page_registration.label_pass') }}</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Your New Password"
rules="required" v-slot="{ errors }">
<input v-model="register.password" :placeholder="$t('page_registration.placeholder_pass')" type="password"
class="focus-border-theme"
:class="{'is-error': errors[0]}"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>{{ $t('page_registration.label_confirm_pass') }}</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper" name="Confirm Your Password"
rules="required" v-slot="{ errors }">
<input v-model="register.password_confirmation" :placeholder="$t('page_registration.placeholder_confirm_pass')"
class="focus-border-theme"
type="password" :class="{'is-error': errors[0]}"/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div>
<i18n path="page_registration.agreement" tag="p" class="legal-agreement">
<router-link :to="{name: 'DynamicPage', params: {slug: 'terms-of-service'}}" target="_blank" class="text-theme">{{ termsOfService.title }}</router-link>
<router-link :to="{name: 'DynamicPage', params: {slug: 'privacy-policy'}}" target="_blank" class="text-theme">{{ privacyPolicy.title }}</router-link>
</i18n>
<AuthButton icon="chevron-right" :text="$t('page_registration.button_create_account')" :loading="isLoading" :disabled="isLoading"/>
</div>
</ValidationObserver>
<span class="additional-link">{{ $t('page_registration.have_an_account') }}
<router-link :to="{name: 'SignIn'}" class="text-theme">
{{ $t('page_forgotten_password.password_remember_button') }}
</router-link>
</span>
</AuthContent>
</AuthContentWrapper>
</template>
<script>
import AuthContentWrapper from '@/components/Auth/AuthContentWrapper'
import {ValidationProvider, ValidationObserver} from 'vee-validate/dist/vee-validate.full'
import AuthContent from '@/components/Auth/AuthContent'
import AuthButton from '@/components/Auth/AuthButton'
import {required} from 'vee-validate/dist/rules'
import {mapGetters} from 'vuex'
import {events} from "@/bus"
import axios from 'axios'
export default {
name: 'SignUp',
components: {
AuthContentWrapper,
ValidationProvider,
ValidationObserver,
AuthContent,
AuthButton,
required,
},
computed: {
...mapGetters(['config']),
privacyPolicy() {
return this.config.legal.find(legal => {
return legal.slug === 'privacy-policy'
})
},
termsOfService() {
return this.config.legal.find(legal => {
return legal.slug === 'terms-of-service'
})
},
},
data() {
return {
isLoading: false,
register: {
name: 'Peter',
email: 'john@doe.com',
password: 'vuefilemanager',
password_confirmation: 'vuefilemanager',
},
}
},
methods: {
async signUp() {
// Validate fields
const isValid = await this.$refs.sign_up.validate();
if (!isValid) return;
// Start loading
this.isLoading = true
// Send request to get user token
axios
.post('/register', this.register)
.then(() => {
// End loading
this.isLoading = false
// Set login state
this.$store.commit('SET_AUTHORIZED', true)
// Go to files page
this.$router.push({name: 'SetUpPlan'})
})
.catch(error => {
if (error.response.status == 500) {
events.$emit('alert:open', {
emoji: '🤔',
title: this.$t('popup_signup_error.title'),
message: this.$t('popup_signup_error.message')
})
}
if (error.response.status == 422) {
if (error.response.data.errors['email']) {
this.$refs.sign_up.setErrors({
'E-Mail': error.response.data.errors['email']
});
}
if (error.response.data.errors['password']) {
this.$refs.sign_up.setErrors({
'Your New Password': error.response.data.errors['password']
});
}
}
// End loading
this.isLoading = false
})
}
},
created() {
this.$scrollTop()
}
}
</script>
<style scoped lang="scss">
@import '@assets/vuefilemanager/_auth-form';
@import '@assets/vuefilemanager/_auth';
.legal-agreement {
@include font-size(16);
padding: 55px 0 0;
max-width: 400px;
font-weight: 700;
line-height: 1.6;
margin: 0 auto;
}
</style>

View File

@@ -0,0 +1,707 @@
<template>
<div id="single-page">
<div id="page-content" class="large-width center-page" v-show="! isLoading">
<MobileHeader :title="$router.currentRoute.meta.title" />
<div class="content-page">
<div class="plan-title">
<credit-card-icon size="42" class="title-icon"></credit-card-icon>
<h1>{{ $t('page_upgrade_account.title') }}</h1>
<h2>{{ $t('page_upgrade_account.desription') }}</h2>
</div>
<div class="order">
<div class="steps">
<div class="payment-card">
<FormLabel>{{ $t('page_upgrade_account.section_card') }}</FormLabel>
<!-- Pay by new credit card -->
<div class="register-card">
<InfoBox v-if="config.isDemo">
<p>For test your payment please use <b>4242 4242 4242 4242</b> or <b>5555 5555 5555 4444</b> as a card number, <b>11/22</b>
as the expiration date and <b>123</b> as CVC number and ZIP <b>12345</b>.</p>
</InfoBox>
<div ref="stripeCard" class="stripe-card" :class="{'is-error': isError }"></div>
<div class="card-error-message" v-if="isError">
<span>{{ errorMessage }}</span>
</div>
</div>
</div>
<div class="billing" v-if="billing">
<FormLabel>{{ $t('page_upgrade_account.section_billing') }}</FormLabel>
<ValidationObserver ref="order" v-slot="{ invalid }" tag="form" class="form block-form">
<div class="form block-form">
<div class="block-wrapper">
<label>{{ $t('user_settings.name') }}:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper"
rules="required"
name="billing_name" v-slot="{ errors }">
<input v-model="billing.name"
:placeholder="$t('user_settings.name_plac')"
type="text"
:class="{'is-error': errors[0]}"
/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>{{ $t('user_settings.address') }}:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper"
rules="required"
name="billing_address" v-slot="{ errors }">
<input v-model="billing.address"
:placeholder="$t('user_settings.address_plac')"
type="text"
:class="{'is-error': errors[0]}"
/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="wrapper-inline">
<div class="block-wrapper">
<label>{{ $t('user_settings.city') }}:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper"
rules="required" name="billing_city"
v-slot="{ errors }">
<input v-model="billing.city"
:placeholder="$t('user_settings.city_plac')"
type="text"
:class="{'is-error': errors[0]}"
/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>{{ $t('user_settings.postal_code') }}:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper"
rules="required" name="billing_postal_code"
v-slot="{ errors }">
<input v-model="billing.postal_code"
:placeholder="$t('user_settings.postal_code_plac')"
type="text"
:class="{'is-error': errors[0]}"
/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
</div>
<div class="block-wrapper">
<label>{{ $t('user_settings.country') }}:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper"
rules="required"
name="billing_country" v-slot="{ errors }">
<SelectInput v-model="billing.country"
:default="billing.country"
:options="countries"
:placeholder="$t('user_settings.country_plac')"
:isError="errors[0]" />
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>{{ $t('user_settings.state') }}:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper"
rules="required"
name="billing_state" v-slot="{ errors }">
<input v-model="billing.state"
:placeholder="$t('user_settings.state_plac')"
type="text"
:class="{'is-error': errors[0]}"
/>
<small class="input-help">
State, county, province, or region.
</small>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
<div class="block-wrapper">
<label>{{ $t('user_settings.phone_number') }}:</label>
<ValidationProvider tag="div" mode="passive" class="input-wrapper"
rules="required"
name="billing_phone_number" v-slot="{ errors }">
<input v-model="billing.phone_number"
:placeholder="$t('user_settings.phone_number_plac')"
type="text"
:class="{'is-error': errors[0]}"
/>
<span class="error-message" v-if="errors[0]">{{ errors[0] }}</span>
</ValidationProvider>
</div>
</div>
</ValidationObserver>
</div>
</div>
<div class="summary">
<FormLabel>{{ $t('page_upgrade_account.section_summary') }}</FormLabel>
<div class="summary-list" :class="{'is-error': isError}" v-if="requestedPlan">
<div class="row">
<div class="cell">
<b>{{ requestedPlan.data.attributes.name }}</b>
<small>{{ $t('page_upgrade_account.summary.period') }}</small>
</div>
<div class="cell">
<b>{{ requestedPlan.data.attributes.price }}</b>
</div>
</div>
<div class="row" v-if="taxRates">
<div class="cell">
<b>{{ $t('page_upgrade_account.summary.vat') }} - ({{ taxRates.country }} {{ taxRates.percentage }}%)</b>
</div>
<div class="cell">
<b>{{ taxRates.plan_price_formatted }}</b>
</div>
</div>
<!--Show total when tax rates is not specified-->
<div class="row" v-if="! taxRates">
<div class="cell">
<b>{{ $t('global.total') }}</b>
</div>
<div class="cell">
<b>{{ requestedPlan.data.attributes.price }}</b>
</div>
</div>
<!--Show total when is tax rates-->
<div class="row" v-if="taxRates">
<div class="cell">
<b>{{ $t('page_upgrade_account.summary.total_with_vat') }}</b>
</div>
<div class="cell">
<b>{{ taxRates.plan_price_formatted }}</b>
</div>
</div>
<ButtonBase :disabled="isSubmitted" :loading="isSubmitted" @click.native="submitOrder"
type="submit" button-style="theme-solid" class="next-submit">
{{ $t('page_upgrade_account.summary.submit_button') }}
</ButtonBase>
<p class="error-message" v-if="isError">{{ errorMessage }}</p>
<small class="disclaimer">
{{ $t('page_upgrade_account.summary.submit_disclaimer', {app: config.app_name}) }}
</small>
</div>
</div>
</div>
</div>
</div>
<div id="loader" v-if="isLoading">
<Spinner></Spinner>
</div>
</div>
</template>
<script>
import {ValidationProvider, ValidationObserver} from 'vee-validate/dist/vee-validate.full'
import PlanPricingTables from '@/components/Others/PlanPricingTables'
import SelectInput from '@/components/Others/Forms/SelectInput'
import FormLabel from '@/components/Others/Forms/FormLabel'
import MobileHeader from '@/components/Mobile/MobileHeader'
import ButtonBase from '@/components/FilesView/ButtonBase'
import InfoBox from '@/components/Others/Forms/InfoBox'
import ColorLabel from '@/components/Others/ColorLabel'
import PageHeader from '@/components/Others/PageHeader'
import Spinner from '@/components/FilesView/Spinner'
import {CreditCardIcon} from 'vue-feather-icons'
import {required} from 'vee-validate/dist/rules'
import {mapGetters} from 'vuex'
import {events} from "@/bus"
import axios from 'axios'
let [stripe, card] = [undefined, undefined];
export default {
name: 'SelectPlan',
components: {
ValidationProvider,
ValidationObserver,
PlanPricingTables,
CreditCardIcon,
MobileHeader,
SelectInput,
ButtonBase,
PageHeader,
ColorLabel,
FormLabel,
required,
Spinner,
InfoBox,
},
computed: {
...mapGetters(['requestedPlan', 'config', 'countries']),
billing() {
return this.$store.getters.user.data.relationships.settings.data.attributes
},
taxRates() {
return this.requestedPlan.data.attributes.tax_rates.find(taxRate => {
return taxRate.country === this.billing.country
})
}
},
data() {
return {
complete: false,
stripeOptions: {
hidePostalCode: false
},
isLoading: true,
isSubmitted: false,
errorMessage: undefined,
isError: false,
clientSecret: undefined
}
},
methods: {
initStripe() {
stripe = Stripe(this.config.stripe_public_key)
let elements = stripe.elements();
card = elements.create('card');
card.mount(this.$refs.stripeCard);
},
successOrder() {
// Update user data
this.$store.dispatch('getAppData')
// Show toaster
events.$emit('toaster', {
type: 'success',
message: this.$t('toaster.account_upgraded'),
})
// Go to User page
this.$router.push({name: 'Files'})
},
errorOrder(error) {
// Redirect user to confirmation payment page
if (error.response.status === 402) {
window.location.href = error.response.data.message;
}
// Show user error message
if (error.response.status === 400) {
this.isError = true
this.errorMessage = error.response.data.message
}
// Show server error
if (error.response.status === 500) {
this.isError = true
this.errorMessage = error.response.data.message
events.$emit('alert:open', {
title: this.$t('popup_error.title'),
message: this.$t('popup_error.message'),
})
}
},
async submitOrder() {
// Validate fields
const isValid = await this.$refs.order.validate();
if (!isValid) return;
// Remove error
this.isError = false
// Start loading
this.isSubmitted = true
const {setupIntent, error} = await stripe.confirmCardSetup(this.clientSecret, {
payment_method: {
card: card,
}
})
if (error) {
// Set error on
this.isError = true
// End button spinner
this.isSubmitted = false
// Show error message
this.errorMessage = error.message
} else {
axios
.post('/api/oasis/subscribe', {
billing: {
billing_address: this.billing.address,
billing_city: this.billing.city,
billing_country: this.billing.country,
billing_name: this.billing.name,
billing_phone_number: this.billing.phone_number,
billing_postal_code: this.billing.postal_code,
billing_state: this.billing.state,
},
plan: this.requestedPlan,
payment: {
type: 'stripe',
meta: {
pm: setupIntent.payment_method,
}
}
})
.then(() => {
this.successOrder()
})
.catch((error) => {
this.errorOrder(error)
})
.finally(() => {
this.isSubmitted = false
})
}
},
},
mounted: function () {
if (!this.requestedPlan) {
this.$router.push({name: 'SetUpPlan'})
} else {
this.initStripe()
}
},
created() {
// Get setup intent for stripe
axios.get('/api/user/subscription/setup-intent')
.then(response => {
this.clientSecret = response.data.client_secret
})
.catch(() => {
this.$isSomethingWrong()
})
}
}
</script>
<style lang="scss" scoped>
@import '@assets/vuefilemanager/_variables';
@import '@assets/vuefilemanager/_mixins';
@import '@assets/vuefilemanager/_forms';
.change-payment {
padding-top: 10px;
span {
font-weight: 600;
}
a {
cursor: pointer;
font-weight: 700;
&:hover {
text-decoration: underline;
}
}
span, a {
color: $text-muted;
@include font-size(14);
}
}
.card-error-message {
padding-top: 10px;
span, a {
@include font-size(14);
font-weight: 600;
color: $danger;
}
.link, a {
text-decoration: underline;
cursor: pointer;
&:hover {
text-decoration: none;
}
}
}
.registered-cards {
margin-bottom: 50px;
}
.register-card {
margin-bottom: 55px;
}
.credit-card {
display: flex;
align-items: center;
justify-content: space-between;
padding: 15px;
background: $light_background;
border-radius: 8px;
margin-top: 20px;
&.is-error {
box-shadow: 0 0 7px rgba($danger, 0.3);
border: 2px solid $danger;
border-radius: 4px;
}
span {
font-weight: 700;
}
.card-number {
display: flex;
}
.credit-card-numbers {
vertical-align: middle;
margin-right: 10px;
}
.credit-card-icon {
vertical-align: middle;
max-height: 20px;
margin-right: 8px;
}
}
.stripe-card {
box-sizing: border-box;
padding: 13px 20px;
border: 1px solid transparent;
border-radius: 4px;
background-color: white;
box-shadow: 0 1px 3px 0 #e6ebf1;
-webkit-transition: box-shadow 150ms ease;
transition: box-shadow 150ms ease;
&.is-error {
box-shadow: 0 0 7px rgba($danger, 0.3);
border: 2px solid $danger;
border-radius: 4px;
}
&.StripeElement--focus {
box-shadow: 0 1px 3px 0 #cfd7df;
}
&.StripeElement--invalid {
border-color: #fa755a;
}
&.StripeElement--webkit-autofill {
background-color: #fefde5 !important;
}
iframe .InputContainer .InputElement {
color: white;
}
}
.summary-list {
box-shadow: 0 7px 20px 5px hsla(220, 36%, 16%, 0.06);
border-radius: 8px;
position: sticky;
padding: 25px;
top: 30px;
&.is-error {
border: 2px solid $danger;
box-shadow: 0 7px 20px 5px rgba($danger, 0.06);
}
.error-message {
font-weight: 600;
}
.next-submit {
width: 100%;
margin-top: 20px;
}
.disclaimer {
@include font-size(12);
line-height: 1.6;
display: block;
margin-top: 12px;
}
.row {
display: flex;
justify-content: space-between;
padding: 15px 0;
&:first-child {
padding-top: 0;
}
&:last-of-type {
border-top: 1px solid $light_mode_border;
padding-bottom: 0;
b {
font-weight: 800;
}
}
}
.cell {
b {
display: block;
@include font-size(18);
}
small {
color: $text-muted;
@include font-size(12);
}
}
}
.order {
display: flex;
margin-bottom: 30px;
.steps {
flex: 0 0 65%;
padding-right: 30px;
.form {
max-width: 100%;
}
}
.summary {
flex: 0 0 34%;
}
}
.plan-title {
text-align: center;
max-width: 600px;
margin: 0 auto 80px;
path, line, polyline, rect, circle {
color: $theme;
}
h1 {
@include font-size(38);
font-weight: 800;
margin-bottom: 5px;
}
h2 {
@include font-size(20);
font-weight: 500;
}
}
@media (prefers-color-scheme: dark) {
.plan-title {
h1 {
color: $dark_mode_text_primary;
}
h2 {
color: $dark_mode_text_secondary;
}
}
.credit-card {
background: $dark_mode_foreground;
span, .credit-card-numbers {
color: $dark_mode_text_primary;
}
}
.change-payment {
span {
color: $dark_mode_text_secondary;
}
a {
color: $theme;
}
}
.summary-list {
background: $dark_mode_foreground;
.disclaimer {
color: $dark_mode_text_secondary;
}
.row {
&:last-of-type {
border-top: 1px solid $dark_mode_border_color;
b {
color: $dark_mode_text_primary;
}
}
}
.cell {
b {
color: $dark_mode_text_primary;
}
small {
color: $dark_mode_text_secondary;
}
}
}
.stripe-card {
border: 1px solid transparent;
//background-color: $dark_mode_foreground;
box-shadow: none;
&.StripeElement--webkit-autofill {
background-color: $dark_mode_foreground !important;
}
&.StripeElement--focus {
box-shadow: none;
border-color: $theme;
box-shadow: 0 1px 5px rgba($theme, 0.3);
}
}
}
@media only screen and (max-width: 960px) {
.order {
display: block;
.steps {
margin-bottom: 70px;
}
}
}
</style>

View File

@@ -0,0 +1,116 @@
<template>
<div id="single-page">
<div id="page-content" class="large-width center-page" v-show="! isLoading">
<MobileHeader :title="$router.currentRoute.meta.title"/>
<div class="content-page">
<!--Page Title-->
<div class="plan-title">
<cloud-icon size="42" class="title-icon"></cloud-icon>
<h1>{{ $t('page_pricing_tables.title') }}</h1>
<h2>{{ $t('page_pricing_tables.description') }}</h2>
</div>
<!--Pricing Tables-->
<PlanPricingTables v-if="user" custom-route="FinishPayment" @load="onLoadPricingTables" @selected-plan="onSelectTable"/>
</div>
</div>
<div id="loader" v-if="isLoading">
<Spinner></Spinner>
</div>
</div>
</template>
<script>
import PlanPricingTables from '@/components/Others/PlanPricingTables'
import MobileHeader from '@/components/Mobile/MobileHeader'
import PageHeader from '@/components/Others/PageHeader'
import Spinner from '@/components/FilesView/Spinner'
import { CloudIcon } from 'vue-feather-icons'
import axios from 'axios'
import {mapGetters} from "vuex";
export default {
name: 'UpgradePlan',
components: {
PlanPricingTables,
MobileHeader,
PageHeader,
CloudIcon,
Spinner,
},
computed: {
...mapGetters([
'user'
]),
},
data() {
return {
isLoading: true,
}
},
methods: {
onLoadPricingTables(state) {
this.isLoading = state
},
onSelectTable(plan) {
this.$store.commit('STORE_REQUESTED_PLAN', plan)
}
},
beforeMount() {
let StripeElementsScript = document.createElement('script')
StripeElementsScript.setAttribute('src', 'https://js.stripe.com/v3/')
document.head.appendChild(StripeElementsScript)
},
mounted() {
// Reload user data
this.$store.dispatch('getAppData')
}
}
</script>
<style lang="scss" scoped>
@import '@assets/vuefilemanager/_variables';
@import '@assets/vuefilemanager/_mixins';
@import '@assets/vuefilemanager/_forms';
.plan-title {
text-align: center;
max-width: 600px;
margin: 0 auto 80px;
path, line, polyline, rect, circle {
color: $theme;
}
h1 {
@include font-size(38);
font-weight: 800;
margin-bottom: 5px;
}
h2 {
@include font-size(20);
font-weight: 500;
}
}
@media only screen and (max-width: 960px) {
}
@media (prefers-color-scheme: dark) {
.plan-title {
h1 {
color: $dark_mode_text_primary;
}
h2 {
color: $dark_mode_text_secondary;
}
}
}
</style>

View File

@@ -39,6 +39,9 @@
HardDriveIcon,
ButtonBase,
},
props: [
'customRoute'
],
data() {
return {
plans: undefined,
@@ -50,7 +53,10 @@
methods: {
selectPlan(plan) {
this.$emit('selected-plan', plan)
this.$router.push({name: 'UpgradeBilling'})
let route = this.customRoute ? this.customRoute : 'UpgradeBilling'
this.$router.push({name: route})
}
},
created() {

View File

@@ -9,6 +9,35 @@ import UserProfileMobileMenu from './views/Mobile/UserProfileMobileMenu'
Vue.use(Router)
const routesOasis = [
{
name: 'SignUp',
path: '/sign-up',
component: () =>
import(/* webpackChunkName: "chunks/sign-up" */ './Oasis/Auth/SignUp'),
meta: {
requiresAuth: false
},
},
{
name: 'SetUpPlan',
path: '/nastavte-plan',
component: () =>
import(/* webpackChunkName: "chunks/upgrade-plan" */ './Oasis/Onboarding/SelectPlan'),
meta: {
requiresAuth: true,
title: i18n.t('routes_title.upgrade_plan')
},
},
{
name: 'FinishPayment',
path: '/dokoncete-objednavku',
component: () =>
import(/* webpackChunkName: "chunks/upgrade-billing" */ './Oasis/Onboarding/PayForPlan'),
meta: {
requiresAuth: true,
title: i18n.t('routes_title.upgrade_billing')
},
},
{
name: 'SubscriptionRequestPayment',
path: '/platba/:id',
@@ -53,7 +82,7 @@ const routesOasis = [
name: 'CreateSubscriptionRequest',
path: '/admin/user/order',
component: () =>
import(/* webpackChunkName: "chunks/user-create" */ './Oasis/Admin/CreateSubscriptionRequest'),
import(/* webpackChunkName: "chunks/user-create" */ './Oasis/Admin/UserCreateOrder'),
meta: {
requiresAuth: true,
title: i18n.t('routes_title.user_create')

View File

@@ -16,9 +16,9 @@ const actions = {
.then((response) => {
resolve(response)
// Redirect user if is logged
if (router.currentRoute.name === 'SignIn')
router.push({name: 'Files'})
// Oasis redirection to setup plan process after sign in
if (response.data.data.attributes.role === 'user' && ! response.data.data.relationships.settings.data.attributes.payment_activation)
router.push({name: 'SetUpPlan'})
commit('RETRIEVE_USER', response.data)
@@ -29,7 +29,6 @@ const actions = {
if ([401, 403].includes(error.response.status)) {
commit('SET_AUTHORIZED', false)
//router.push({name: 'SignIn'})
}
}
)

View File

@@ -193,17 +193,6 @@
});
}
if (error.response.status == 401) {
if (error.response.data.error === 'invalid_client') {
events.$emit('alert:open', {
emoji: '🤔',
title: this.$t('popup_passport_error.title'),
message: this.$t('popup_passport_error.message')
})
}
}
// End loading
this.isLoading = false
})
@@ -214,8 +203,8 @@
this.$store.commit('PROCESSING_POPUP', undefined)
//if (this.config.isDemo) {
this.loginEmail = 'howdy@hi5ve.digital'
this.loginPassword = 'vuefilemanager'
this.loginEmail = 'howdy@hi5ve.digital'
this.loginPassword = 'vuefilemanager'
//}
}
}

View File

@@ -8,12 +8,13 @@ Route::group(['middleware' => 'api', 'prefix' => '/api/oasis'], function () {
// Admin
Route::group(['middleware' => 'auth:sanctum', 'prefix' => 'admin'], function () {
Route::get('/company-details', [AdminController::class, 'get_company_details']);
Route::post('/users/create', [AdminController::class, 'register_new_client']);
Route::post('/users/create-order', [AdminController::class, 'create_order']);
Route::post('/users/create-user', [AdminController::class, 'create_user']);
});
// Subscription
Route::group(['prefix' => 'subscribe'], function () {
Route::post('/{order}', [SubscriptionController::class, 'subscribe']);
Route::post('/{order?}', [SubscriptionController::class, 'subscribe']);
Route::get('/{order}', [SubscriptionController::class, 'get_subscription_request']);
Route::get('/{order}/setup-intent', [SubscriptionController::class, 'get_setup_intent']);
});

View File

@@ -5,9 +5,11 @@ namespace Tests\Feature\Oasis;
use App\Models\User;
use App\Notifications\Oasis\PaymentRequiredNotification;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Http;
use Laravel\Sanctum\Sanctum;
use Notification;
use Storage;
use Tests\TestCase;
class OasisAdminTest extends TestCase
@@ -64,7 +66,7 @@ class OasisAdminTest extends TestCase
/**
* @test
*/
public function it_register_new_client_from_admin_panel()
public function it_create_client_order()
{
Notification::fake();
@@ -73,7 +75,7 @@ class OasisAdminTest extends TestCase
Sanctum::actingAs($admin);
$this->postJson('/api/oasis/admin/users/create', [
$this->postJson('/api/oasis/admin/users/create-order', [
'ico' => '08995281',
'name' => 'GDPR Cloud Solution, s.r.o.',
'email' => 'john@doe.com',
@@ -107,4 +109,44 @@ class OasisAdminTest extends TestCase
Notification::assertSentTo($newbie, PaymentRequiredNotification::class);
}
/**
* @test
*/
public function it_create_new_user_with_avatar()
{
Storage::fake('local');
$admin = User::factory(User::class)
->create(['role' => 'admin']);
Sanctum::actingAs($admin);
$avatar = UploadedFile::fake()
->image('fake-image.jpg');
$this->postJson("/api/oasis/admin/users/create-user", [
'name' => 'John Doe',
'role' => 'user',
'email' => 'john@doe.com',
'password' => 'VerySecretPassword',
'storage_capacity' => 15,
'password_confirmation' => 'VerySecretPassword',
'avatar' => $avatar,
])->assertStatus(201);
$this->assertDatabaseHas('users', [
'email' => 'john@doe.com'
]);
$this->assertDatabaseHas('user_settings', [
'name' => 'John Doe',
'payment_activation' => 1,
]);
Storage::disk('local')
->assertExists(
User::whereEmail('john@doe.com')->first()->settings->getRawOriginal('avatar')
);
}
}

View File

@@ -9,6 +9,7 @@ use App\Services\Oasis\OasisService;
use Carbon\Carbon;
use Cartalyst\Stripe\Stripe;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Sanctum\Sanctum;
use Notification;
use Tests\TestCase;
@@ -87,7 +88,7 @@ class OasisSubscriptionTest extends TestCase
/**
* @test
*/
public function it_subscribe_user_and_pay_for_it()
public function it_subscribe_user_from_subscription_request()
{
$user = User::factory(User::class)
->create(['role' => 'user']);
@@ -145,6 +146,67 @@ class OasisSubscriptionTest extends TestCase
]);
}
/**
* @test
*/
public function it_subscribe_user_after_signup()
{
$user = User::factory(User::class)
->create(['role' => 'user']);
Sanctum::actingAs($user);
// Register payment method
$stripe = Stripe::make(config('cashier.secret'), '2020-03-02');
// Create test payment method
$paymentMethod = $stripe->paymentMethods()->create([
'type' => 'card',
'card' => [
'number' => '4242424242424242',
'exp_month' => 11,
'exp_year' => 2022,
'cvc' => '123'
],
]);
// Create stripe customer
$user->createOrGetStripeCustomer();
$this->postJson("/api/oasis/subscribe", [
'plan' => $this->plan,
'billing' => [
'billing_address' => '2794 Alfreda Mount Suite 467 East Crystalberg',
'billing_city' => 'Christianfort',
'billing_country' => 'SK',
'billing_name' => 'Heidi Romaguera PhD',
'billing_phone_number' => '+421',
'billing_postal_code' => '59445',
'billing_state' => 'SK',
],
'payment' => [
'type' => 'stripe',
'meta' => [
'pm' => $paymentMethod['id']
],
],
])->assertStatus(204);
$this->assertDatabaseHas('subscriptions', [
'stripe_status' => 'active'
]);
$this->assertDatabaseHas('user_settings', [
'storage_capacity' => 50,
'payment_activation' => 1,
]);
$this->assertDatabaseMissing('users', [
'stripe_id' => null,
'card_brand' => null,
]);
}
/**
* @test
*/