diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index 3fcc6e63..c475100d 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":1,"defects":{"Tests\\Feature\\Controllers\\Ajax\\ApiTokenControllerTest::testCreate":5,"Tests\\Feature\\Controllers\\Ajax\\ApiTokenControllerTest::testIndex":5,"Tests\\Feature\\Controllers\\Ajax\\ApiTokenControllerTest::testDestroy":5,"Tests\\Feature\\Controllers\\Ajax\\FileUploadControllerTest::testFileUpload":8,"Tests\\Feature\\Controllers\\Ajax\\SubscriptionControllerTest::testCreateSubsciption":1,"Tests\\Feature\\Controllers\\Ajax\\SubscriptionControllerTest::testUpdatePaymentMethod":1,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingSubscribe":1,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingGetDetails":1,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingPaymentMethod":1,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingCoupon":1,"Tests\\Feature\\Controllers\\User\\UserTwoFactorTest::testTwoFactorEmail":7,"Tests\\Feature\\Controllers\\User\\UserTwoFactorTest::testGoogleTwoFactor":5,"Tests\\Feature\\Controllers\\Auth\\TwoFactorControllerTest::testGetTwoFactorPage":5,"Tests\\Feature\\Controllers\\Auth\\TwoFactorControllerTest::testVerifyTwoFactorEmail":7,"Tests\\Feature\\Controllers\\User\\ApiTokenControllerTest::testCreate":7,"Tests\\Feature\\Controllers\\User\\ApiTokenControllerTest::testIndex":5,"Tests\\Feature\\Controllers\\User\\ApiTokenControllerTest::testDestroy":5,"Tests\\Feature\\Controllers\\User\\UserTwoFactorTest::testAuthenticatorTwoFactor":7,"Tests\\Feature\\Controllers\\Auth\\RegistrationControllerTest::testPostRegistration":7,"Tests\\Feature\\Controllers\\Auth\\RecoveryControllerTest::testVerifyRecovery":7,"Tests\\Feature\\Controllers\\Ajax\\FileUploadControllerTest::testImageUpload":7,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testLeaveTeam":5,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testRemoveTeamMember":5,"Tests\\Feature\\Controllers\\TeamsControllerTest::testDelete":5,"Tests\\Feature\\Controllers\\User\\InvitesControllerTest::testAccept":7},"times":{"Tests\\Unit\\ActivityServiceTest::testLog":0.007,"Tests\\Unit\\InviteServiceTest::testCreate":0.014,"Tests\\Unit\\InviteServiceTest::testValidateInvitation":0.003,"Tests\\Unit\\TeamServiceTest::testCreate":0.001,"Tests\\Unit\\TeamServiceTest::testUpdate":0.002,"Tests\\Unit\\TeamServiceTest::testInvite":0.004,"Tests\\Unit\\TeamServiceTest::testLeaveTeam":0.005,"Tests\\Unit\\TeamServiceTest::testRemoveMember":0.005,"Tests\\Unit\\TeamServiceTest::testDeleteTeam":0.006,"Tests\\Feature\\Controllers\\Admin\\DashboardControllerTest::testIndex":0.094,"Tests\\Feature\\Controllers\\Admin\\RoleControllerTest::testIndex":0.038,"Tests\\Feature\\Controllers\\Admin\\RoleControllerTest::testCreate":0.037,"Tests\\Feature\\Controllers\\Admin\\RoleControllerTest::testStore":0.013,"Tests\\Feature\\Controllers\\Admin\\RoleControllerTest::testEdit":0.037,"Tests\\Feature\\Controllers\\Admin\\RoleControllerTest::testUpdate":0.006,"Tests\\Feature\\Controllers\\Admin\\RoleControllerTest::testDelete":0.006,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testIndex":0.038,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testSearch":0.038,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testGetInvite":0.033,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testPostInvite":0.101,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testEdit":0.04,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testUpdate":0.007,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testLoginAsUser":0.009,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testReturnToLoginFromUser":0.011,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testDelete":0.006,"Tests\\Feature\\Controllers\\Ajax\\ApiTokenControllerTest::testCreate":0.008,"Tests\\Feature\\Controllers\\Ajax\\ApiTokenControllerTest::testIndex":0.001,"Tests\\Feature\\Controllers\\Ajax\\ApiTokenControllerTest::testDestroy":0.001,"Tests\\Feature\\Controllers\\Ajax\\CookiePolicyControllerTest::testAccept":0.006,"Tests\\Feature\\Controllers\\Ajax\\FileUploadControllerTest::testFileUpload":0.025,"Tests\\Feature\\Controllers\\Ajax\\SubscriptionControllerTest::testCreateSubsciption":0.003,"Tests\\Feature\\Controllers\\Ajax\\SubscriptionControllerTest::testUpdatePaymentMethod":0.001,"Tests\\Feature\\Controllers\\Api\\UsersControllerTest::testMe":0.033,"Tests\\Feature\\Controllers\\Api\\UsersControllerTest::testMeWithBearerToken":0.011,"Tests\\Feature\\Controllers\\Api\\UsersControllerTest::testUpdate":0.008,"Tests\\Feature\\Controllers\\Api\\UsersControllerTest::testDestroy":0.005,"Tests\\Feature\\Controllers\\Auth\\ConfirmsPasswordControllerTest::testGetConfirmPasswordPage":0.029,"Tests\\Feature\\Controllers\\Auth\\ForgotPasswordControllerTest::testGetForgotPassword":0.019,"Tests\\Feature\\Controllers\\Auth\\LoginControllerTest::testGetLoginPage":0.022,"Tests\\Feature\\Controllers\\Auth\\RegistrationControllerTest::testGetRegistration":0.02,"Tests\\Feature\\Controllers\\Auth\\ResetPasswordControllerTest::testGetResetPasswordPage":0.016,"Tests\\Feature\\Controllers\\Auth\\VerificationControllerTest::testGetVerificationPage":0.005,"Tests\\Feature\\Controllers\\DashboardControllerTest::testDashboard":0.042,"Tests\\Feature\\Controllers\\InvitesControllerTest::testResend":0.007,"Tests\\Feature\\Controllers\\InvitesControllerTest::testRevoke":0.006,"Tests\\Feature\\Controllers\\PagesControllerTest::testHome":0.02,"Tests\\Feature\\Controllers\\PagesControllerTest::testSupport":0.029,"Tests\\Feature\\Controllers\\PagesControllerTest::testPrivacyPolicy":0.026,"Tests\\Feature\\Controllers\\PagesControllerTest::testTermsOfService":0.026,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testShow":0.047,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testEditMember":0.043,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testUpdateMember":0.012,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testInviteMember":0.009,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testLeaveTeam":0.008,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testRemoveTeamMember":0.009,"Tests\\Feature\\Controllers\\TeamsControllerTest::testIndex":0.032,"Tests\\Feature\\Controllers\\TeamsControllerTest::testIndexWithSubcription":0.032,"Tests\\Feature\\Controllers\\TeamsControllerTest::testCreate":0.034,"Tests\\Feature\\Controllers\\TeamsControllerTest::testStore":0.009,"Tests\\Feature\\Controllers\\TeamsControllerTest::testEdit":0.039,"Tests\\Feature\\Controllers\\TeamsControllerTest::testUpdate":0.01,"Tests\\Feature\\Controllers\\TeamsControllerTest::testDelete":0.011,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingSubscribe":0.001,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingGetDetails":0.001,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingPaymentMethod":0.001,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingCoupon":0.001,"Tests\\Feature\\Controllers\\User\\ChangePasswordControllerTest::testSecurity":0.033,"Tests\\Feature\\Controllers\\User\\ChangePasswordControllerTest::testUpdatePassword":1.297,"Tests\\Feature\\Controllers\\User\\DestroyControllerTest::testDestroy":0.043,"Tests\\Feature\\Controllers\\User\\InvitesControllerTest::testIndex":0.031,"Tests\\Feature\\Controllers\\User\\InvitesControllerTest::testAccept":0.009,"Tests\\Feature\\Controllers\\User\\InvitesControllerTest::testReject":0.045,"Tests\\Feature\\Controllers\\User\\LogoutSessionsControllerTest::testSessionLogout":0.009,"Tests\\Feature\\Controllers\\User\\NotificationControllerTest::testIndex":0.031,"Tests\\Feature\\Controllers\\User\\NotificationControllerTest::testMarkAsRead":0.009,"Tests\\Feature\\Controllers\\User\\NotificationControllerTest::testDelete":0.007,"Tests\\Feature\\Controllers\\User\\NotificationControllerTest::testDeleteAll":0.008,"Tests\\Feature\\Controllers\\User\\SettingsControllerTest::testSettings":0.042,"Tests\\Feature\\Controllers\\User\\SettingsControllerTest::testUpdateSettings":0.009,"Tests\\Feature\\Controllers\\User\\SettingsControllerTest::testUpdateUserAvatar":0.01,"Tests\\Feature\\Controllers\\User\\UserTwoFactorTest::testTwoFactorEmail":0.009,"Tests\\Feature\\Controllers\\User\\UserTwoFactorTest::testGoogleTwoFactor":0,"Tests\\Feature\\Helpers\\ActivityHelperTest::testActivityLog":0.002,"Tests\\Feature\\Helpers\\NotificationHelperTest::testAppNotify":0,"Tests\\Feature\\Helpers\\NotificationHelperTest::testEmailNotifyDisabled":0.001,"Tests\\Feature\\Helpers\\NotificationHelperTest::testPusherGeneral":0.002,"Tests\\Feature\\Helpers\\NotificationHelperTest::testPusherUser":0.001,"Tests\\Feature\\Resources\\UserResourceTest::testUserResource":0,"Tests\\Feature\\Controllers\\Auth\\TwoFactorControllerTest::testGetTwoFactorPage":0.021,"Tests\\Feature\\Controllers\\Auth\\TwoFactorControllerTest::testVerifyTwoFactorEmail":0.008,"Tests\\Feature\\Controllers\\Auth\\RecoveryControllerTest::testGetRecoveryPage":0.019,"Tests\\Feature\\Controllers\\User\\ApiTokenControllerTest::testCreate":0.008,"Tests\\Feature\\Controllers\\User\\ApiTokenControllerTest::testIndex":0.048,"Tests\\Feature\\Controllers\\User\\ApiTokenControllerTest::testDestroy":0.013,"Tests\\Feature\\Controllers\\User\\UserTwoFactorTest::testAuthenticatorTwoFactor":0.013,"Tests\\Feature\\Controllers\\Auth\\RegistrationControllerTest::testPostRegistration":0.012,"Tests\\Feature\\Controllers\\Auth\\RecoveryControllerTest::testVerifyRecovery":0.014,"Tests\\Feature\\Controllers\\Ajax\\FileUploadControllerTest::testImageUpload":0.006}} \ No newline at end of file +{"version":1,"defects":{"Tests\\Feature\\Controllers\\Ajax\\ApiTokenControllerTest::testCreate":5,"Tests\\Feature\\Controllers\\Ajax\\ApiTokenControllerTest::testIndex":5,"Tests\\Feature\\Controllers\\Ajax\\ApiTokenControllerTest::testDestroy":5,"Tests\\Feature\\Controllers\\Ajax\\FileUploadControllerTest::testFileUpload":8,"Tests\\Feature\\Controllers\\Ajax\\SubscriptionControllerTest::testCreateSubsciption":1,"Tests\\Feature\\Controllers\\Ajax\\SubscriptionControllerTest::testUpdatePaymentMethod":1,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingSubscribe":1,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingGetDetails":1,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingPaymentMethod":1,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingCoupon":1,"Tests\\Feature\\Controllers\\User\\UserTwoFactorTest::testTwoFactorEmail":7,"Tests\\Feature\\Controllers\\User\\UserTwoFactorTest::testGoogleTwoFactor":5,"Tests\\Feature\\Controllers\\Auth\\TwoFactorControllerTest::testGetTwoFactorPage":5,"Tests\\Feature\\Controllers\\Auth\\TwoFactorControllerTest::testVerifyTwoFactorEmail":7,"Tests\\Feature\\Controllers\\User\\ApiTokenControllerTest::testCreate":7,"Tests\\Feature\\Controllers\\User\\ApiTokenControllerTest::testIndex":5,"Tests\\Feature\\Controllers\\User\\ApiTokenControllerTest::testDestroy":5,"Tests\\Feature\\Controllers\\User\\UserTwoFactorTest::testAuthenticatorTwoFactor":7,"Tests\\Feature\\Controllers\\Auth\\RegistrationControllerTest::testPostRegistration":7,"Tests\\Feature\\Controllers\\Auth\\RecoveryControllerTest::testVerifyRecovery":7,"Tests\\Feature\\Controllers\\Ajax\\FileUploadControllerTest::testImageUpload":7,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testLeaveTeam":5,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testRemoveTeamMember":5,"Tests\\Feature\\Controllers\\TeamsControllerTest::testDelete":5,"Tests\\Feature\\Controllers\\User\\InvitesControllerTest::testAccept":7},"times":{"Tests\\Unit\\ActivityServiceTest::testLog":0.005,"Tests\\Unit\\InviteServiceTest::testCreate":0.012,"Tests\\Unit\\InviteServiceTest::testValidateInvitation":0.003,"Tests\\Unit\\TeamServiceTest::testCreate":0.001,"Tests\\Unit\\TeamServiceTest::testUpdate":0.002,"Tests\\Unit\\TeamServiceTest::testInvite":0.003,"Tests\\Unit\\TeamServiceTest::testLeaveTeam":0.004,"Tests\\Unit\\TeamServiceTest::testRemoveMember":0.004,"Tests\\Unit\\TeamServiceTest::testDeleteTeam":0.004,"Tests\\Feature\\Controllers\\Admin\\DashboardControllerTest::testIndex":0.081,"Tests\\Feature\\Controllers\\Admin\\RoleControllerTest::testIndex":0.035,"Tests\\Feature\\Controllers\\Admin\\RoleControllerTest::testCreate":0.033,"Tests\\Feature\\Controllers\\Admin\\RoleControllerTest::testStore":0.012,"Tests\\Feature\\Controllers\\Admin\\RoleControllerTest::testEdit":0.036,"Tests\\Feature\\Controllers\\Admin\\RoleControllerTest::testUpdate":0.007,"Tests\\Feature\\Controllers\\Admin\\RoleControllerTest::testDelete":0.006,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testIndex":0.037,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testSearch":0.047,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testGetInvite":0.033,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testPostInvite":0.098,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testEdit":0.037,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testUpdate":0.007,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testLoginAsUser":0.007,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testReturnToLoginFromUser":0.011,"Tests\\Feature\\Controllers\\Admin\\UserControllerTest::testDelete":0.006,"Tests\\Feature\\Controllers\\Ajax\\ApiTokenControllerTest::testCreate":0.008,"Tests\\Feature\\Controllers\\Ajax\\ApiTokenControllerTest::testIndex":0.001,"Tests\\Feature\\Controllers\\Ajax\\ApiTokenControllerTest::testDestroy":0.001,"Tests\\Feature\\Controllers\\Ajax\\CookiePolicyControllerTest::testAccept":0.005,"Tests\\Feature\\Controllers\\Ajax\\FileUploadControllerTest::testFileUpload":0.017,"Tests\\Feature\\Controllers\\Ajax\\SubscriptionControllerTest::testCreateSubsciption":0.003,"Tests\\Feature\\Controllers\\Ajax\\SubscriptionControllerTest::testUpdatePaymentMethod":0.001,"Tests\\Feature\\Controllers\\Api\\UsersControllerTest::testMe":0.031,"Tests\\Feature\\Controllers\\Api\\UsersControllerTest::testMeWithBearerToken":0.011,"Tests\\Feature\\Controllers\\Api\\UsersControllerTest::testUpdate":0.008,"Tests\\Feature\\Controllers\\Api\\UsersControllerTest::testDestroy":0.004,"Tests\\Feature\\Controllers\\Auth\\ConfirmsPasswordControllerTest::testGetConfirmPasswordPage":0.027,"Tests\\Feature\\Controllers\\Auth\\ForgotPasswordControllerTest::testGetForgotPassword":0.016,"Tests\\Feature\\Controllers\\Auth\\LoginControllerTest::testGetLoginPage":0.019,"Tests\\Feature\\Controllers\\Auth\\RegistrationControllerTest::testGetRegistration":0.018,"Tests\\Feature\\Controllers\\Auth\\ResetPasswordControllerTest::testGetResetPasswordPage":0.015,"Tests\\Feature\\Controllers\\Auth\\VerificationControllerTest::testGetVerificationPage":0.005,"Tests\\Feature\\Controllers\\DashboardControllerTest::testDashboard":0.036,"Tests\\Feature\\Controllers\\InvitesControllerTest::testResend":0.006,"Tests\\Feature\\Controllers\\InvitesControllerTest::testRevoke":0.007,"Tests\\Feature\\Controllers\\PagesControllerTest::testHome":0.018,"Tests\\Feature\\Controllers\\PagesControllerTest::testSupport":0.027,"Tests\\Feature\\Controllers\\PagesControllerTest::testPrivacyPolicy":0.025,"Tests\\Feature\\Controllers\\PagesControllerTest::testTermsOfService":0.025,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testShow":0.043,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testEditMember":0.037,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testUpdateMember":0.012,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testInviteMember":0.012,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testLeaveTeam":0.008,"Tests\\Feature\\Controllers\\TeamMembersControllerTest::testRemoveTeamMember":0.008,"Tests\\Feature\\Controllers\\TeamsControllerTest::testIndex":0.03,"Tests\\Feature\\Controllers\\TeamsControllerTest::testIndexWithSubcription":0.03,"Tests\\Feature\\Controllers\\TeamsControllerTest::testCreate":0.03,"Tests\\Feature\\Controllers\\TeamsControllerTest::testStore":0.008,"Tests\\Feature\\Controllers\\TeamsControllerTest::testEdit":0.038,"Tests\\Feature\\Controllers\\TeamsControllerTest::testUpdate":0.01,"Tests\\Feature\\Controllers\\TeamsControllerTest::testDelete":0.011,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingSubscribe":0.002,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingGetDetails":0.001,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingPaymentMethod":0.001,"Tests\\Feature\\Controllers\\User\\BillingControllerTest::testBillingCoupon":0.001,"Tests\\Feature\\Controllers\\User\\ChangePasswordControllerTest::testSecurity":0.03,"Tests\\Feature\\Controllers\\User\\ChangePasswordControllerTest::testUpdatePassword":0.146,"Tests\\Feature\\Controllers\\User\\DestroyControllerTest::testDestroy":0.044,"Tests\\Feature\\Controllers\\User\\InvitesControllerTest::testIndex":0.029,"Tests\\Feature\\Controllers\\User\\InvitesControllerTest::testAccept":0.009,"Tests\\Feature\\Controllers\\User\\InvitesControllerTest::testReject":0.047,"Tests\\Feature\\Controllers\\User\\LogoutSessionsControllerTest::testSessionLogout":0.009,"Tests\\Feature\\Controllers\\User\\NotificationControllerTest::testIndex":0.028,"Tests\\Feature\\Controllers\\User\\NotificationControllerTest::testMarkAsRead":0.008,"Tests\\Feature\\Controllers\\User\\NotificationControllerTest::testDelete":0.007,"Tests\\Feature\\Controllers\\User\\NotificationControllerTest::testDeleteAll":0.008,"Tests\\Feature\\Controllers\\User\\SettingsControllerTest::testSettings":0.037,"Tests\\Feature\\Controllers\\User\\SettingsControllerTest::testUpdateSettings":0.009,"Tests\\Feature\\Controllers\\User\\SettingsControllerTest::testUpdateUserAvatar":0.01,"Tests\\Feature\\Controllers\\User\\UserTwoFactorTest::testTwoFactorEmail":0.01,"Tests\\Feature\\Controllers\\User\\UserTwoFactorTest::testGoogleTwoFactor":0,"Tests\\Feature\\Helpers\\ActivityHelperTest::testActivityLog":0.001,"Tests\\Feature\\Helpers\\NotificationHelperTest::testAppNotify":0,"Tests\\Feature\\Helpers\\NotificationHelperTest::testEmailNotifyDisabled":0.001,"Tests\\Feature\\Helpers\\NotificationHelperTest::testPusherGeneral":0.002,"Tests\\Feature\\Helpers\\NotificationHelperTest::testPusherUser":0.001,"Tests\\Feature\\Resources\\UserResourceTest::testUserResource":0,"Tests\\Feature\\Controllers\\Auth\\TwoFactorControllerTest::testGetTwoFactorPage":0.02,"Tests\\Feature\\Controllers\\Auth\\TwoFactorControllerTest::testVerifyTwoFactorEmail":0.008,"Tests\\Feature\\Controllers\\Auth\\RecoveryControllerTest::testGetRecoveryPage":0.019,"Tests\\Feature\\Controllers\\User\\ApiTokenControllerTest::testCreate":0.007,"Tests\\Feature\\Controllers\\User\\ApiTokenControllerTest::testIndex":0.052,"Tests\\Feature\\Controllers\\User\\ApiTokenControllerTest::testDestroy":0.014,"Tests\\Feature\\Controllers\\User\\UserTwoFactorTest::testAuthenticatorTwoFactor":0.01,"Tests\\Feature\\Controllers\\Auth\\RegistrationControllerTest::testPostRegistration":0.013,"Tests\\Feature\\Controllers\\Auth\\RecoveryControllerTest::testVerifyRecovery":0.013,"Tests\\Feature\\Controllers\\Ajax\\FileUploadControllerTest::testImageUpload":0.005}} \ No newline at end of file diff --git a/app/Http/Controllers/Ajax/SubscriptionController.php b/app/Http/Controllers/Ajax/SubscriptionController.php deleted file mode 100644 index c17eed0c..00000000 --- a/app/Http/Controllers/Ajax/SubscriptionController.php +++ /dev/null @@ -1,89 +0,0 @@ -user(); - - $user->update([ - 'state' => $request->state, - 'billing_email' => $request->email, - 'country' => $request->country, - ]); - - $user->newSubscription(config('billing.subscription_name'), $request->plan) - ->create($request->payment_method); - - $plan = config("billing.plans.{$request->plan}.name"); - $notification = new InAppNotification("You're now subscribed on the {$plan} plan."); - $notification->isImportant(); - $user->notify($notification); - - activity("Subscribed to {$plan} plan."); - - session()->flash('message', "Subscribed to {$plan} plan."); - - Cache::forget($user->cacheIdentifier('subscription')); - - return response()->json([ - 'message' => 'You\'re now subscribed!', - ]); - } catch (IncompletePayment $exception) { - $message = 'Subscription requires extra steps.'; - $redirect = route( - 'cashier.payment', - [$exception->payment->id, 'redirect' => route(RouteServiceProvider::HOME)] - ); - } catch (Exception $e) { - Log::error($e->getMessage()); - } - - return response()->json([ - 'message' => $message, - 'redirect' => $redirect, - ], 409); - } - - public function updatePaymentMethod(Request $request) - { - try { - $user = $request->user(); - - $user->updateDefaultPaymentMethod($request->payment_method); - - $notification = new InAppNotification("Your payment method has been updated to a card ending in {$user->card_last_four}."); - $notification->isImportant(); - $user->notify($notification); - - activity("Payment method updated to card ending in {$user->card_last_four}."); - - session()->flash('message', "Payment method updated to card ending in {$user->card_last_four}."); - - return response()->json([ - 'message' => 'Your payment method has been updated!', - ]); - } catch (Exception $e) { - Log::error($e->getMessage()); - } - - return response()->json([ - 'message' => 'Card change failed', - ], 409); - } -} diff --git a/app/Http/Controllers/User/BillingController.php b/app/Http/Controllers/User/BillingController.php index 26882add..a693190d 100644 --- a/app/Http/Controllers/User/BillingController.php +++ b/app/Http/Controllers/User/BillingController.php @@ -2,91 +2,93 @@ namespace App\Http\Controllers\User; -use App\Http\Controllers\Controller; -use App\Notifications\InAppNotification; use Exception; +use App\View\Forms\SwapForm; use Illuminate\Http\Request; +use App\View\Forms\CouponForm; +use App\View\Forms\BillingForm; +use App\View\Forms\SubscribeForm; use Illuminate\Support\Facades\Log; -use Throwable; +use App\Http\Controllers\Controller; class BillingController extends Controller { /** - * Billing settings. + * Get subscription details. * - * @return \Illuminate\View\View|\Illuminate\Http\RedirectResponse + * @return \Illuminate\View\View */ - public function subscribe(Request $request) + public function index(Request $request) { $user = $request->user(); + $upcomingPayment = null; - if ($user->hasActiveSubscription()) { - return redirect()->route('user.billing.details'); - } + $user->createOrGetStripeCustomer(); + $user->updateDefaultPaymentMethodFromStripe(); - try { - $intent = $user->createSetupIntent(); - } catch (Throwable $th) { - $intent = null; + $form = app(BillingForm::class)->setUser($user)->make(); + $subscribeForm = app(SubscribeForm::class)->setUser($user)->make(); + $swapForm = app(SwapForm::class)->setUser($user)->make(); + $couponForm = app(CouponForm::class)->make(); + + if ($user->hasActiveSubscription()) { + $upcomingPayment = $user->upcomingInvoice(); } - return view('user.billing.subscribe')->with(compact('user', 'intent')); + return view('user.billing')->with([ + 'user' => $user, + 'form' => $form, + 'subscribeForm' => $subscribeForm, + 'swapForm' => $swapForm, + 'couponForm' => $couponForm, + 'upcomingPayment' => $upcomingPayment, + ]); } - /** - * Billing renew. - * - * @return \Illuminate\View\View - */ - public function renewSubscription(Request $request) + public function update(Request $request) { $user = $request->user(); - try { - $intent = $user->createSetupIntent(); - } catch (Throwable $th) { - $intent = null; - } + $user->update([ + 'billing_email' => $request->billing_email, + 'state' => $request->state, + 'country' => $request->country, + ]); + + activity("Updated billing information."); - return view('user.billing.renew')->with(compact('user', 'intent')); + $user->updateStripeCustomer([ + 'email' => $request->billing_email, + 'address' => [ + 'state' => $request->state, + 'country' => $request->country, + ], + ]); + + return redirect()->back()->withMessage('Information updated.'); } - /** - * Get subscription details. - * - * @return \Illuminate\View\View - */ - public function getSubscription(Request $request) + public function subscribe(Request $request) { - $user = $request->user(); - try { - $invoice = $user->upcomingInvoice(); - } catch (Throwable $th) { - $invoice = null; - } + $paymentMethod = $request->user()->defaultPaymentMethod(); + $plan = $request->plan; - $subscription = $user->subscription(config('billing.subscription_name')); + $request->user()->newSubscription( + 'main', $plan + )->create($paymentMethod->id); - return view('user.billing.details')->with(compact('user', 'invoice', 'subscription')); - } - - /** - * Change the payment method. - * - * @return \Illuminate\View\View - */ - public function paymentMethod(Request $request) - { - $user = $request->user(); + activity("Subscribed to {$request->plan} subscription plan."); - try { - $intent = $user->createSetupIntent(); - } catch (Throwable $th) { - $intent = null; + return redirect() + ->route('user.billing') + ->withMessage('You\'re subscribed!'); + } catch (Exception $e) { + Log::error($e->getMessage()); } - return view('user.billing.payment-method')->with(compact('user', 'intent')); + return redirect()->back() + ->withErrors(['Could not set your subscription, please try again.']); } /** @@ -106,31 +108,23 @@ public function getChangePlan(Request $request) * * @return \Illuminate\Http\RedirectResponse */ - public function swapPlan(Request $request) + public function swap(Request $request) { try { - $request->user()->subscription(config('billing.subscription_name'))->swap($request->plan); + $request->user() + ->subscription(config('billing.subscription_name')) + ->swap($request->plan); activity("Switched to {$request->plan} subscription plan."); - return redirect()->route('user.billing.details')->withMessage('Your subscription was swapped!'); + return redirect()->route('user.billing') + ->withMessage('Your subscription was swapped!'); } catch (Exception $e) { Log::error($e->getMessage()); } - return redirect()->back()->withErrors(['Could not change your subscription, please try again.']); - } - - /** - * Add a coupon. - * - * @return \Illuminate\View\View - */ - public function getCoupon(Request $request) - { - $user = $request->user(); - - return view('user.billing.coupon')->with(compact('user')); + return redirect()->back() + ->withErrors(['Could not change your subscription, please try again.']); } /** @@ -138,92 +132,22 @@ public function getCoupon(Request $request) * * @return \Illuminate\Http\RedirectResponse */ - public function applyCoupon(Request $request) + public function coupon(Request $request) { try { - $request->user()->applyCoupon($request->coupon); + $coupon = $request->user()->findPromotionCode($request->coupon)->coupon(); + + $request->user() + ->applyCoupon($coupon->id); activity("Used coupon: {$request->coupon}."); - return redirect()->route('user.billing.details')->withMessage('Your coupon was used!'); + return redirect()->route('user.billing') + ->withMessage('Your coupon was used!'); } catch (Exception $e) { Log::error($e->getMessage()); } return redirect()->back()->withErrors(['Could not process your coupon, please try again.']); } - - /** - * Get invoices. - * - * @return \Illuminate\View\View - */ - public function getInvoices(Request $request) - { - $user = $request->user(); - - try { - $invoices = $user->invoices(config('billing.subscription_name')); - } catch (Throwable $th) { - $invoices = null; - } - - return view('user.billing.invoices')->with(compact('user', 'invoices')); - } - - /** - * Get one invoice. - * - * @return \Illuminate\Http\Response - */ - public function getInvoiceById($id, Request $request) - { - try { - $user = $request->user(); - - $response = $user->downloadInvoice($id, [ - 'vendor' => config('billing.invoice.company'), - 'street' => config('billing.invoice.street'), - 'location' => config('billing.invoice.location'), - 'phone' => config('billing.invoice.phone'), - 'url' => config('billing.invoice.url'), - 'product' => config('billing.invoice.product'), - 'description' => 'Subscription', - ]); - } catch (Exception $e) { - $response = back()->withErrors(['Could not find this invoice, please try again.']); - } - - return $response; - } - - /** - * Cancel Subscription. - * - * @return \Illuminate\Http\RedirectResponse - */ - public function cancelSubscription(Request $request) - { - try { - $user = $request->user(); - $invoice = $user->upcomingInvoice(); - - $user->subscription(config('billing.subscription_name'))->cancel(); - - $date = $invoice->date()->format('Y-m-d'); - $message = 'Your subscription has been cancelled! It will be availale until '.$date; - - activity($message); - - $notification = new InAppNotification($message); - $notification->isImportant(); - $user->notify($notification); - - return redirect()->route('user.billing.details')->withMessage($message); - } catch (Exception $e) { - Log::error($e->getMessage()); - } - - return redirect()->back()->withErrors(['Could not cancel billing, please try again.']); - } } diff --git a/app/Http/Controllers/WebhookController.php b/app/Http/Controllers/WebhookController.php deleted file mode 100644 index 4f5eba25..00000000 --- a/app/Http/Controllers/WebhookController.php +++ /dev/null @@ -1,19 +0,0 @@ -route('user.billing.details'); - } -} diff --git a/app/Models/Concerns/HasSubscription.php b/app/Models/Concerns/HasSubscription.php index 9bab5718..a7a5f416 100644 --- a/app/Models/Concerns/HasSubscription.php +++ b/app/Models/Concerns/HasSubscription.php @@ -14,14 +14,14 @@ trait HasSubscription */ public function hasActiveSubscription() { - return Cache::remember($this->cacheIdentifier('subscription'), 86400, function () { - if ($this->subscription(config('billing.subscription_name')) && ! $this->subscription(config('billing.subscription_name'))->cancelled()) { + return Cache::remember($this->cacheIdentifier('subscription'), 300, function () { + if ($this->subscription(config('billing.subscription_name')) && ! $this->subscription(config('billing.subscription_name'))->canceled()) { return true; } if ( $this->subscription(config('billing.subscription_name')) && - $this->subscription(config('billing.subscription_name'))->cancelled() && + $this->subscription(config('billing.subscription_name'))->canceled() && $this->subscription(config('billing.subscription_name'))->onGracePeriod() ) { return true; @@ -36,10 +36,10 @@ public function hasActiveSubscription() * * @return bool */ - public function hasCancelledSubscription() + public function hasCanceledSubscription() { if ($this->subscription(config('billing.subscription_name'))) { - return $this->subscription(config('billing.subscription_name'))->cancelled(); + return $this->subscription(config('billing.subscription_name'))->canceled(); } return false; @@ -64,4 +64,13 @@ public function subscriptionPlan($key) return null; } + + public function hasBillingInformation() + { + return ( + ! is_null($this->billing_email) + && ! is_null($this->state) + && ! is_null($this->country) + ); + } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index f08448fc..27286cca 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -19,6 +19,7 @@ class AppServiceProvider extends ServiceProvider */ public function register() { + Cashier::calculateTaxes(); Cashier::keepPastDueSubscriptionsActive(); Cashier::useCustomerModel(User::class); diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index f4b4aec0..d6ce2916 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -81,13 +81,13 @@ public function boot() }); // Gateway for determining not cancelled subscribers - Gate::define('subscription-not-cancelled', function ($user) { - return ! $user->hasCancelledSubscription(); + Gate::define('subscription-not-canceled', function ($user) { + return ! $user->hasCanceledSubscription(); }); // Gateway for determining not cancelled subscribers - Gate::define('subscription-cancelled', function ($user) { - return $user->hasCancelledSubscription(); + Gate::define('subscription-canceled', function ($user) { + return $user->hasCanceledSubscription(); }); } } diff --git a/app/View/Forms/BillingForm.php b/app/View/Forms/BillingForm.php new file mode 100644 index 00000000..b621c39a --- /dev/null +++ b/app/View/Forms/BillingForm.php @@ -0,0 +1,57 @@ + 'Save', + ]; + + public $user; + + public $orientation = 'horizontal'; + + public $disableOnSubmit = true; + + public function setUser($user) + { + $this->user = $user; + + return $this; + } + + public function fields() + { + $user = $this->user; + + return [ + Email::make('billing_email', [ + 'label' => 'Email', + 'required' => $user->hasActiveSubscription(), + 'value' => $user->billing_email, + ]), + Text::make('state', [ + 'label' => 'State', + 'required' => $user->hasActiveSubscription(), + 'value' => $user->state, + ]), + Country::make('country', [ + 'label' => 'Country', + 'required' => $user->hasActiveSubscription(), + 'data-size' => 5, + 'value' => $user->country, + ]), + ]; + } +} diff --git a/app/View/Forms/CouponForm.php b/app/View/Forms/CouponForm.php new file mode 100644 index 00000000..d18a7d92 --- /dev/null +++ b/app/View/Forms/CouponForm.php @@ -0,0 +1,32 @@ + 'Apply Coupon', + ]; + + public $buttonClasses = [ + 'submit' => 'btn btn-outline-primary', + ]; + + public $disableOnSubmit = true; + + public function fields() + { + return [ + Text::make('coupon') + ->required() + ->placeholder('Coupon Code'), + ]; + } +} diff --git a/app/View/Forms/SubscribeForm.php b/app/View/Forms/SubscribeForm.php new file mode 100644 index 00000000..93c98bb6 --- /dev/null +++ b/app/View/Forms/SubscribeForm.php @@ -0,0 +1,43 @@ + 'Subscribe', + ]; + + public $user; + + public $disableOnSubmit = true; + + public function setUser($user) + { + $this->user = $user; + + return $this; + } + + public function fields() + { + $user = $this->user; + + return [ + Select::make('plan') + ->id('card-holder-plan') + ->label('Plan') + ->required() + ->singular() + ->options(collect(config('billing.plans'))->pluck('key', 'label')->toArray()) + ->value(optional($user->subscription(config('billing.subscription_name')))->stripe_price), + ]; + } +} diff --git a/app/View/Forms/SwapForm.php b/app/View/Forms/SwapForm.php new file mode 100644 index 00000000..6c13c0bb --- /dev/null +++ b/app/View/Forms/SwapForm.php @@ -0,0 +1,47 @@ + 'Switch Plans', + ]; + + public $buttonClasses = [ + 'submit' => 'btn btn-outline-primary', + ]; + + public $user; + + public $disableOnSubmit = true; + + public function setUser($user) + { + $this->user = $user; + + return $this; + } + + public function fields() + { + $user = $this->user; + + return [ + Select::make('plan') + ->id('card-holder-plan') + ->label('Change Plan to') + ->required() + ->singular() + ->options(collect(config('billing.plans'))->pluck('key', 'label')->toArray()) + ->value(optional($user->subscription(config('billing.subscription_name')))->stripe_price), + ]; + } +} diff --git a/app/View/Forms/UserForm.php b/app/View/Forms/UserForm.php index b978ca7d..7f62cf9a 100644 --- a/app/View/Forms/UserForm.php +++ b/app/View/Forms/UserForm.php @@ -63,7 +63,7 @@ public function fields() ], 'value' => auth()->user()->two_factor_platform, ]), - ], $this->billingColumns()); + ]); } public function billingColumns() diff --git a/composer.json b/composer.json index c937e1c4..50e68646 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,7 @@ "guzzlehttp/guzzle": "^7.2", "hisorange/browser-detect": "^4.5", "intervention/image": "^2.5", - "laravel/cashier": "^13.0", + "laravel/cashier": "^14.0", "laravel/framework": "^10.0", "laravel/helpers": "^1.1", "laravel/sanctum": "^3.0", diff --git a/composer.lock b/composer.lock index 4e672d0f..c1a6cf77 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "56e40c00894bc9ac81ec02a80de107a9", + "content-hash": "23a907807a0e3cecaae5575fab696af4", "packages": [ { "name": "aws/aws-crt-php", @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.277.5", + "version": "3.277.9", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "69539f82d8690be86f686ea5be1e572b44efcd8b" + "reference": "f2437a755b70756425bf8f1bd588a7c583891900" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/69539f82d8690be86f686ea5be1e572b44efcd8b", - "reference": "69539f82d8690be86f686ea5be1e572b44efcd8b", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/f2437a755b70756425bf8f1bd588a7c583891900", + "reference": "f2437a755b70756425bf8f1bd588a7c583891900", "shasum": "" }, "require": { @@ -151,9 +151,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.277.5" + "source": "https://github.com/aws/aws-sdk-php/tree/3.277.9" }, - "time": "2023-07-31T18:10:09+00:00" + "time": "2023-08-04T18:16:19+00:00" }, { "name": "bacon/bacon-qr-code", @@ -211,16 +211,16 @@ }, { "name": "barryvdh/laravel-debugbar", - "version": "v3.8.1", + "version": "v3.8.2", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "aff3235fecb4104203b1e62c32239c56530eee32" + "reference": "56a2dc1da9d3219164074713983eef68996386cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/aff3235fecb4104203b1e62c32239c56530eee32", - "reference": "aff3235fecb4104203b1e62c32239c56530eee32", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/56a2dc1da9d3219164074713983eef68996386cf", + "reference": "56a2dc1da9d3219164074713983eef68996386cf", "shasum": "" }, "require": { @@ -279,7 +279,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.8.1" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.8.2" }, "funding": [ { @@ -291,7 +291,7 @@ "type": "github" } ], - "time": "2023-02-21T14:21:02+00:00" + "time": "2023-07-26T04:57:49+00:00" }, { "name": "bepsvpt/secure-headers", @@ -1138,68 +1138,6 @@ ], "time": "2022-12-15T16:57:16+00:00" }, - { - "name": "dompdf/dompdf", - "version": "v2.0.3", - "source": { - "type": "git", - "url": "https://github.com/dompdf/dompdf.git", - "reference": "e8d2d5e37e8b0b30f0732a011295ab80680d7e85" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dompdf/dompdf/zipball/e8d2d5e37e8b0b30f0732a011295ab80680d7e85", - "reference": "e8d2d5e37e8b0b30f0732a011295ab80680d7e85", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "masterminds/html5": "^2.0", - "phenx/php-font-lib": ">=0.5.4 <1.0.0", - "phenx/php-svg-lib": ">=0.3.3 <1.0.0", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "ext-json": "*", - "ext-zip": "*", - "mockery/mockery": "^1.3", - "phpunit/phpunit": "^7.5 || ^8 || ^9", - "squizlabs/php_codesniffer": "^3.5" - }, - "suggest": { - "ext-gd": "Needed to process images", - "ext-gmagick": "Improves image processing performance", - "ext-imagick": "Improves image processing performance", - "ext-zlib": "Needed for pdf stream compression" - }, - "type": "library", - "autoload": { - "psr-4": { - "Dompdf\\": "src/" - }, - "classmap": [ - "lib/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1" - ], - "authors": [ - { - "name": "The Dompdf Community", - "homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md" - } - ], - "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", - "homepage": "https://github.com/dompdf/dompdf", - "support": { - "issues": "https://github.com/dompdf/dompdf/issues", - "source": "https://github.com/dompdf/dompdf/tree/v2.0.3" - }, - "time": "2023-02-07T12:51:48+00:00" - }, { "name": "dragonmantank/cron-expression", "version": "v3.3.2", @@ -1401,16 +1339,16 @@ }, { "name": "grafite/auth", - "version": "v1.0.2", + "version": "v1.0.3", "source": { "type": "git", "url": "https://github.com/GrafiteInc/Auth.git", - "reference": "8568007945b7fcb2281489de978267310a404cac" + "reference": "6aa3a1becfbc68dc99653c2c01f9a7d7c91cd814" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrafiteInc/Auth/zipball/8568007945b7fcb2281489de978267310a404cac", - "reference": "8568007945b7fcb2281489de978267310a404cac", + "url": "https://api.github.com/repos/GrafiteInc/Auth/zipball/6aa3a1becfbc68dc99653c2c01f9a7d7c91cd814", + "reference": "6aa3a1becfbc68dc99653c2c01f9a7d7c91cd814", "shasum": "" }, "require": { @@ -1452,9 +1390,9 @@ "description": "Auth backend and Controller stubs for the Laravel Framework from Laravel UI", "support": { "issues": "https://github.com/GrafiteInc/Auth/issues", - "source": "https://github.com/GrafiteInc/Auth/tree/v1.0.2" + "source": "https://github.com/GrafiteInc/Auth/tree/v1.0.3" }, - "time": "2023-06-09T16:19:42+00:00" + "time": "2023-08-03T20:13:08+00:00" }, { "name": "grafite/charts", @@ -1567,16 +1505,16 @@ }, { "name": "grafite/forms", - "version": "v6.19.6", + "version": "v6.19.7", "source": { "type": "git", "url": "https://github.com/GrafiteInc/Forms.git", - "reference": "59c23816dd9fabcab7da14ab89ab396fe8211b61" + "reference": "ed8d9786a0fd2dfc6e1b43432839e2f5fb7a189f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrafiteInc/Forms/zipball/59c23816dd9fabcab7da14ab89ab396fe8211b61", - "reference": "59c23816dd9fabcab7da14ab89ab396fe8211b61", + "url": "https://api.github.com/repos/GrafiteInc/Forms/zipball/ed8d9786a0fd2dfc6e1b43432839e2f5fb7a189f", + "reference": "ed8d9786a0fd2dfc6e1b43432839e2f5fb7a189f", "shasum": "" }, "require": { @@ -1633,9 +1571,9 @@ ], "support": { "issues": "https://github.com/GrafiteInc/Forms/issues", - "source": "https://github.com/GrafiteInc/Forms/tree/v6.19.6" + "source": "https://github.com/GrafiteInc/Forms/tree/v6.19.7" }, - "time": "2023-07-27T03:07:36+00:00" + "time": "2023-08-04T20:54:40+00:00" }, { "name": "grafite/html", @@ -2142,16 +2080,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.5.0", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6" + "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/8bd7c33a0734ae1c5d074360512beb716bef3f77", + "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77", "shasum": "" }, "require": { @@ -2238,7 +2176,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.5.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.0" }, "funding": [ { @@ -2254,7 +2192,7 @@ "type": "tidelift" } ], - "time": "2023-04-17T16:11:26+00:00" + "time": "2023-08-03T15:06:02+00:00" }, { "name": "guzzlehttp/uri-template", @@ -2610,49 +2548,52 @@ }, { "name": "laravel/cashier", - "version": "v13.17.0", + "version": "14.12.4", "source": { "type": "git", "url": "https://github.com/laravel/cashier-stripe.git", - "reference": "cae3a62e1819a0429ead6567ee26c049bf0c2677" + "reference": "a9ea267c686897981865f355d9fcbd8a99048488" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/cashier-stripe/zipball/cae3a62e1819a0429ead6567ee26c049bf0c2677", - "reference": "cae3a62e1819a0429ead6567ee26c049bf0c2677", + "url": "https://api.github.com/repos/laravel/cashier-stripe/zipball/a9ea267c686897981865f355d9fcbd8a99048488", + "reference": "a9ea267c686897981865f355d9fcbd8a99048488", "shasum": "" }, "require": { - "dompdf/dompdf": "^1.2.1|^2.0", "ext-json": "*", - "illuminate/console": "^8.37|^9.0|^10.0", - "illuminate/contracts": "^8.37|^9.0|^10.0", - "illuminate/database": "^8.37|^9.0|^10.0", - "illuminate/http": "^8.37|^9.0|^10.0", - "illuminate/log": "^8.37|^9.0|^10.0", - "illuminate/notifications": "^8.37|^9.0|^10.0", - "illuminate/routing": "^8.37|^9.0|^10.0", - "illuminate/support": "^8.37|^9.0|^10.0", - "illuminate/view": "^8.37|^9.0|^10.0", - "moneyphp/money": "^3.2|^4.0", + "illuminate/console": "^9.21|^10.0", + "illuminate/contracts": "^9.21|^10.0", + "illuminate/database": "^9.21|^10.0", + "illuminate/http": "^9.21|^10.0", + "illuminate/log": "^9.21|^10.0", + "illuminate/notifications": "^9.21|^10.0", + "illuminate/pagination": "^9.21|^10.0", + "illuminate/routing": "^9.21|^10.0", + "illuminate/support": "^9.21|^10.0", + "illuminate/view": "^9.21|^10.0", + "moneyphp/money": "^4.0", "nesbot/carbon": "^2.0", - "php": "^7.3|^8.0", - "stripe/stripe-php": "^7.39|^8.0|^9.0", - "symfony/http-kernel": "^5.0|^6.0", + "php": "^8.0", + "stripe/stripe-php": "^7.39|^8.0|^9.0|^10.0", + "symfony/http-kernel": "^6.0", "symfony/polyfill-intl-icu": "^1.22.1" }, "require-dev": { + "dompdf/dompdf": "^2.0", "mockery/mockery": "^1.0", - "orchestra/testbench": "^6.0|^7.0|^8.0", + "orchestra/testbench": "^7.0|^8.0", + "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.0" }, "suggest": { + "dompdf/dompdf": "Required when generating and downloading invoice PDF's using Dompdf (^1.0.1|^2.0).", "ext-intl": "Allows for more locales besides the default \"en\" when formatting money values." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "13.x-dev" + "dev-master": "14.x-dev" }, "laravel": { "providers": [ @@ -2690,20 +2631,20 @@ "issues": "https://github.com/laravel/cashier/issues", "source": "https://github.com/laravel/cashier" }, - "time": "2023-03-01T09:33:20+00:00" + "time": "2023-07-11T14:43:56+00:00" }, { "name": "laravel/framework", - "version": "v10.16.1", + "version": "v10.17.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "5c93d2795c393b462481179ce42dedfb30cc19b5" + "reference": "a82d96fd94069e346eb8037d178e6ccc4daaf3f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/5c93d2795c393b462481179ce42dedfb30cc19b5", - "reference": "5c93d2795c393b462481179ce42dedfb30cc19b5", + "url": "https://api.github.com/repos/laravel/framework/zipball/a82d96fd94069e346eb8037d178e6ccc4daaf3f9", + "reference": "a82d96fd94069e346eb8037d178e6ccc4daaf3f9", "shasum": "" }, "require": { @@ -2721,11 +2662,12 @@ "ext-tokenizer": "*", "fruitcake/php-cors": "^1.2", "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.1", "laravel/serializable-closure": "^1.3", "league/commonmark": "^2.2.1", "league/flysystem": "^3.8.0", "monolog/monolog": "^3.0", - "nesbot/carbon": "^2.62.1", + "nesbot/carbon": "^2.67", "nunomaduro/termwind": "^1.13", "php": "^8.1", "psr/container": "^1.1.1|^2.0.1", @@ -2804,7 +2746,6 @@ "mockery/mockery": "^1.5.1", "orchestra/testbench-core": "^8.4", "pda/pheanstalk": "^4.0", - "phpstan/phpdoc-parser": "^1.15", "phpstan/phpstan": "^1.4.7", "phpunit/phpunit": "^10.0.7", "predis/predis": "^2.0.2", @@ -2890,7 +2831,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-07-26T03:30:46+00:00" + "time": "2023-08-02T14:59:58+00:00" }, { "name": "laravel/helpers", @@ -2948,6 +2889,54 @@ }, "time": "2023-01-09T14:48:11+00:00" }, + { + "name": "laravel/prompts", + "version": "v0.1.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "562c26eb82c85789ef36291112cc27d730d3fed6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/562c26eb82c85789ef36291112cc27d730d3fed6", + "reference": "562c26eb82c85789ef36291112cc27d730d3fed6", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/collections": "^10.0|^11.0", + "php": "^8.1", + "symfony/console": "^6.2" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-mockery": "^1.1" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.1.3" + }, + "time": "2023-08-02T19:57:10+00:00" + }, { "name": "laravel/sanctum", "version": "v3.2.5", @@ -3573,16 +3562,16 @@ }, { "name": "league/mime-type-detection", - "version": "1.11.0", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" + "reference": "c7f2872fb273bf493811473dafc88d60ae829f48" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/c7f2872fb273bf493811473dafc88d60ae829f48", + "reference": "c7f2872fb273bf493811473dafc88d60ae829f48", "shasum": "" }, "require": { @@ -3613,7 +3602,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.12.0" }, "funding": [ { @@ -3625,7 +3614,7 @@ "type": "tidelift" } ], - "time": "2022-04-17T13:12:02+00:00" + "time": "2023-08-03T07:14:11+00:00" }, { "name": "league/pipeline", @@ -3686,16 +3675,16 @@ }, { "name": "livewire/livewire", - "version": "v2.12.4", + "version": "v2.12.5", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "cca62ce8f751279c36404886b74a02e6dd0110f2" + "reference": "96a249f5ab51d8377817d802f91d1e440869c1d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/cca62ce8f751279c36404886b74a02e6dd0110f2", - "reference": "cca62ce8f751279c36404886b74a02e6dd0110f2", + "url": "https://api.github.com/repos/livewire/livewire/zipball/96a249f5ab51d8377817d802f91d1e440869c1d6", + "reference": "96a249f5ab51d8377817d802f91d1e440869c1d6", "shasum": "" }, "require": { @@ -3747,7 +3736,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v2.12.4" + "source": "https://github.com/livewire/livewire/tree/v2.12.5" }, "funding": [ { @@ -3755,87 +3744,20 @@ "type": "github" } ], - "time": "2023-07-28T20:46:24+00:00" - }, - { - "name": "masterminds/html5", - "version": "2.8.1", - "source": { - "type": "git", - "url": "https://github.com/Masterminds/html5-php.git", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f47dcf3c70c584de14f21143c55d9939631bc6cf", - "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Masterminds\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matt Butcher", - "email": "technosophos@gmail.com" - }, - { - "name": "Matt Farina", - "email": "matt@mattfarina.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" - } - ], - "description": "An HTML5 parser and serializer.", - "homepage": "http://masterminds.github.io/html5-php", - "keywords": [ - "HTML5", - "dom", - "html", - "parser", - "querypath", - "serializer", - "xml" - ], - "support": { - "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.8.1" - }, - "time": "2023-05-10T11:58:31+00:00" + "time": "2023-08-02T06:31:31+00:00" }, { "name": "matomo/device-detector", - "version": "6.1.3", + "version": "6.1.4", "source": { "type": "git", "url": "https://github.com/matomo-org/device-detector.git", - "reference": "3e0fac7e77f3faadc3858fea9f5fa7efeb9cf239" + "reference": "74f6c4f6732b3ad6cdf25560746841d522969112" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/matomo-org/device-detector/zipball/3e0fac7e77f3faadc3858fea9f5fa7efeb9cf239", - "reference": "3e0fac7e77f3faadc3858fea9f5fa7efeb9cf239", + "url": "https://api.github.com/repos/matomo-org/device-detector/zipball/74f6c4f6732b3ad6cdf25560746841d522969112", + "reference": "74f6c4f6732b3ad6cdf25560746841d522969112", "shasum": "" }, "require": { @@ -3891,7 +3813,7 @@ "source": "https://github.com/matomo-org/matomo", "wiki": "https://dev.matomo.org/" }, - "time": "2023-06-06T11:58:07+00:00" + "time": "2023-08-02T08:48:53+00:00" }, { "name": "matthiasmullie/minify", @@ -5149,96 +5071,6 @@ }, "time": "2023-04-30T00:54:53+00:00" }, - { - "name": "phenx/php-font-lib", - "version": "0.5.4", - "source": { - "type": "git", - "url": "https://github.com/dompdf/php-font-lib.git", - "reference": "dd448ad1ce34c63d09baccd05415e361300c35b4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/dd448ad1ce34c63d09baccd05415e361300c35b4", - "reference": "dd448ad1ce34c63d09baccd05415e361300c35b4", - "shasum": "" - }, - "require": { - "ext-mbstring": "*" - }, - "require-dev": { - "symfony/phpunit-bridge": "^3 || ^4 || ^5" - }, - "type": "library", - "autoload": { - "psr-4": { - "FontLib\\": "src/FontLib" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0" - ], - "authors": [ - { - "name": "Fabien Ménager", - "email": "fabien.menager@gmail.com" - } - ], - "description": "A library to read, parse, export and make subsets of different types of font files.", - "homepage": "https://github.com/PhenX/php-font-lib", - "support": { - "issues": "https://github.com/dompdf/php-font-lib/issues", - "source": "https://github.com/dompdf/php-font-lib/tree/0.5.4" - }, - "time": "2021-12-17T19:44:54+00:00" - }, - { - "name": "phenx/php-svg-lib", - "version": "0.5.0", - "source": { - "type": "git", - "url": "https://github.com/dompdf/php-svg-lib.git", - "reference": "76876c6cf3080bcb6f249d7d59705108166a6685" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/76876c6cf3080bcb6f249d7d59705108166a6685", - "reference": "76876c6cf3080bcb6f249d7d59705108166a6685", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": "^7.1 || ^8.0", - "sabberworm/php-css-parser": "^8.4" - }, - "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Svg\\": "src/Svg" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0" - ], - "authors": [ - { - "name": "Fabien Ménager", - "email": "fabien.menager@gmail.com" - } - ], - "description": "A library to read, parse and export to PDF SVG files.", - "homepage": "https://github.com/PhenX/php-svg-lib", - "support": { - "issues": "https://github.com/dompdf/php-svg-lib/issues", - "source": "https://github.com/dompdf/php-svg-lib/tree/0.5.0" - }, - "time": "2022-09-06T12:16:56+00:00" - }, { "name": "phpoption/phpoption", "version": "1.9.1", @@ -6343,59 +6175,6 @@ ], "time": "2023-04-15T23:01:58+00:00" }, - { - "name": "sabberworm/php-css-parser", - "version": "8.4.0", - "source": { - "type": "git", - "url": "https://github.com/sabberworm/PHP-CSS-Parser.git", - "reference": "e41d2140031d533348b2192a83f02d8dd8a71d30" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/e41d2140031d533348b2192a83f02d8dd8a71d30", - "reference": "e41d2140031d533348b2192a83f02d8dd8a71d30", - "shasum": "" - }, - "require": { - "ext-iconv": "*", - "php": ">=5.6.20" - }, - "require-dev": { - "codacy/coverage": "^1.4", - "phpunit/phpunit": "^4.8.36" - }, - "suggest": { - "ext-mbstring": "for parsing UTF-8 CSS" - }, - "type": "library", - "autoload": { - "psr-4": { - "Sabberworm\\CSS\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Raphael Schweikert" - } - ], - "description": "Parser for CSS Files written in PHP", - "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", - "keywords": [ - "css", - "parser", - "stylesheet" - ], - "support": { - "issues": "https://github.com/sabberworm/PHP-CSS-Parser/issues", - "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.4.0" - }, - "time": "2021-12-11T13:40:54+00:00" - }, { "name": "shiftonelabs/laravel-sqs-fifo-queue", "version": "2.1.0", @@ -6716,16 +6495,16 @@ }, { "name": "stripe/stripe-php", - "version": "v9.9.0", + "version": "v10.20.0", "source": { "type": "git", "url": "https://github.com/stripe/stripe-php.git", - "reference": "479b5c2136fde0debb93d290ceaf20dd161c358f" + "reference": "6be8827ee0d6466bf48e2b6997a8feac596405f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/stripe/stripe-php/zipball/479b5c2136fde0debb93d290ceaf20dd161c358f", - "reference": "479b5c2136fde0debb93d290ceaf20dd161c358f", + "url": "https://api.github.com/repos/stripe/stripe-php/zipball/6be8827ee0d6466bf48e2b6997a8feac596405f9", + "reference": "6be8827ee0d6466bf48e2b6997a8feac596405f9", "shasum": "" }, "require": { @@ -6771,9 +6550,9 @@ ], "support": { "issues": "https://github.com/stripe/stripe-php/issues", - "source": "https://github.com/stripe/stripe-php/tree/v9.9.0" + "source": "https://github.com/stripe/stripe-php/tree/v10.20.0" }, - "time": "2022-11-08T20:25:52+00:00" + "time": "2023-08-03T20:01:03+00:00" }, { "name": "symfony/console", @@ -9166,16 +8945,16 @@ }, { "name": "tightenco/ziggy", - "version": "v1.6.0", + "version": "v1.6.1", "source": { "type": "git", "url": "https://github.com/tighten/ziggy.git", - "reference": "3beb080be60b1eadad043f3773a160df13fa215f" + "reference": "7e34b12d14242d2bebbfc533ef58c7776db173cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tighten/ziggy/zipball/3beb080be60b1eadad043f3773a160df13fa215f", - "reference": "3beb080be60b1eadad043f3773a160df13fa215f", + "url": "https://api.github.com/repos/tighten/ziggy/zipball/7e34b12d14242d2bebbfc533ef58c7776db173cd", + "reference": "7e34b12d14242d2bebbfc533ef58c7776db173cd", "shasum": "" }, "require": { @@ -9227,9 +9006,9 @@ ], "support": { "issues": "https://github.com/tighten/ziggy/issues", - "source": "https://github.com/tighten/ziggy/tree/v1.6.0" + "source": "https://github.com/tighten/ziggy/tree/v1.6.1" }, - "time": "2023-05-12T20:08:56+00:00" + "time": "2023-08-04T19:01:59+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -9616,16 +9395,16 @@ }, { "name": "brianium/paratest", - "version": "v7.2.3", + "version": "v7.2.4", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "ec6713d48856b7e8af64b2f94b084fb861bcc71b" + "reference": "a310a310973226f5c25de806987bfc11aa99ab91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/ec6713d48856b7e8af64b2f94b084fb861bcc71b", - "reference": "ec6713d48856b7e8af64b2f94b084fb861bcc71b", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/a310a310973226f5c25de806987bfc11aa99ab91", + "reference": "a310a310973226f5c25de806987bfc11aa99ab91", "shasum": "" }, "require": { @@ -9636,13 +9415,13 @@ "fidry/cpu-core-counter": "^0.4.1 || ^0.5.1", "jean85/pretty-package-versions": "^2.0.5", "php": "~8.1.0 || ~8.2.0 || ~8.3.0", - "phpunit/php-code-coverage": "^10.1.2", + "phpunit/php-code-coverage": "^10.1.3", "phpunit/php-file-iterator": "^4.0.2", "phpunit/php-timer": "^6.0", - "phpunit/phpunit": "^10.2.6", + "phpunit/phpunit": "^10.3.1", "sebastian/environment": "^6.0.1", - "symfony/console": "^6.3.0", - "symfony/process": "^6.3.0" + "symfony/console": "^6.3.2", + "symfony/process": "^6.3.2" }, "require-dev": { "doctrine/coding-standard": "^12.0.0", @@ -9695,7 +9474,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.2.3" + "source": "https://github.com/paratestphp/paratest/tree/v7.2.4" }, "funding": [ { @@ -9707,7 +9486,7 @@ "type": "paypal" } ], - "time": "2023-07-20T10:18:35+00:00" + "time": "2023-08-04T09:22:30+00:00" }, { "name": "codedungeon/php-cli-colors", @@ -10116,16 +9895,16 @@ }, { "name": "laravel/dusk", - "version": "v7.9.1", + "version": "v7.9.2", "source": { "type": "git", "url": "https://github.com/laravel/dusk.git", - "reference": "c7261854fa3be500c2e331600eb1b265052690be" + "reference": "9af939b4f62b9086b7ce38aa1e953034809c5962" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/dusk/zipball/c7261854fa3be500c2e331600eb1b265052690be", - "reference": "c7261854fa3be500c2e331600eb1b265052690be", + "url": "https://api.github.com/repos/laravel/dusk/zipball/9af939b4f62b9086b7ce38aa1e953034809c5962", + "reference": "9af939b4f62b9086b7ce38aa1e953034809c5962", "shasum": "" }, "require": { @@ -10186,9 +9965,9 @@ ], "support": { "issues": "https://github.com/laravel/dusk/issues", - "source": "https://github.com/laravel/dusk/tree/v7.9.1" + "source": "https://github.com/laravel/dusk/tree/v7.9.2" }, - "time": "2023-07-27T02:09:52+00:00" + "time": "2023-07-30T03:20:41+00:00" }, { "name": "laravel/pint", @@ -10955,16 +10734,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.2.6", + "version": "10.3.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1c17815c129f133f3019cc18e8d0c8622e6d9bcd" + "reference": "d442ce7c4104d5683c12e67e4dcb5058159e9804" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1c17815c129f133f3019cc18e8d0c8622e6d9bcd", - "reference": "1c17815c129f133f3019cc18e8d0c8622e6d9bcd", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d442ce7c4104d5683c12e67e4dcb5058159e9804", + "reference": "d442ce7c4104d5683c12e67e4dcb5058159e9804", "shasum": "" }, "require": { @@ -10989,7 +10768,7 @@ "sebastian/diff": "^5.0", "sebastian/environment": "^6.0", "sebastian/exporter": "^5.0", - "sebastian/global-state": "^6.0", + "sebastian/global-state": "^6.0.1", "sebastian/object-enumerator": "^5.0", "sebastian/recursion-context": "^5.0", "sebastian/type": "^4.0", @@ -11004,7 +10783,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.2-dev" + "dev-main": "10.3-dev" } }, "autoload": { @@ -11036,7 +10815,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.6" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.1" }, "funding": [ { @@ -11052,7 +10831,7 @@ "type": "tidelift" } ], - "time": "2023-07-17T12:08:28+00:00" + "time": "2023-08-04T06:48:08+00:00" }, { "name": "sebastian/cli-parser", diff --git a/public/css/app.css b/public/css/app.css index c4b7eacf..8beef372 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -10,7 +10,7 @@ [data-bs-theme=light] { --bs-blue: #2c3e50; --bs-indigo: #6610f2; - --bs-purple: #6f42c1; + --bs-purple: #9e7ae0; --bs-pink: #e83e8c; --bs-red: #e74c3c; --bs-orange: #fd7e14; @@ -15680,45 +15680,45 @@ input[type=file].form-control { } } .bmx-text-purple { - color: rgba(111, 66, 193, var(--bmx-text-opacity)) !important; + color: rgba(158, 122, 224, var(--bmx-text-opacity)) !important; } @media (prefers-color-scheme: dark) { .bmx-dark-text-purple { - color: rgba(111, 66, 193, var(--bmx-text-opacity)) !important; + color: rgba(158, 122, 224, var(--bmx-text-opacity)) !important; } } @media (prefers-color-scheme: light) { .bmx-light-text-purple { - color: rgba(111, 66, 193, var(--bmx-text-opacity)) !important; + color: rgba(158, 122, 224, var(--bmx-text-opacity)) !important; } } .bmx-text-purple-light { - color: rgba(197, 179, 230, var(--bmx-text-opacity)) !important; + color: rgba(216, 202, 243, var(--bmx-text-opacity)) !important; } @media (prefers-color-scheme: dark) { .bmx-dark-text-purple-light { - color: rgba(197, 179, 230, var(--bmx-text-opacity)) !important; + color: rgba(216, 202, 243, var(--bmx-text-opacity)) !important; } } @media (prefers-color-scheme: light) { .bmx-light-text-purple-light { - color: rgba(197, 179, 230, var(--bmx-text-opacity)) !important; + color: rgba(216, 202, 243, var(--bmx-text-opacity)) !important; } } .bmx-text-purple-dark { - color: rgba(67, 40, 116, var(--bmx-text-opacity)) !important; + color: rgba(95, 73, 134, var(--bmx-text-opacity)) !important; } @media (prefers-color-scheme: dark) { .bmx-dark-text-purple-dark { - color: rgba(67, 40, 116, var(--bmx-text-opacity)) !important; + color: rgba(95, 73, 134, var(--bmx-text-opacity)) !important; } } @media (prefers-color-scheme: light) { .bmx-light-text-purple-dark { - color: rgba(67, 40, 116, var(--bmx-text-opacity)) !important; + color: rgba(95, 73, 134, var(--bmx-text-opacity)) !important; } } .bmx-text-pink { @@ -16338,45 +16338,45 @@ input[type=file].form-control { } } .bmx-text-purple-hover:hover { - color: rgba(111, 66, 193, var(--bmx-text-opacity)) !important; + color: rgba(158, 122, 224, var(--bmx-text-opacity)) !important; } @media (prefers-color-scheme: dark) { .bmx-dark-text-purple-hover:hover { - color: rgba(111, 66, 193, var(--bmx-text-opacity)) !important; + color: rgba(158, 122, 224, var(--bmx-text-opacity)) !important; } } @media (prefers-color-scheme: light) { .bmx-light-text-purple-hover:hover { - color: rgba(111, 66, 193, var(--bmx-text-opacity)) !important; + color: rgba(158, 122, 224, var(--bmx-text-opacity)) !important; } } .bmx-text-purple-light-hover:hover { - color: rgba(197, 179, 230, var(--bmx-text-opacity)) !important; + color: rgba(216, 202, 243, var(--bmx-text-opacity)) !important; } @media (prefers-color-scheme: dark) { .bmx-dark-text-purple-light-hover:hover { - color: rgba(197, 179, 230, var(--bmx-text-opacity)) !important; + color: rgba(216, 202, 243, var(--bmx-text-opacity)) !important; } } @media (prefers-color-scheme: light) { .bmx-light-text-purple-light-hover:hover { - color: rgba(197, 179, 230, var(--bmx-text-opacity)) !important; + color: rgba(216, 202, 243, var(--bmx-text-opacity)) !important; } } .bmx-text-purple-dark-hover:hover { - color: rgba(67, 40, 116, var(--bmx-text-opacity)) !important; + color: rgba(95, 73, 134, var(--bmx-text-opacity)) !important; } @media (prefers-color-scheme: dark) { .bmx-dark-text-purple-dark-hover:hover { - color: rgba(67, 40, 116, var(--bmx-text-opacity)) !important; + color: rgba(95, 73, 134, var(--bmx-text-opacity)) !important; } } @media (prefers-color-scheme: light) { .bmx-light-text-purple-dark-hover:hover { - color: rgba(67, 40, 116, var(--bmx-text-opacity)) !important; + color: rgba(95, 73, 134, var(--bmx-text-opacity)) !important; } } .bmx-text-pink-hover:hover { @@ -17128,72 +17128,72 @@ input[type=file].form-control { } } .bmx-link-purple { - color: #6f42c1; + color: #9e7ae0; } .bmx-link-purple:hover, .bmx-link-purple:focus { - color: #6e42c0; + color: #9d79df; } @media (prefers-color-scheme: dark) { .bmx-dark-link-purple { - color: #6f42c1; + color: #9e7ae0; } .bmx-dark-link-purple:hover, .bmx-dark-link-purple:focus { - color: #6e42c0; + color: #9d79df; } } @media (prefers-color-scheme: light) { .bmx-light-link-purple { - color: #6f42c1; + color: #9e7ae0; } .bmx-light-link-purple:hover, .bmx-light-link-purple:focus { - color: #6e42c0; + color: #9d79df; } } .bmx-link-purple-light { - color: #c5b3e6; + color: #d8caf3; } .bmx-link-purple-light:hover, .bmx-link-purple-light:focus { - color: #c4b2e5; + color: #d7c9f2; } @media (prefers-color-scheme: dark) { .bmx-dark-link-purple-light { - color: #c5b3e6; + color: #d8caf3; } .bmx-dark-link-purple-light:hover, .bmx-dark-link-purple-light:focus { - color: #c4b2e5; + color: #d7c9f2; } } @media (prefers-color-scheme: light) { .bmx-light-link-purple-light { - color: #c5b3e6; + color: #d8caf3; } .bmx-light-link-purple-light:hover, .bmx-light-link-purple-light:focus { - color: #c4b2e5; + color: #d7c9f2; } } .bmx-link-purple-dark { - color: #432874; + color: #5f4986; } .bmx-link-purple-dark:hover, .bmx-link-purple-dark:focus { - color: #432873; + color: #5f4985; } @media (prefers-color-scheme: dark) { .bmx-dark-link-purple-dark { - color: #432874; + color: #5f4986; } .bmx-dark-link-purple-dark:hover, .bmx-dark-link-purple-dark:focus { - color: #432873; + color: #5f4985; } } @media (prefers-color-scheme: light) { .bmx-light-link-purple-dark { - color: #432874; + color: #5f4986; } .bmx-light-link-purple-dark:hover, .bmx-light-link-purple-dark:focus { - color: #432873; + color: #5f4985; } } .bmx-link-pink { @@ -18153,45 +18153,45 @@ input[type=file].form-control { } } .bmx-td-purple { - text-decoration-color: rgba(111, 66, 193, var(--bmx-bg-opacity)); + text-decoration-color: rgba(158, 122, 224, var(--bmx-bg-opacity)); } @media (prefers-color-scheme: dark) { .bmx-dark-td-purple { - text-decoration-color: rgba(111, 66, 193, var(--bmx-bg-opacity)); + text-decoration-color: rgba(158, 122, 224, var(--bmx-bg-opacity)); } } @media (prefers-color-scheme: light) { .bmx-light-td-purple { - text-decoration-color: rgba(111, 66, 193, var(--bmx-bg-opacity)); + text-decoration-color: rgba(158, 122, 224, var(--bmx-bg-opacity)); } } .bmx-td-purple-light { - text-decoration-color: rgba(197, 179, 230, var(--bmx-bg-opacity)); + text-decoration-color: rgba(216, 202, 243, var(--bmx-bg-opacity)); } @media (prefers-color-scheme: dark) { .bmx-dark-td-purple-light { - text-decoration-color: rgba(197, 179, 230, var(--bmx-bg-opacity)); + text-decoration-color: rgba(216, 202, 243, var(--bmx-bg-opacity)); } } @media (prefers-color-scheme: light) { .bmx-light-td-purple-light { - text-decoration-color: rgba(197, 179, 230, var(--bmx-bg-opacity)); + text-decoration-color: rgba(216, 202, 243, var(--bmx-bg-opacity)); } } .bmx-td-purple-dark { - text-decoration-color: rgba(67, 40, 116, var(--bmx-bg-opacity)); + text-decoration-color: rgba(95, 73, 134, var(--bmx-bg-opacity)); } @media (prefers-color-scheme: dark) { .bmx-dark-td-purple-dark { - text-decoration-color: rgba(67, 40, 116, var(--bmx-bg-opacity)); + text-decoration-color: rgba(95, 73, 134, var(--bmx-bg-opacity)); } } @media (prefers-color-scheme: light) { .bmx-light-td-purple-dark { - text-decoration-color: rgba(67, 40, 116, var(--bmx-bg-opacity)); + text-decoration-color: rgba(95, 73, 134, var(--bmx-bg-opacity)); } } .bmx-td-pink { @@ -19140,161 +19140,161 @@ input[type=file].form-control { } .bmx-btn-purple { --bs-btn-color: #fff; - --bs-btn-bg: #6f42c1; - --bs-btn-border-color: #6f42c1; + --bs-btn-bg: #9e7ae0; + --bs-btn-border-color: #9e7ae0; --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #5e38a4; - --bs-btn-hover-border-color: #59359a; - --bs-btn-focus-shadow-rgb: 133, 94, 202; + --bs-btn-hover-bg: #8668be; + --bs-btn-hover-border-color: #7e62b3; + --bs-btn-focus-shadow-rgb: 173, 142, 229; --bs-btn-active-color: #fff; - --bs-btn-active-bg: #59359a; - --bs-btn-active-border-color: #533291; + --bs-btn-active-bg: #7e62b3; + --bs-btn-active-border-color: #775ca8; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #6f42c1; - --bs-btn-disabled-border-color: #6f42c1; + --bs-btn-disabled-bg: #9e7ae0; + --bs-btn-disabled-border-color: #9e7ae0; } @media (prefers-color-scheme: dark) { .bmx-dark-btn-purple { --bs-btn-color: #fff; - --bs-btn-bg: #6f42c1; - --bs-btn-border-color: #6f42c1; + --bs-btn-bg: #9e7ae0; + --bs-btn-border-color: #9e7ae0; --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #5e38a4; - --bs-btn-hover-border-color: #59359a; - --bs-btn-focus-shadow-rgb: 133, 94, 202; + --bs-btn-hover-bg: #8668be; + --bs-btn-hover-border-color: #7e62b3; + --bs-btn-focus-shadow-rgb: 173, 142, 229; --bs-btn-active-color: #fff; - --bs-btn-active-bg: #59359a; - --bs-btn-active-border-color: #533291; + --bs-btn-active-bg: #7e62b3; + --bs-btn-active-border-color: #775ca8; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #6f42c1; - --bs-btn-disabled-border-color: #6f42c1; + --bs-btn-disabled-bg: #9e7ae0; + --bs-btn-disabled-border-color: #9e7ae0; } } @media (prefers-color-scheme: light) { .bmx-light-btn-purple { --bs-btn-color: #fff; - --bs-btn-bg: #6f42c1; - --bs-btn-border-color: #6f42c1; + --bs-btn-bg: #9e7ae0; + --bs-btn-border-color: #9e7ae0; --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #5e38a4; - --bs-btn-hover-border-color: #59359a; - --bs-btn-focus-shadow-rgb: 133, 94, 202; + --bs-btn-hover-bg: #8668be; + --bs-btn-hover-border-color: #7e62b3; + --bs-btn-focus-shadow-rgb: 173, 142, 229; --bs-btn-active-color: #fff; - --bs-btn-active-bg: #59359a; - --bs-btn-active-border-color: #533291; + --bs-btn-active-bg: #7e62b3; + --bs-btn-active-border-color: #775ca8; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #6f42c1; - --bs-btn-disabled-border-color: #6f42c1; + --bs-btn-disabled-bg: #9e7ae0; + --bs-btn-disabled-border-color: #9e7ae0; } } .bmx-btn-purple-light { --bs-btn-color: #000; - --bs-btn-bg: #c5b3e6; - --bs-btn-border-color: #c5b3e6; + --bs-btn-bg: #d8caf3; + --bs-btn-border-color: #d8caf3; --bs-btn-hover-color: #000; - --bs-btn-hover-bg: #cebeea; - --bs-btn-hover-border-color: #cbbbe9; - --bs-btn-focus-shadow-rgb: 167, 152, 196; + --bs-btn-hover-bg: #ded2f5; + --bs-btn-hover-border-color: #dccff4; + --bs-btn-focus-shadow-rgb: 184, 172, 207; --bs-btn-active-color: #000; - --bs-btn-active-bg: #d1c2eb; - --bs-btn-active-border-color: #cbbbe9; + --bs-btn-active-bg: #e0d5f5; + --bs-btn-active-border-color: #dccff4; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); --bs-btn-disabled-color: #000; - --bs-btn-disabled-bg: #c5b3e6; - --bs-btn-disabled-border-color: #c5b3e6; + --bs-btn-disabled-bg: #d8caf3; + --bs-btn-disabled-border-color: #d8caf3; } @media (prefers-color-scheme: dark) { .bmx-dark-btn-purple-light { --bs-btn-color: #000; - --bs-btn-bg: #c5b3e6; - --bs-btn-border-color: #c5b3e6; + --bs-btn-bg: #d8caf3; + --bs-btn-border-color: #d8caf3; --bs-btn-hover-color: #000; - --bs-btn-hover-bg: #cebeea; - --bs-btn-hover-border-color: #cbbbe9; - --bs-btn-focus-shadow-rgb: 167, 152, 196; + --bs-btn-hover-bg: #ded2f5; + --bs-btn-hover-border-color: #dccff4; + --bs-btn-focus-shadow-rgb: 184, 172, 207; --bs-btn-active-color: #000; - --bs-btn-active-bg: #d1c2eb; - --bs-btn-active-border-color: #cbbbe9; + --bs-btn-active-bg: #e0d5f5; + --bs-btn-active-border-color: #dccff4; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); --bs-btn-disabled-color: #000; - --bs-btn-disabled-bg: #c5b3e6; - --bs-btn-disabled-border-color: #c5b3e6; + --bs-btn-disabled-bg: #d8caf3; + --bs-btn-disabled-border-color: #d8caf3; } } @media (prefers-color-scheme: light) { .bmx-light-btn-purple-light { --bs-btn-color: #000; - --bs-btn-bg: #c5b3e6; - --bs-btn-border-color: #c5b3e6; + --bs-btn-bg: #d8caf3; + --bs-btn-border-color: #d8caf3; --bs-btn-hover-color: #000; - --bs-btn-hover-bg: #cebeea; - --bs-btn-hover-border-color: #cbbbe9; - --bs-btn-focus-shadow-rgb: 167, 152, 196; + --bs-btn-hover-bg: #ded2f5; + --bs-btn-hover-border-color: #dccff4; + --bs-btn-focus-shadow-rgb: 184, 172, 207; --bs-btn-active-color: #000; - --bs-btn-active-bg: #d1c2eb; - --bs-btn-active-border-color: #cbbbe9; + --bs-btn-active-bg: #e0d5f5; + --bs-btn-active-border-color: #dccff4; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); --bs-btn-disabled-color: #000; - --bs-btn-disabled-bg: #c5b3e6; - --bs-btn-disabled-border-color: #c5b3e6; + --bs-btn-disabled-bg: #d8caf3; + --bs-btn-disabled-border-color: #d8caf3; } } .bmx-btn-purple-dark { --bs-btn-color: #fff; - --bs-btn-bg: #432874; - --bs-btn-border-color: #432874; + --bs-btn-bg: #5f4986; + --bs-btn-border-color: #5f4986; --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #392263; - --bs-btn-hover-border-color: #36205d; - --bs-btn-focus-shadow-rgb: 95, 72, 137; + --bs-btn-hover-bg: #513e72; + --bs-btn-hover-border-color: #4c3a6b; + --bs-btn-focus-shadow-rgb: 119, 100, 152; --bs-btn-active-color: #fff; - --bs-btn-active-bg: #36205d; - --bs-btn-active-border-color: #321e57; + --bs-btn-active-bg: #4c3a6b; + --bs-btn-active-border-color: #473765; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #432874; - --bs-btn-disabled-border-color: #432874; + --bs-btn-disabled-bg: #5f4986; + --bs-btn-disabled-border-color: #5f4986; } @media (prefers-color-scheme: dark) { .bmx-dark-btn-purple-dark { --bs-btn-color: #fff; - --bs-btn-bg: #432874; - --bs-btn-border-color: #432874; + --bs-btn-bg: #5f4986; + --bs-btn-border-color: #5f4986; --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #392263; - --bs-btn-hover-border-color: #36205d; - --bs-btn-focus-shadow-rgb: 95, 72, 137; + --bs-btn-hover-bg: #513e72; + --bs-btn-hover-border-color: #4c3a6b; + --bs-btn-focus-shadow-rgb: 119, 100, 152; --bs-btn-active-color: #fff; - --bs-btn-active-bg: #36205d; - --bs-btn-active-border-color: #321e57; + --bs-btn-active-bg: #4c3a6b; + --bs-btn-active-border-color: #473765; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #432874; - --bs-btn-disabled-border-color: #432874; + --bs-btn-disabled-bg: #5f4986; + --bs-btn-disabled-border-color: #5f4986; } } @media (prefers-color-scheme: light) { .bmx-light-btn-purple-dark { --bs-btn-color: #fff; - --bs-btn-bg: #432874; - --bs-btn-border-color: #432874; + --bs-btn-bg: #5f4986; + --bs-btn-border-color: #5f4986; --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #392263; - --bs-btn-hover-border-color: #36205d; - --bs-btn-focus-shadow-rgb: 95, 72, 137; + --bs-btn-hover-bg: #513e72; + --bs-btn-hover-border-color: #4c3a6b; + --bs-btn-focus-shadow-rgb: 119, 100, 152; --bs-btn-active-color: #fff; - --bs-btn-active-bg: #36205d; - --bs-btn-active-border-color: #321e57; + --bs-btn-active-bg: #4c3a6b; + --bs-btn-active-border-color: #473765; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); --bs-btn-disabled-color: #fff; - --bs-btn-disabled-bg: #432874; - --bs-btn-disabled-border-color: #432874; + --bs-btn-disabled-bg: #5f4986; + --bs-btn-disabled-border-color: #5f4986; } } .bmx-btn-pink { @@ -21630,161 +21630,161 @@ input[type=file].form-control { } } .bmx-btn-outline-purple { - --bs-btn-color: #6f42c1; - --bs-btn-border-color: #6f42c1; + --bs-btn-color: #9e7ae0; + --bs-btn-border-color: #9e7ae0; --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #6f42c1; - --bs-btn-hover-border-color: #6f42c1; - --bs-btn-focus-shadow-rgb: 111, 66, 193; + --bs-btn-hover-bg: #9e7ae0; + --bs-btn-hover-border-color: #9e7ae0; + --bs-btn-focus-shadow-rgb: 158, 122, 224; --bs-btn-active-color: #fff; - --bs-btn-active-bg: #6f42c1; - --bs-btn-active-border-color: #6f42c1; + --bs-btn-active-bg: #9e7ae0; + --bs-btn-active-border-color: #9e7ae0; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #6f42c1; + --bs-btn-disabled-color: #9e7ae0; --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #6f42c1; + --bs-btn-disabled-border-color: #9e7ae0; --bs-gradient: none; } @media (prefers-color-scheme: dark) { .bmx-dark-btn-outline-purple { - --bs-btn-color: #6f42c1; - --bs-btn-border-color: #6f42c1; + --bs-btn-color: #9e7ae0; + --bs-btn-border-color: #9e7ae0; --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #6f42c1; - --bs-btn-hover-border-color: #6f42c1; - --bs-btn-focus-shadow-rgb: 111, 66, 193; + --bs-btn-hover-bg: #9e7ae0; + --bs-btn-hover-border-color: #9e7ae0; + --bs-btn-focus-shadow-rgb: 158, 122, 224; --bs-btn-active-color: #fff; - --bs-btn-active-bg: #6f42c1; - --bs-btn-active-border-color: #6f42c1; + --bs-btn-active-bg: #9e7ae0; + --bs-btn-active-border-color: #9e7ae0; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #6f42c1; + --bs-btn-disabled-color: #9e7ae0; --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #6f42c1; + --bs-btn-disabled-border-color: #9e7ae0; --bs-gradient: none; } } @media (prefers-color-scheme: light) { .bmx-light-btn-outline-purple { - --bs-btn-color: #6f42c1; - --bs-btn-border-color: #6f42c1; + --bs-btn-color: #9e7ae0; + --bs-btn-border-color: #9e7ae0; --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #6f42c1; - --bs-btn-hover-border-color: #6f42c1; - --bs-btn-focus-shadow-rgb: 111, 66, 193; + --bs-btn-hover-bg: #9e7ae0; + --bs-btn-hover-border-color: #9e7ae0; + --bs-btn-focus-shadow-rgb: 158, 122, 224; --bs-btn-active-color: #fff; - --bs-btn-active-bg: #6f42c1; - --bs-btn-active-border-color: #6f42c1; + --bs-btn-active-bg: #9e7ae0; + --bs-btn-active-border-color: #9e7ae0; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #6f42c1; + --bs-btn-disabled-color: #9e7ae0; --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #6f42c1; + --bs-btn-disabled-border-color: #9e7ae0; --bs-gradient: none; } } .bmx-btn-outline-purple-light { - --bs-btn-color: #c5b3e6; - --bs-btn-border-color: #c5b3e6; + --bs-btn-color: #d8caf3; + --bs-btn-border-color: #d8caf3; --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #c5b3e6; - --bs-btn-hover-border-color: #c5b3e6; - --bs-btn-focus-shadow-rgb: 197, 179, 230; + --bs-btn-hover-bg: #d8caf3; + --bs-btn-hover-border-color: #d8caf3; + --bs-btn-focus-shadow-rgb: 216, 202, 243; --bs-btn-active-color: #000; - --bs-btn-active-bg: #c5b3e6; - --bs-btn-active-border-color: #c5b3e6; + --bs-btn-active-bg: #d8caf3; + --bs-btn-active-border-color: #d8caf3; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #c5b3e6; + --bs-btn-disabled-color: #d8caf3; --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #c5b3e6; + --bs-btn-disabled-border-color: #d8caf3; --bs-gradient: none; } @media (prefers-color-scheme: dark) { .bmx-dark-btn-outline-purple-light { - --bs-btn-color: #c5b3e6; - --bs-btn-border-color: #c5b3e6; + --bs-btn-color: #d8caf3; + --bs-btn-border-color: #d8caf3; --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #c5b3e6; - --bs-btn-hover-border-color: #c5b3e6; - --bs-btn-focus-shadow-rgb: 197, 179, 230; + --bs-btn-hover-bg: #d8caf3; + --bs-btn-hover-border-color: #d8caf3; + --bs-btn-focus-shadow-rgb: 216, 202, 243; --bs-btn-active-color: #000; - --bs-btn-active-bg: #c5b3e6; - --bs-btn-active-border-color: #c5b3e6; + --bs-btn-active-bg: #d8caf3; + --bs-btn-active-border-color: #d8caf3; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #c5b3e6; + --bs-btn-disabled-color: #d8caf3; --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #c5b3e6; + --bs-btn-disabled-border-color: #d8caf3; --bs-gradient: none; } } @media (prefers-color-scheme: light) { .bmx-light-btn-outline-purple-light { - --bs-btn-color: #c5b3e6; - --bs-btn-border-color: #c5b3e6; + --bs-btn-color: #d8caf3; + --bs-btn-border-color: #d8caf3; --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #c5b3e6; - --bs-btn-hover-border-color: #c5b3e6; - --bs-btn-focus-shadow-rgb: 197, 179, 230; + --bs-btn-hover-bg: #d8caf3; + --bs-btn-hover-border-color: #d8caf3; + --bs-btn-focus-shadow-rgb: 216, 202, 243; --bs-btn-active-color: #000; - --bs-btn-active-bg: #c5b3e6; - --bs-btn-active-border-color: #c5b3e6; + --bs-btn-active-bg: #d8caf3; + --bs-btn-active-border-color: #d8caf3; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #c5b3e6; + --bs-btn-disabled-color: #d8caf3; --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #c5b3e6; + --bs-btn-disabled-border-color: #d8caf3; --bs-gradient: none; } } .bmx-btn-outline-purple-dark { - --bs-btn-color: #432874; - --bs-btn-border-color: #432874; + --bs-btn-color: #5f4986; + --bs-btn-border-color: #5f4986; --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #432874; - --bs-btn-hover-border-color: #432874; - --bs-btn-focus-shadow-rgb: 67, 40, 116; + --bs-btn-hover-bg: #5f4986; + --bs-btn-hover-border-color: #5f4986; + --bs-btn-focus-shadow-rgb: 95, 73, 134; --bs-btn-active-color: #fff; - --bs-btn-active-bg: #432874; - --bs-btn-active-border-color: #432874; + --bs-btn-active-bg: #5f4986; + --bs-btn-active-border-color: #5f4986; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #432874; + --bs-btn-disabled-color: #5f4986; --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #432874; + --bs-btn-disabled-border-color: #5f4986; --bs-gradient: none; } @media (prefers-color-scheme: dark) { .bmx-dark-btn-outline-purple-dark { - --bs-btn-color: #432874; - --bs-btn-border-color: #432874; + --bs-btn-color: #5f4986; + --bs-btn-border-color: #5f4986; --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #432874; - --bs-btn-hover-border-color: #432874; - --bs-btn-focus-shadow-rgb: 67, 40, 116; + --bs-btn-hover-bg: #5f4986; + --bs-btn-hover-border-color: #5f4986; + --bs-btn-focus-shadow-rgb: 95, 73, 134; --bs-btn-active-color: #fff; - --bs-btn-active-bg: #432874; - --bs-btn-active-border-color: #432874; + --bs-btn-active-bg: #5f4986; + --bs-btn-active-border-color: #5f4986; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #432874; + --bs-btn-disabled-color: #5f4986; --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #432874; + --bs-btn-disabled-border-color: #5f4986; --bs-gradient: none; } } @media (prefers-color-scheme: light) { .bmx-light-btn-outline-purple-dark { - --bs-btn-color: #432874; - --bs-btn-border-color: #432874; + --bs-btn-color: #5f4986; + --bs-btn-border-color: #5f4986; --bs-btn-hover-color: #fff; - --bs-btn-hover-bg: #432874; - --bs-btn-hover-border-color: #432874; - --bs-btn-focus-shadow-rgb: 67, 40, 116; + --bs-btn-hover-bg: #5f4986; + --bs-btn-hover-border-color: #5f4986; + --bs-btn-focus-shadow-rgb: 95, 73, 134; --bs-btn-active-color: #fff; - --bs-btn-active-bg: #432874; - --bs-btn-active-border-color: #432874; + --bs-btn-active-bg: #5f4986; + --bs-btn-active-border-color: #5f4986; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: #432874; + --bs-btn-disabled-color: #5f4986; --bs-btn-disabled-bg: transparent; - --bs-btn-disabled-border-color: #432874; + --bs-btn-disabled-border-color: #5f4986; --bs-gradient: none; } } @@ -23995,81 +23995,81 @@ input[type=file].form-control { } } .bmx-border-purple { - border-color: #6f42c1 !important; + border-color: #9e7ae0 !important; } .bmx-border-purple-hover:hover { - border-color: #6f42c1 !important; + border-color: #9e7ae0 !important; } @media (prefers-color-scheme: dark) { .bmx-dark-border-purple { - border-color: #6f42c1 !important; + border-color: #9e7ae0 !important; } .bmx-dark-border-purple-hover:hover { - border-color: #6f42c1 !important; + border-color: #9e7ae0 !important; } } @media (prefers-color-scheme: light) { .bmx-light-border-purple { - border-color: #6f42c1 !important; + border-color: #9e7ae0 !important; } .bmx-light-border-purple-hover:hover { - border-color: #6f42c1 !important; + border-color: #9e7ae0 !important; } } .bmx-border-purple-light { - border-color: #c5b3e6 !important; + border-color: #d8caf3 !important; } .bmx-border-purple-light-hover:hover { - border-color: #c5b3e6 !important; + border-color: #d8caf3 !important; } @media (prefers-color-scheme: dark) { .bmx-dark-border-purple-light { - border-color: #c5b3e6 !important; + border-color: #d8caf3 !important; } .bmx-dark-border-purple-light-hover:hover { - border-color: #c5b3e6 !important; + border-color: #d8caf3 !important; } } @media (prefers-color-scheme: light) { .bmx-light-border-purple-light { - border-color: #c5b3e6 !important; + border-color: #d8caf3 !important; } .bmx-light-border-purple-light-hover:hover { - border-color: #c5b3e6 !important; + border-color: #d8caf3 !important; } } .bmx-border-purple-dark { - border-color: #432874 !important; + border-color: #5f4986 !important; } .bmx-border-purple-dark-hover:hover { - border-color: #432874 !important; + border-color: #5f4986 !important; } @media (prefers-color-scheme: dark) { .bmx-dark-border-purple-dark { - border-color: #432874 !important; + border-color: #5f4986 !important; } .bmx-dark-border-purple-dark-hover:hover { - border-color: #432874 !important; + border-color: #5f4986 !important; } } @media (prefers-color-scheme: light) { .bmx-light-border-purple-dark { - border-color: #432874 !important; + border-color: #5f4986 !important; } .bmx-light-border-purple-dark-hover:hover { - border-color: #432874 !important; + border-color: #5f4986 !important; } } .bmx-border-pink { @@ -25227,81 +25227,81 @@ input[type=file].form-control { } } .bmx-bg-purple { - background-color: rgba(111, 66, 193, var(--bmx-bg-opacity)); + background-color: rgba(158, 122, 224, var(--bmx-bg-opacity)); } .bmx-bg-purple-hover:hover { - background-color: rgba(111, 66, 193, var(--bmx-bg-opacity)); + background-color: rgba(158, 122, 224, var(--bmx-bg-opacity)); } @media (prefers-color-scheme: dark) { .bmx-dark-bg-purple { - background-color: rgba(111, 66, 193, var(--bmx-bg-opacity)); + background-color: rgba(158, 122, 224, var(--bmx-bg-opacity)); } .bmx-dark-bg-purple-hover:hover { - background-color: rgba(111, 66, 193, var(--bmx-bg-opacity)); + background-color: rgba(158, 122, 224, var(--bmx-bg-opacity)); } } @media (prefers-color-scheme: light) { .bmx-light-bg-purple { - background-color: rgba(111, 66, 193, var(--bmx-bg-opacity)); + background-color: rgba(158, 122, 224, var(--bmx-bg-opacity)); } .bmx-light-bg-purple-hover:hover { - background-color: rgba(111, 66, 193, var(--bmx-bg-opacity)); + background-color: rgba(158, 122, 224, var(--bmx-bg-opacity)); } } .bmx-bg-purple-light { - background-color: rgba(197, 179, 230, var(--bmx-bg-opacity)); + background-color: rgba(216, 202, 243, var(--bmx-bg-opacity)); } .bmx-bg-purple-light-hover:hover { - background-color: rgba(197, 179, 230, var(--bmx-bg-opacity)); + background-color: rgba(216, 202, 243, var(--bmx-bg-opacity)); } @media (prefers-color-scheme: dark) { .bmx-dark-bg-purple-light { - background-color: rgba(197, 179, 230, var(--bmx-bg-opacity)); + background-color: rgba(216, 202, 243, var(--bmx-bg-opacity)); } .bmx-dark-bg-purple-light-hover:hover { - background-color: rgba(197, 179, 230, var(--bmx-bg-opacity)); + background-color: rgba(216, 202, 243, var(--bmx-bg-opacity)); } } @media (prefers-color-scheme: light) { .bmx-light-bg-purple-light { - background-color: rgba(197, 179, 230, var(--bmx-bg-opacity)); + background-color: rgba(216, 202, 243, var(--bmx-bg-opacity)); } .bmx-light-bg-purple-light-hover:hover { - background-color: rgba(197, 179, 230, var(--bmx-bg-opacity)); + background-color: rgba(216, 202, 243, var(--bmx-bg-opacity)); } } .bmx-bg-purple-dark { - background-color: rgba(67, 40, 116, var(--bmx-bg-opacity)); + background-color: rgba(95, 73, 134, var(--bmx-bg-opacity)); } .bmx-bg-purple-dark-hover:hover { - background-color: rgba(67, 40, 116, var(--bmx-bg-opacity)); + background-color: rgba(95, 73, 134, var(--bmx-bg-opacity)); } @media (prefers-color-scheme: dark) { .bmx-dark-bg-purple-dark { - background-color: rgba(67, 40, 116, var(--bmx-bg-opacity)); + background-color: rgba(95, 73, 134, var(--bmx-bg-opacity)); } .bmx-dark-bg-purple-dark-hover:hover { - background-color: rgba(67, 40, 116, var(--bmx-bg-opacity)); + background-color: rgba(95, 73, 134, var(--bmx-bg-opacity)); } } @media (prefers-color-scheme: light) { .bmx-light-bg-purple-dark { - background-color: rgba(67, 40, 116, var(--bmx-bg-opacity)); + background-color: rgba(95, 73, 134, var(--bmx-bg-opacity)); } .bmx-light-bg-purple-dark-hover:hover { - background-color: rgba(67, 40, 116, var(--bmx-bg-opacity)); + background-color: rgba(95, 73, 134, var(--bmx-bg-opacity)); } } .bmx-bg-pink { diff --git a/public/js/app.js b/public/js/app.js index a776d4b0..5fe52fd4 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -22002,8 +22002,6 @@ __webpack_require__(/*! ./script-components/ajax-forms */ "./resources/js/script // UI UX level components __webpack_require__(/*! ./script-components/tooltips */ "./resources/js/script-components/tooltips.js"); __webpack_require__(/*! ./script-components/clipboard */ "./resources/js/script-components/clipboard.js"); -__webpack_require__(/*! ./script-components/subscription-create */ "./resources/js/script-components/subscription-create.js"); -__webpack_require__(/*! ./script-components/subscription-payment-method */ "./resources/js/script-components/subscription-payment-method.js"); /***/ }), @@ -22255,170 +22253,6 @@ document.addEventListener('DOMContentLoaded', function (event) { /***/ }), -/***/ "./resources/js/script-components/subscription-create.js": -/*!***************************************************************!*\ - !*** ./resources/js/script-components/subscription-create.js ***! - \***************************************************************/ -/***/ (() => { - -function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } -function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; } -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } -var subscriptionForm = document.getElementById('subscription-form'); -if (subscriptionForm) { - var _color = !window.matchMedia('(prefers-color-scheme: dark)').matches ? '#111' : '#FFF'; - var stripe = window.Stripe(window.stripe_key); - var elements = stripe.elements(); - var cardElement = elements.create('card', { - style: { - base: { - color: _color - } - }, - hidePostalCode: true - }); - cardElement.mount('#card-element'); - var cardHolderPlan = document.getElementById('card-holder-plan'); - var cardHolderName = document.getElementById('card-holder-name'); - var cardHolderEmail = document.getElementById('card-holder-email'); - var cardHolderState = document.getElementById('card-holder-state'); - var cardHolderCountry = document.getElementById('card-holder-country'); - var cardButton = document.getElementById('card-button'); - var clientSecret = cardButton.dataset.secret; - cardButton.addEventListener('click', /*#__PURE__*/function () { - var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(e) { - var _yield$stripe$confirm, setupIntent, error; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - if (!(cardHolderPlan.value == '' || cardHolderName.value == '' || cardHolderEmail.value == '' || cardHolderState.value == '' || cardHolderCountry.value == '')) { - _context.next = 3; - break; - } - window.notify.warning('Please complete all fields.'); - return _context.abrupt("return", false); - case 3: - cardButton.disabled = true; - _context.next = 6; - return stripe.confirmCardSetup(clientSecret, { - payment_method: { - card: cardElement, - billing_details: { - name: cardHolderName.value - } - } - }); - case 6: - _yield$stripe$confirm = _context.sent; - setupIntent = _yield$stripe$confirm.setupIntent; - error = _yield$stripe$confirm.error; - if (error) { - window.notify.warning(error.message); - cardButton.disabled = false; - } else { - window.app.pending(); - window.axios.post(route('ajax.billing.subscription.create'), { - plan: cardHolderPlan.value, - name: cardHolderName.value, - email: cardHolderEmail.value, - state: cardHolderState.value, - country: cardHolderCountry.value, - payment_method: setupIntent.payment_method - }).then(function (results) { - window.location = route('user.billing.details'); - })["catch"](function (err) { - window.notify.warning(err.data.data.message); - if (err.data.data.redirect) { - window.location = err.data.data.redirect; - } - }); - } - case 10: - case "end": - return _context.stop(); - } - }, _callee); - })); - return function (_x) { - return _ref.apply(this, arguments); - }; - }()); -} - -/***/ }), - -/***/ "./resources/js/script-components/subscription-payment-method.js": -/*!***********************************************************************!*\ - !*** ./resources/js/script-components/subscription-payment-method.js ***! - \***********************************************************************/ -/***/ (() => { - -function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } -function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; } -function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } -function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } -var paymentMethodForm = document.getElementById('payment-method-form'); -if (paymentMethodForm) { - var _color = !window.matchMedia('(prefers-color-scheme: dark)').matches ? '#111' : '#FFF'; - var stripe = window.Stripe(window.stripe_key); - var elements = stripe.elements(); - var cardElement = elements.create('card', { - style: { - base: { - color: _color - } - }, - hidePostalCode: true - }); - cardElement.mount('#card-element'); - var cardButton = document.getElementById('card-button'); - var clientSecret = cardButton.dataset.secret; - cardButton.addEventListener('click', /*#__PURE__*/function () { - var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(e) { - var _yield$stripe$confirm, setupIntent, error; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - cardButton.disabled = true; - window.app.pending(); - _context.next = 4; - return stripe.confirmCardSetup(clientSecret, { - payment_method: { - card: cardElement - } - }); - case 4: - _yield$stripe$confirm = _context.sent; - setupIntent = _yield$stripe$confirm.setupIntent; - error = _yield$stripe$confirm.error; - if (error) { - window.app.pendingHide(); - window.notify.warning(error.message); - cardButton.disabled = false; - } else { - window.axios.post(route('ajax.billing.subscription.payment-method'), { - payment_method: setupIntent.payment_method - }).then(function (results) { - window.location = route('user.billing.details'); - })["catch"](function (err) { - window.notify.warning(err.data.data.message); - }); - } - case 8: - case "end": - return _context.stop(); - } - }, _callee); - })); - return function (_x) { - return _ref.apply(this, arguments); - }; - }()); -} - -/***/ }), - /***/ "./resources/js/script-components/tooltips.js": /*!****************************************************!*\ !*** ./resources/js/script-components/tooltips.js ***! diff --git a/resources/js/script-components.js b/resources/js/script-components.js index 9be18f5b..1eeac27c 100644 --- a/resources/js/script-components.js +++ b/resources/js/script-components.js @@ -13,6 +13,3 @@ require('./script-components/ajax-forms'); // UI UX level components require('./script-components/tooltips'); require('./script-components/clipboard'); - -require('./script-components/subscription-create'); -require('./script-components/subscription-payment-method'); diff --git a/resources/js/script-components/subscription-create.js b/resources/js/script-components/subscription-create.js deleted file mode 100644 index e15b9a80..00000000 --- a/resources/js/script-components/subscription-create.js +++ /dev/null @@ -1,74 +0,0 @@ -const subscriptionForm = document.getElementById('subscription-form'); - -if (subscriptionForm) { - let _color = (! window.matchMedia('(prefers-color-scheme: dark)').matches) ? '#111' : '#FFF'; - - const stripe = window.Stripe(window.stripe_key); - const elements = stripe.elements(); - const cardElement = elements.create('card', { - style: { base: { color: _color } }, - hidePostalCode: true - }); - - cardElement.mount('#card-element'); - - const cardHolderPlan = document.getElementById('card-holder-plan'); - const cardHolderName = document.getElementById('card-holder-name'); - const cardHolderEmail = document.getElementById('card-holder-email'); - const cardHolderState = document.getElementById('card-holder-state'); - const cardHolderCountry = document.getElementById('card-holder-country'); - const cardButton = document.getElementById('card-button'); - const clientSecret = cardButton.dataset.secret; - - cardButton.addEventListener('click', async (e) => { - if ( - cardHolderPlan.value == '' - || cardHolderName.value == '' - || cardHolderEmail.value == '' - || cardHolderState.value == '' - || cardHolderCountry.value == '' - ) { - window.notify.warning('Please complete all fields.'); - - return false; - } - - cardButton.disabled = true; - - const { setupIntent, error } = await stripe.confirmCardSetup( - clientSecret, { - payment_method: { - card: cardElement, - billing_details: { - name: cardHolderName.value - } - } - } - ); - - if (error) { - window.notify.warning(error.message); - cardButton.disabled = false; - } else { - window.app.pending(); - window.axios.post(route('ajax.billing.subscription.create'), { - plan: cardHolderPlan.value, - name: cardHolderName.value, - email: cardHolderEmail.value, - state: cardHolderState.value, - country: cardHolderCountry.value, - payment_method: setupIntent.payment_method - }) - .then((results) => { - window.location = route('user.billing.details'); - }) - .catch((err) => { - window.notify.warning(err.data.data.message); - - if (err.data.data.redirect) { - window.location = err.data.data.redirect; - } - }); - } - }); -} diff --git a/resources/js/script-components/subscription-payment-method.js b/resources/js/script-components/subscription-payment-method.js deleted file mode 100644 index 15f0d732..00000000 --- a/resources/js/script-components/subscription-payment-method.js +++ /dev/null @@ -1,46 +0,0 @@ -const paymentMethodForm = document.getElementById('payment-method-form'); - -if (paymentMethodForm) { - let _color = (! window.matchMedia('(prefers-color-scheme: dark)').matches) ? '#111' : '#FFF'; - - const stripe = window.Stripe(window.stripe_key); - const elements = stripe.elements(); - const cardElement = elements.create('card', { - style: { base: { color: _color } }, - hidePostalCode: true - }); - - cardElement.mount('#card-element'); - - const cardButton = document.getElementById('card-button'); - const clientSecret = cardButton.dataset.secret; - - cardButton.addEventListener('click', async (e) => { - cardButton.disabled = true; - window.app.pending(); - - const { setupIntent, error } = await stripe.confirmCardSetup( - clientSecret, { - payment_method: { - card: cardElement - } - } - ); - - if (error) { - window.app.pendingHide(); - window.notify.warning(error.message); - cardButton.disabled = false; - } else { - window.axios.post(route('ajax.billing.subscription.payment-method'), { - payment_method: setupIntent.payment_method - }) - .then((results) => { - window.location = route('user.billing.details'); - }) - .catch((err) => { - window.notify.warning(err.data.data.message); - }); - } - }); -} diff --git a/resources/sass/theme/_variables.scss b/resources/sass/theme/_variables.scss index a789bf01..806ae31e 100644 --- a/resources/sass/theme/_variables.scss +++ b/resources/sass/theme/_variables.scss @@ -21,7 +21,7 @@ $black: #000 !default; $blue: #2c3e50 !default; $indigo: #6610f2 !default; -$purple: #6f42c1 !default; +$purple: #9e7ae0 !default; $pink: #e83e8c !default; $red: #e74c3c !default; $orange: #fd7e14 !default; diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index 20715a23..c22139e8 100644 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -29,7 +29,7 @@ @stop @section('content') - + {{-- --}} {{-- --}}
diff --git a/resources/views/layouts/components/app/navbar.blade.php b/resources/views/layouts/components/app/navbar.blade.php index cddb825e..642f6553 100644 --- a/resources/views/layouts/components/app/navbar.blade.php +++ b/resources/views/layouts/components/app/navbar.blade.php @@ -27,8 +27,6 @@ API Tokens Invites Notifications - - Billing @if (auth()->user()->hasRole('admin')) diff --git a/resources/views/user/billing.blade.php b/resources/views/user/billing.blade.php new file mode 100644 index 00000000..fec0fe04 --- /dev/null +++ b/resources/views/user/billing.blade.php @@ -0,0 +1,70 @@ +@extends('layouts.user') + +@section('page-title', 'Billing') + +@section('user_content') +
+
+ @if ($user->hasActiveSubscription()) +
+
+
Current Plan:
+

{{ $user->subscriptionPlan('name') }}

+
Upcoming Payment:
+

{{ $upcomingPayment->total() }} on {{ $upcomingPayment->date()->format('M jS, Y') }}

+
+
+ @endif +
+
+ Billing Information +
+ {!! $form !!} +
+
+
+ @if ($user->hasPaymentMethod()) + @if (! $user->hasActiveSubscription()) +
+
+ {!! $subscribeForm !!} +
+
+ @else +
+
+ {!! $couponForm !!} +
+
+
+
+ {!! $swapForm !!} +
+
+ @endif + @else +
+
+

Please add a Payment Method in your Billing Portal

+
+
+ @endif +
+
+ @if ($user->hasBillingInformation()) +

Please access your billing portal to handle the following:

+
    +
  • Payment methods
  • +
  • Cancel your subscription
  • +
  • Renew your subscription
  • +
  • View subscription invoices
  • +
+ My Billing Portal + @else +

In order to access your billing portal, please update your billing information.

+ @endif +
+
+
+
+@stop diff --git a/resources/views/user/billing/change-plan.blade.php b/resources/views/user/billing/change-plan.blade.php deleted file mode 100644 index 2c43f570..00000000 --- a/resources/views/user/billing/change-plan.blade.php +++ /dev/null @@ -1,33 +0,0 @@ -@extends('layouts.app') - -@section('page-title', 'Change Plan') - -@section('content') - - @include('user.billing.tabs') - -
-
- @include('user.billing.information', ['disabled' => true]) - @include('user.billing.current-plan') -
- -
-
- {!! csrf_field() !!} - @include('user.billing.plans', ['unlabelled' => true]) - -
-
- -
-
-
-
-
- -@stop diff --git a/resources/views/user/billing/coupon.blade.php b/resources/views/user/billing/coupon.blade.php deleted file mode 100644 index f3e9545b..00000000 --- a/resources/views/user/billing/coupon.blade.php +++ /dev/null @@ -1,52 +0,0 @@ -@extends('layouts.app') - -@section('page-title', 'Coupon') - -@section('content') - - @include('user.billing.tabs') - -
-
- @include('user.billing.information', ['disabled' => true]) - @include('user.billing.current-plan') -
-
-
- {!! csrf_field() !!} -
-
-
-
- Coupon Code -
-
-
- -
-
-
-
-
- -
-
- -
-
-
-
-
- -@stop diff --git a/resources/views/user/billing/current-plan.blade.php b/resources/views/user/billing/current-plan.blade.php deleted file mode 100644 index 1251dc78..00000000 --- a/resources/views/user/billing/current-plan.blade.php +++ /dev/null @@ -1,28 +0,0 @@ -
-
-
-
- Current Subscription Plan -
-
-
- - -
-
-
-
-
-
-
- Current Payment Method -
-
-
- - -
-
-
-
-
diff --git a/resources/views/user/billing/details.blade.php b/resources/views/user/billing/details.blade.php deleted file mode 100644 index e65202f4..00000000 --- a/resources/views/user/billing/details.blade.php +++ /dev/null @@ -1,52 +0,0 @@ -@extends('layouts.app') - -@section('page-title', 'Billing') - -@section('content') - - @include('user.billing.tabs') - -
-
- @include('user.billing.information', ['disabled' => true]) - @include('user.billing.current-plan') -
-
-
- @if ($subscription) - @if (! $subscription->cancelled()) -
- @include('user.billing.upcoming-invoice') -
-
- {!! form()->confirm('Are you sure you want to cancel your subscription?', 'app.confirmation') - ->action('post', 'user.subscription.cancel', - 'Cancel Subscription', - ['class' => 'btn btn-outline-danger'] - ) !!} -
- @else -
-
-
- Cancelled Subscription -
-
-
- - - - - -
Ends At{{ $subscription->ends_at->format('F j, Y') }}
-
-
-
-
- @endif - @endif -
-
-
- -@stop diff --git a/resources/views/user/billing/information.blade.php b/resources/views/user/billing/information.blade.php deleted file mode 100644 index be103a58..00000000 --- a/resources/views/user/billing/information.blade.php +++ /dev/null @@ -1,45 +0,0 @@ -
-
-
-
- Billing Information -
-
-
-
-
- - -
-
-
-
-
-
- - -
-
-
-
-
-
- - -
-
-
- {!! - form()->makeField(\Grafite\Forms\Fields\Country::class, 'country', [ - 'id' => 'card-holder-country', - 'required' => true, - 'disabled' => $user->country, - 'value' => $user->country, - ]); - !!} -
-
-
-
-
-
diff --git a/resources/views/user/billing/invoices.blade.php b/resources/views/user/billing/invoices.blade.php deleted file mode 100644 index 8082173e..00000000 --- a/resources/views/user/billing/invoices.blade.php +++ /dev/null @@ -1,41 +0,0 @@ -@extends('layouts.app') - -@section('page-title', 'Invoices') - -@section('content') - - @include('user.billing.tabs') - -
- @if (is_null($invoices)) -
-
- Invoices could not be loaded, please try again later. -
-
- @else - - - - - - - - @foreach($invoices as $invoice) - - - - - - @endforeach - -
DateIdentifierDollars
- - - {{ $invoice->date()->format('Y-m-d') }} - - {{ $invoice->id }}${{ ($invoice->total / 100) }}
- @endif -
- -@stop diff --git a/resources/views/user/billing/payment-method.blade.php b/resources/views/user/billing/payment-method.blade.php deleted file mode 100644 index f7fbac36..00000000 --- a/resources/views/user/billing/payment-method.blade.php +++ /dev/null @@ -1,51 +0,0 @@ -@extends('layouts.app') - -@section('page-title', 'Payment Method') - -@section('content') - - @include('user.billing.tabs') - -
-
- @include('user.billing.information', ['disabled' => true]) - @include('user.billing.current-plan') -
- -
-
-
-
-
- Payment Information -
-
- @if (! is_null($intent)) - -
- @else - Unable to update your Payment Method at this time, please try again later. - @endif -
-
-
-
- - @if (! is_null($intent)) -
-
- -
-
- @endif -
-
- -@stop - -@push('pre-app-js') - - -@endpush diff --git a/resources/views/user/billing/plans.blade.php b/resources/views/user/billing/plans.blade.php deleted file mode 100644 index bfcd7757..00000000 --- a/resources/views/user/billing/plans.blade.php +++ /dev/null @@ -1,22 +0,0 @@ -
-
-
-
- Subscription Plan -
-
- {!! - form()->makeField(\Grafite\Forms\Fields\Select::class, 'plan', [ - 'id' => 'card-holder-plan', - 'label' => (isset($unlabelled)) ? false : 'Plan', - 'required' => true, - 'multiple' => false, - 'title' => 'Select a Plan', - 'value' => auth()->user()->subscription(config('billing.subscription_name'))->stripe_price, - 'options' => collect(config('billing.plans'))->pluck('key', 'label')->toArray(), - ]); - !!} -
-
-
-
diff --git a/resources/views/user/billing/renew.blade.php b/resources/views/user/billing/renew.blade.php deleted file mode 100644 index a38e87bb..00000000 --- a/resources/views/user/billing/renew.blade.php +++ /dev/null @@ -1,54 +0,0 @@ -@extends('layouts.app') - -@section('page-title', 'Billing: Subscribe') - -@section('content') - - @include('user.billing.tabs') - -
-
- @include('user.billing.information') -
- -
- @if (! is_null($intent)) - @include('user.billing.plans') - @endif - -
-
-
-
- Payment Information -
-
- @if (! is_null($intent)) - -
- @else - Unable to renew subscriptions at this time, please try again later. - @endif -
-
-
-
- - @if (! is_null($intent)) -
-
- -
-
- @endif -
-
- -@stop - -@section('pre-app-js') - - -@stop diff --git a/resources/views/user/billing/subscribe.blade.php b/resources/views/user/billing/subscribe.blade.php deleted file mode 100644 index 15d4ee7a..00000000 --- a/resources/views/user/billing/subscribe.blade.php +++ /dev/null @@ -1,51 +0,0 @@ -@extends('layouts.app') - -@section('page-title', 'Billing: Subscribe') - -@section('content') - - @include('user.billing.tabs') - -
-
- @include('user.billing.information') -
- -
- @include('user.billing.plans') - -
-
-
-
- Payment Information -
-
- @if (is_null($intent)) - Unable to process subscriptions, please try again later. - @else - -
- @endif -
-
-
-
- - @if (! is_null($intent)) -
-
- -
-
- @endif -
-
-@stop - -@push('pre-app-js') - - -@endpush diff --git a/resources/views/user/billing/tabs.blade.php b/resources/views/user/billing/tabs.blade.php deleted file mode 100644 index b1159f4e..00000000 --- a/resources/views/user/billing/tabs.blade.php +++ /dev/null @@ -1,26 +0,0 @@ - diff --git a/resources/views/user/billing/upcoming-invoice.blade.php b/resources/views/user/billing/upcoming-invoice.blade.php deleted file mode 100644 index bfeb1ca2..00000000 --- a/resources/views/user/billing/upcoming-invoice.blade.php +++ /dev/null @@ -1,21 +0,0 @@ -
-
- Upcoming Invoice -
-
- @if (!is_null($invoice)) - - - - - - - - - -
DateCost
{{ $invoice->date()->format('F j, Y') }}${{ $invoice->total/100 }}
- @else - Next scheduled payment will appear here, please check again later. - @endif -
-
\ No newline at end of file diff --git a/resources/views/user/nav.blade.php b/resources/views/user/nav.blade.php index 66afee44..8c6b472f 100644 --- a/resources/views/user/nav.blade.php +++ b/resources/views/user/nav.blade.php @@ -11,4 +11,7 @@ + \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 6a546429..15a2fced 100644 --- a/routes/web.php +++ b/routes/web.php @@ -51,11 +51,6 @@ Route::post('accept-cookie-policy', [CookiePolicyController::class, 'accept'])->name('ajax.accept-cookie-policy'); -Route::post( - 'stripe/webhook', - [\App\Http\Controllers\WebhookController::class, 'handleWebhook'] -); - /* |-------------------------------------------------------------------------- | Auth @@ -75,6 +70,8 @@ 'reset' => true, 'confirm' => true, 'verify' => true, + ], [ + 'throttle:5,1', ]); Route::get('recovery', [RecoveryController::class, 'show']) @@ -98,6 +95,10 @@ Route::post('users/return-switch', [UserController::class, 'switchBack'])->name('users.return-switch'); Route::middleware(['verified', 'two-factor'])->group(function () { + Route::get('subscribed', function () { + dd(request()); + }); + /* |-------------------------------------------------------------------------- | Dashboard @@ -152,18 +153,12 @@ }); Route::prefix('billing')->group(function () { - Route::get('subscribe', [BillingController::class, 'subscribe'])->name('user.billing'); - Route::get('renew', [BillingController::class, 'renewSubscription'])->name('user.billing.renew'); - Route::get('details', [BillingController::class, 'getSubscription'])->name('user.billing.details'); + Route::get('', [BillingController::class, 'index'])->name('user.billing'); + Route::post('update', [BillingController::class, 'update'])->name('user.billing.update'); + Route::post('subscribe', [BillingController::class, 'subscribe'])->name('user.billing.subscribe'); Route::group(['gateway' => 'subscribed'], function () { - Route::get('payment-method', [BillingController::class, 'paymentMethod'])->name('user.billing.payment-method'); - Route::get('change-plan', [BillingController::class, 'getChangePlan'])->name('user.billing.change-plan'); - Route::post('swap-plan', [BillingController::class, 'swapPlan'])->name('user.billing.swap-plan'); - Route::post('cancellation', [BillingController::class, 'cancelSubscription'])->name('user.subscription.cancel'); - Route::get('invoices', [BillingController::class, 'getInvoices'])->name('user.billing.invoices'); - Route::get('invoice/{id}', [BillingController::class, 'getInvoiceById'])->name('user.billing.invoice'); - Route::get('coupon', [BillingController::class, 'getCoupon'])->name('user.billing.coupons'); - Route::post('apply-coupon', [BillingController::class, 'applyCoupon'])->name('user.billing.apply-coupon'); + Route::post('swap', [BillingController::class, 'swap'])->name('user.billing.swap'); + Route::post('coupon', [BillingController::class, 'coupon'])->name('user.billing.coupon'); }); }); }); @@ -196,11 +191,6 @@ */ Route::prefix('ajax')->group(function () { - Route::post('subscribe', [SubscriptionController::class, 'createSubscription']) - ->name('ajax.billing.subscription.create'); - Route::post('payment-method', [SubscriptionController::class, 'updatePaymentMethod']) - ->name('ajax.billing.subscription.payment-method'); - Route::post('file-upload', [FileUploadController::class, 'upload'])->name('ajax.files-upload'); Route::post('image-upload', [FileUploadController::class, 'uploadImage'])->name('ajax.image-upload'); }); diff --git a/tests/Feature/Controllers/Ajax/SubscriptionControllerTest.php b/tests/Feature/Controllers/Ajax/SubscriptionControllerTest.php deleted file mode 100644 index e32c08bb..00000000 --- a/tests/Feature/Controllers/Ajax/SubscriptionControllerTest.php +++ /dev/null @@ -1,44 +0,0 @@ -markTestSkipped('Requires Stripe keys'); - - Notification::fake(); - - $response = $this->post(route('ajax.billing.subscription.create'), [ - 'state' => 'Ontario', - 'billing_email' => 'who@areyou.com', - 'country' => 'Canada', - 'plan' => 'plan_FgRNFn5SPrDG6g', - 'payment_method' => 'pm_card_visa', - ]); - - $response->assertSessionHas('message', 'Subscribed to Monthly plan.'); - $response->assertJson(['message' => 'You\'re now subscribed!']); - } - - public function testUpdatePaymentMethod() - { - $this->markTestSkipped('Requires Stripe keys'); - - Notification::fake(); - - $this->user->update([ - 'card_last_four' => 4444, - ]); - - $response = $this->post(route('ajax.billing.subscription.payment-method'), [ - 'payment_method' => 'pm_card_mastercard', - ]); - - $response->assertJson(['message' => 'Card change failed']); - } -} diff --git a/tests/Feature/Controllers/User/BillingControllerTest.php b/tests/Feature/Controllers/User/BillingControllerTest.php index bc588a87..ed1bbc0f 100644 --- a/tests/Feature/Controllers/User/BillingControllerTest.php +++ b/tests/Feature/Controllers/User/BillingControllerTest.php @@ -22,6 +22,8 @@ public function testBillingGetDetails() Subscription::factory()->create([ 'user_id' => $this->user->id, + 'stripe_price' => 'foo_bar_003', + 'quantity' => 1, ]); $this->user->update([ @@ -30,45 +32,7 @@ public function testBillingGetDetails() 'card_last_four' => '4242', ]); - $response = $this->get(route('user.billing.details')); - - $response->assertOk(); - } - - public function testBillingPaymentMethod() - { - $this->markTestSkipped('Requires Stripe keys'); - - Subscription::factory()->create([ - 'user_id' => $this->user->id, - ]); - - $this->user->update([ - 'stripe_id' => 'foo_bar_01', - 'card_brand' => 'visa', - 'card_last_four' => '4242', - ]); - - $response = $this->get(route('user.billing.payment-method')); - - $response->assertOk(); - } - - public function testBillingCoupon() - { - $this->markTestSkipped('Requires Stripe keys'); - - Subscription::factory()->create([ - 'user_id' => $this->user->id, - ]); - - $this->user->update([ - 'stripe_id' => 'foo_bar_01', - 'card_brand' => 'visa', - 'card_last_four' => '4242', - ]); - - $response = $this->get(route('user.billing.coupons')); + $response = $this->get(route('user.billing')); $response->assertOk(); }