1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-12 22:22:32 +01:00

Fixes for merge

This commit is contained in:
David Bomba 2024-01-03 13:24:36 +11:00
commit e78ae16e3c
70 changed files with 561 additions and 19043 deletions

View File

@ -9,7 +9,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\DataMapper\ClientSettings;
use App\Factory\ClientFactory;
@ -251,7 +251,7 @@ class BillingPortalPurchase extends Component
$company = $this->subscription->company;
$user = $this->subscription->user;
$user->setCompany($company);
$client_repo = new ClientRepository(new ClientContactRepository());
$data = [
@ -411,7 +411,7 @@ class BillingPortalPurchase extends Component
'campaign' => $this->campaign,
], now()->addMinutes(60));
$this->emit('beforePaymentEventsCompleted');
$this->dispatch('beforePaymentEventsCompleted');
}
/**
@ -432,7 +432,7 @@ class BillingPortalPurchase extends Component
public function handlePaymentNotRequired()
{
$is_eligible = $this->subscription->service()->isEligible($this->contact);
if ($is_eligible['status_code'] != 200) {
$this->steps['not_eligible'] = true;
$this->steps['not_eligible_message'] = $is_eligible['message'];

View File

@ -9,7 +9,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\DataMapper\ClientSettings;
use App\Factory\ClientFactory;
@ -542,7 +542,7 @@ class BillingPortalPurchasev2 extends Component
'bundle' => $this->bundle,
], now()->addMinutes(60));
$this->emit('beforePaymentEventsCompleted');
$this->dispatch('beforePaymentEventsCompleted');
return $this;
}

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Libraries\MultiDB;
use App\Models\Company;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Libraries\MultiDB;
use App\Models\Client;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Libraries\MultiDB;
use App\Models\Company;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Libraries\MultiDB;
use Livewire\Component;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire\PaymentMethods;
namespace App\Livewire\PaymentMethods;
use App\Libraries\MultiDB;
use Livewire\Component;
@ -46,7 +46,7 @@ class UpdateDefaultMethod extends Component
$this->token->is_default = 1;
$this->token->save();
$this->emit('UpdateDefaultMethod::method-updated');
$this->dispatch('UpdateDefaultMethod::method-updated');
}
public function render()

View File

@ -1,6 +1,6 @@
<?php
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Libraries\MultiDB;
use App\Models\Client;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Libraries\MultiDB;
use App\Models\Company;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Jobs\Invoice\CreateEInvoice;
use App\Libraries\MultiDB;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire\Profile\Settings;
namespace App\Livewire\Profile\Settings;
use Illuminate\Support\Facades\Hash;
use Livewire\Component;

View File

@ -1,6 +1,6 @@
<?php
namespace App\Http\Livewire\Profile\Settings;
namespace App\Livewire\Profile\Settings;
use Livewire\Component;

View File

@ -1,6 +1,6 @@
<?php
namespace App\Http\Livewire\Profile\Settings;
namespace App\Livewire\Profile\Settings;
use Livewire\Component;

View File

@ -1,6 +1,6 @@
<?php
namespace App\Http\Livewire\Profile\Settings;
namespace App\Livewire\Profile\Settings;
use Livewire\Component;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Libraries\MultiDB;
use App\Models\Invoice;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Libraries\MultiDB;
use App\Models\Company;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Libraries\MultiDB;
use App\Models\RecurringInvoice;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire\RecurringInvoices;
namespace App\Livewire\RecurringInvoices;
use App\Models\Invoice;
use Livewire\Component;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Libraries\MultiDB;
use App\Models\RecurringInvoice;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Libraries\MultiDB;
use App\Models\ClientContact;
@ -190,9 +190,10 @@ class RequiredClientInfo extends Component
}
if ($this->updateClientDetails($data)) {
$this->emit('passed-required-fields-check', [
'client_postal_code' => $this->contact->client->postal_code,
]);
$this->dispatch(
'passed-required-fields-check',
client_postal_code: $this->contact->client->postal_code
);
//if stripe is enabled, we want to update the customer at this point.
@ -258,7 +259,6 @@ class RequiredClientInfo extends Component
}
if (Str::startsWith($field['name'], 'contact_')) {
if (empty($this->contact->{$_field}) || is_null($this->contact->{$_field}) || str_contains($this->contact->{$_field}, '@example.com')) {
$this->show_form = true;
} else {
@ -289,14 +289,15 @@ class RequiredClientInfo extends Component
public function handleCopyBilling(): void
{
$this->emit('update-shipping-data', [
'client_shipping_address_line_1' => $this->contact->client->address1,
'client_shipping_address_line_2' => $this->contact->client->address2,
'client_shipping_city' => $this->contact->client->city,
'client_shipping_state' => $this->contact->client->state,
'client_shipping_postal_code' => $this->contact->client->postal_code,
'client_shipping_country_id' => $this->contact->client->country_id,
]);
$this->dispatch(
'update-shipping-data',
client_shipping_address_line_1: $this->contact->client->address1,
client_shipping_address_line_2: $this->contact->client->address2,
client_shipping_city: $this->contact->client->city,
client_shipping_state: $this->contact->client->state,
client_shipping_postal_code: $this->contact->client->postal_code,
client_shipping_country_id: $this->contact->client->country_id,
);
}
public function render()

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Libraries\MultiDB;
use App\Models\ClientContact;
@ -122,7 +122,7 @@ class SubscriptionPlanSwitch extends Component
$this->handlePaymentNotRequired();
}
$this->emit('beforePaymentEventsCompleted');
$this->dispatch('beforePaymentEventsCompleted');
}
/**
@ -153,7 +153,7 @@ class SubscriptionPlanSwitch extends Component
$this->hide_button = true;
$this->dispatchBrowserEvent('redirectRoute', ['route' => $response]);
$this->dispatch('redirectRoute', ['route' => $response]);
// return redirect($response);
}

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Libraries\MultiDB;
use App\Models\RecurringInvoice;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Libraries\MultiDB;
use App\Models\RecurringInvoice;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\Libraries\MultiDB;
use App\Models\Task;

View File

@ -10,7 +10,7 @@
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Livewire;
namespace App\Livewire;
use App\DataMapper\FeesAndLimits;
use App\Factory\CompanyGatewayFactory;

View File

@ -35,7 +35,7 @@ class StaticModel extends Model
{
use MakesHash;
use Excludable;
protected $casts = [
'updated_at' => 'timestamp',
'created_at' => 'timestamp',

View File

@ -11,23 +11,24 @@
namespace App\Providers;
use App\Helpers\Mail\GmailTransport;
use App\Helpers\Mail\Office365MailTransport;
use App\Http\Middleware\SetDomainNameDb;
use App\Utils\Ninja;
use Livewire\Livewire;
use App\Models\Invoice;
use App\Models\Proposal;
use App\Utils\Ninja;
use App\Utils\TruthSource;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Mail\Mailer;
use Illuminate\Queue\Events\JobProcessing;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Blade;
use App\Helpers\Mail\GmailTransport;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\Queue;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
use Livewire\Livewire;
use App\Http\Middleware\SetDomainNameDb;
use Illuminate\Queue\Events\JobProcessing;
use App\Helpers\Mail\Office365MailTransport;
use Illuminate\Database\Eloquent\Relations\Relation;
class AppServiceProvider extends ServiceProvider
{
@ -72,6 +73,12 @@ class AppServiceProvider extends ServiceProvider
]);
}
Livewire::setUpdateRoute(function ($handle) {
return Route::post('/livewire/update', $handle)
->middleware('client');
});
/* Ensure we don't have stale state in jobs */
Queue::before(function (JobProcessing $event) {
App::forgetInstance('truthsource');
@ -96,11 +103,11 @@ class AppServiceProvider extends ServiceProvider
'transport' => 'postmark',
'token' => $postmark_key
]));
return $this;
});
Mailer::macro('mailgun_config', function (string $secret, string $domain, string $endpoint = 'api.mailgun.net') {
// @phpstan-ignore /** @phpstan-ignore-next-line **/
Mailer::setSymfonyTransport(app('mail.manager')->createSymfonyTransport([
@ -110,7 +117,7 @@ class AppServiceProvider extends ServiceProvider
'endpoint' => $endpoint,
'scheme' => config('services.mailgun.scheme'),
]));
return $this;
});

View File

@ -68,7 +68,7 @@
"league/flysystem-aws-s3-v3": "^3.0",
"league/fractal": "^0.20.0",
"league/omnipay": "^3.1",
"livewire/livewire": "^2.10",
"livewire/livewire": "^3.0",
"microsoft/microsoft-graph": "^1.69",
"mollie/mollie-api-php": "^2.36",
"nelexa/zip": "^4.0",

18737
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -3,156 +3,157 @@
return [
/*
|--------------------------------------------------------------------------
|---------------------------------------------------------------------------
| Class Namespace
|--------------------------------------------------------------------------
|---------------------------------------------------------------------------
|
| This value sets the root namespace for Livewire component classes in
| your application. This value affects component auto-discovery and
| any Livewire file helper commands, like `artisan make:livewire`.
|
| After changing this item, run: `php artisan livewire:discover`.
| This value sets the root class namespace for Livewire component classes in
| your application. This value will change where component auto-discovery
| finds components. It's also referenced by the file creation commands.
|
*/
'class_namespace' => 'App\\Http\\Livewire',
'class_namespace' => 'App\\Livewire',
/*
|--------------------------------------------------------------------------
|---------------------------------------------------------------------------
| View Path
|--------------------------------------------------------------------------
|---------------------------------------------------------------------------
|
| This value sets the path for Livewire component views. This affects
| file manipulation helper commands like `artisan make:livewire`.
| This value is used to specify where Livewire component Blade templates are
| stored when running file creation commands like `artisan make:livewire`.
| It is also used if you choose to omit a component's render() method.
|
*/
'view_path' => resource_path('views/livewire'),
/*
|--------------------------------------------------------------------------
|---------------------------------------------------------------------------
| Layout
|--------------------------------------------------------------------------
| The default layout view that will be used when rendering a component via
| Route::get('/some-endpoint', SomeComponent::class);. In this case the
| the view returned by SomeComponent will be wrapped in "layouts.app"
|---------------------------------------------------------------------------
| The view that will be used as the layout when rendering a single component
| as an entire page via `Route::get('/post/create', CreatePost::class);`.
| In this case, the view returned by CreatePost will render into $slot.
|
*/
'layout' => 'layouts.app',
/*
|--------------------------------------------------------------------------
| Livewire Assets URL
|--------------------------------------------------------------------------
|
| This value sets the path to Livewire JavaScript assets, for cases where
| your app's domain root is not the correct path. By default, Livewire
| will load its JavaScript assets from the app's "relative root".
|
| Examples: "/assets", "myurl.com/app".
|---------------------------------------------------------------------------
| Lazy Loading Placeholder
|---------------------------------------------------------------------------
| Livewire allows you to lazy load components that would otherwise slow down
| the initial page load. Every component can have a custom placeholder or
| you can define the default placeholder view for all components below.
|
*/
'asset_url' => null,
'lazy_placeholder' => null,
/*
|--------------------------------------------------------------------------
| Livewire App URL
|--------------------------------------------------------------------------
|
| This value should be used if livewire assets are served from CDN.
| Livewire will communicate with an app through this url.
|
| Examples: "https://my-app.com", "myurl.com/app".
|
*/
'app_url' => null,
/*
|--------------------------------------------------------------------------
| Livewire Endpoint Middleware Group
|--------------------------------------------------------------------------
|
| This value sets the middleware group that will be applied to the main
| Livewire "message" endpoint (the endpoint that gets hit everytime
| a Livewire component updates). It is set to "web" by default.
|
*/
'middleware_group' => 'web',
/*
|--------------------------------------------------------------------------
| Livewire Temporary File Uploads Endpoint Configuration
|--------------------------------------------------------------------------
|---------------------------------------------------------------------------
| Temporary File Uploads
|---------------------------------------------------------------------------
|
| Livewire handles file uploads by storing uploads in a temporary directory
| before the file is validated and stored permanently. All file uploads
| are directed to a global endpoint for temporary storage. The config
| items below are used for customizing the way the endpoint works.
| before the file is stored permanently. All file uploads are directed to
| a global endpoint for temporary storage. You may configure this below:
|
*/
'temporary_file_upload' => [
'disk' => null, // Example: 'local', 's3' Default: 'default'
'rules' => null, // Example: ['file', 'mimes:png,jpg'] Default: ['required', 'file', 'max:12288'] (12MB)
'directory' => null, // Example: 'tmp' Default 'livewire-tmp'
'middleware' => null, // Example: 'throttle:5,1' Default: 'throttle:60,1'
'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs.
'disk' => null, // Example: 'local', 's3' | Default: 'default'
'rules' => null, // Example: ['file', 'mimes:png,jpg'] | Default: ['required', 'file', 'max:12288'] (12MB)
'directory' => null, // Example: 'tmp' | Default: 'livewire-tmp'
'middleware' => null, // Example: 'throttle:5,1' | Default: 'throttle:60,1'
'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs...
'png', 'gif', 'bmp', 'svg', 'wav', 'mp4',
'mov', 'avi', 'wmv', 'mp3', 'm4a',
'jpg', 'jpeg', 'mpga', 'webp', 'wma',
],
'max_upload_time' => 5, // Max duration (in minutes) before an upload gets invalidated.
'max_upload_time' => 5, // Max duration (in minutes) before an upload is invalidated...
],
/*
|--------------------------------------------------------------------------
| Manifest File Path
|--------------------------------------------------------------------------
|
| This value sets the path to the Livewire manifest file.
| The default should work for most cases (which is
| "<app_root>/bootstrap/cache/livewire-components.php"), but for specific
| cases like when hosting on Laravel Vapor, it could be set to a different value.
|
| Example: for Laravel Vapor, it would be "/tmp/storage/bootstrap/cache/livewire-components.php".
|
*/
'manifest_path' => null,
/*
|--------------------------------------------------------------------------
| Back Button Cache
|--------------------------------------------------------------------------
|
| This value determines whether the back button cache will be used on pages
| that contain Livewire. By disabling back button cache, it ensures that
| the back button shows the correct state of components, instead of
| potentially stale, cached data.
|
| Setting it to "false" (default) will disable back button cache.
|
*/
'back_button_cache' => false,
/*
|--------------------------------------------------------------------------
|---------------------------------------------------------------------------
| Render On Redirect
|--------------------------------------------------------------------------
|---------------------------------------------------------------------------
|
| This value determines whether Livewire will render before it's redirected
| or not. Setting it to "false" (default) will mean the render method is
| skipped when redirecting. And "true" will mean the render method is
| run before redirecting. Browsers bfcache can store a potentially
| stale view if render is skipped on redirect.
| This value determines if Livewire will run a component's `render()` method
| after a redirect has been triggered using something like `redirect(...)`
| Setting this to true will render the view once more before redirecting
|
*/
'render_on_redirect' => false,
/*
|---------------------------------------------------------------------------
| Eloquent Model Binding
|---------------------------------------------------------------------------
|
| Previous versions of Livewire supported binding directly to eloquent model
| properties using wire:model by default. However, this behavior has been
| deemed too "magical" and has therefore been put under a feature flag.
|
*/
'legacy_model_binding' => true,
/*
|---------------------------------------------------------------------------
| Auto-inject Frontend Assets
|---------------------------------------------------------------------------
|
| By default, Livewire automatically injects its JavaScript and CSS into the
| <head> and <body> of pages containing Livewire components. By disabling
| this behavior, you need to use @livewireStyles and @livewireScripts.
|
*/
'inject_assets' => true,
/*
|---------------------------------------------------------------------------
| Navigate (SPA mode)
|---------------------------------------------------------------------------
|
| By adding `wire:navigate` to links in your Livewire application, Livewire
| will prevent the default link handling and instead request those pages
| via AJAX, creating an SPA-like effect. Configure this behavior here.
|
*/
'navigate' => [
'show_progress_bar' => true,
'progress_bar_color' => '#2299dd',
],
/*
|---------------------------------------------------------------------------
| HTML Morph Markers
|---------------------------------------------------------------------------
|
| Livewire intelligently "morphs" existing HTML into the newly rendered HTML
| after each update. To make this process more reliable, Livewire injects
| "markers" into the rendered Blade surrounding @if, @class & @foreach.
|
*/
'inject_morph_markers' => true,
/*
|---------------------------------------------------------------------------
| Pagination Theme
|---------------------------------------------------------------------------
|
| When enabling Livewire's pagination feature by using the `WithPagination`
| trait, Livewire will use Tailwind templates to render pagination views
| on the page. If you want Bootstrap CSS, you can specify: "bootstrap"
|
*/
'pagination_theme' => 'tailwind',
];

View File

@ -49,7 +49,6 @@
<!-- Scripts -->
@vite('resources/js/app.js')
<script src="{{ asset('vendor/alpinejs@2.8.2/alpine.js') }}" defer></script>
<!-- Fonts -->
{{-- <link rel="dns-prefetch" href="https://fonts.gstatic.com"> --}}

View File

@ -19,7 +19,7 @@
<h1 class="text-center text-3xl mt-8">{{ ctrans('texts.register') }}</h1>
<p class="block text-center text-gray-600">{{ ctrans('texts.register_label') }}</p>
<form id="register-form" action="{{ route('client.register', request()->route('company_key')) }}" method="POST" x-data="{more: false, busy: false, isSubmitted: false}" x-on:submit="isSubmitted = true">
<form id="register-form" action="{{ route('client.register', request()->route('company_key')) }}" method="POST" x-data="{more: false, busy: false, isSubmitted: false}" x-on:submit="busy = true; isSubmitted = true">
@if($register_company)
<input type="hidden" name="company_key" value="{{ $register_company->company_key }}">
@endif
@ -32,8 +32,8 @@
@if($field['visible'])
<div class="col-span-12 md:col-span-6">
<section class="flex items-center">
<label
for="{{ $field['key'] }}"
<label
for="{{ $field['key'] }}"
class="input-label">
@if(in_array($field['key'], ['custom_value1','custom_value2','custom_value3','custom_value4']))
{{ (new App\Utils\Helpers())->makeCustomField($register_company->custom_fields, str_replace("custom_value","client", $field['key']))}}
@ -41,29 +41,29 @@
{{ ctrans("texts.{$field['key']}") }}
@endif
</label>
@if($field['required'])
<section class="text-red-400 ml-1 text-sm">*</section>
@endif
</section>
@if($field['key'] === 'email')
<input
id="{{ $field['key'] }}"
class="input w-full"
<input
id="{{ $field['key'] }}"
class="input w-full"
type="email"
name="{{ $field['key'] }}"
value="{{ old($field['key']) }}"
/>
@elseif($field['key'] === 'password')
<input
id="{{ $field['key'] }}"
class="input w-full"
<input
id="{{ $field['key'] }}"
class="input w-full"
type="password"
name="{{ $field['key'] }}"
/>
@elseif($field['key'] === 'currency_id')
<select
<select
id="currency_id"
class="input w-full form-select bg-white"
name="currency_id">
@ -75,7 +75,7 @@
@endforeach
</select>
@elseif($field['key'] === 'country_id')
<select
<select
id="shipping_country"
class="input w-full form-select bg-white"
name="country_id">
@ -89,9 +89,9 @@
@endforeach
</select>
@else
<input
id="{{ $field['key'] }}"
class="input w-full"
<input
id="{{ $field['key'] }}"
class="input w-full"
name="{{ $field['key'] }}"
value="{{ old($field['key']) }}"
/>
@ -104,24 +104,24 @@
@enderror
</div>
@if($field['key'] === 'password')
@if($field['key'] === 'password')
<div class="col-span-12 md:col-span-6">
<section class="flex items-center">
<label
for="password_confirmation"
<label
for="password_confirmation"
class="input-label">
{{ ctrans('texts.password_confirmation') }}
</label>
@if($field['required'])
<section class="text-red-400 ml-1 text-sm">*</section>
@endif
</section>
<input
id="password_confirmation"
type="password"
class="input w-full"
<input
id="password_confirmation"
type="password"
class="input w-full"
name="password_confirmation"
/>
</div>
@ -132,7 +132,7 @@
</div>
<div class="flex justify-between items-center mt-8">
<a href="{{route('client.login')}}" class="button button-info bg-green-600 text-white">{{ ctrans('texts.login_label') }}</a>
<span class="inline-flex items-center" x-data="{ terms_of_service: false, privacy_policy: false }">
@ -151,8 +151,8 @@
@enderror
</span>
</span>
<button class="button button-primary bg-blue-600" :disabled={{ $submitsForm == 'true' ? 'isSubmitted' : 'busy'}} x-on:click="busy = true">
<button class="button button-primary bg-blue-600" :disabled={{ $submitsForm == 'true' ? 'isSubmitted' : 'busy'}}>
{{ ctrans('texts.register')}}
</button>

View File

@ -11,7 +11,7 @@
<div class="relative inline-block text-left" x-data="{ open: false }">
<div>
<span class="rounded shadow-sm">
<button x-on:click="open = !open" x-on:click.away="open = false" type="button" class="inline-flex justify-center w-full rounded-md border border-gray-300 px-4 py-2 bg-white text-sm leading-5 font-medium text-gray-700 hover:text-gray-500 focus:outline-none focus:border-blue-300 focus:ring-blue active:bg-gray-50 active:text-gray-800 transition ease-in-out duration-150">
<button x-on:click="open = !open" x-on:click.outside="open = false" type="button" class="inline-flex justify-center w-full rounded-md border border-gray-300 px-4 py-2 bg-white text-sm leading-5 font-medium text-gray-700 hover:text-gray-500 focus:outline-none focus:border-blue-300 focus:ring-blue active:bg-gray-50 active:text-gray-800 transition ease-in-out duration-150">
<span class="hidden md:block mr-1">{{ auth()->guard('contact')->user()->company->present()->name }}</span>
<svg class="md:-mr-1 md:ml-2 h-5 w-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd" />
@ -33,7 +33,7 @@
</div>
</div>
@endif
<div @click.away="open = false" class="ml-3 relative" x-data="{ open: false }">
<div @click.outside="open = false" class="ml-3 relative" x-data="{ open: false }">
<div>
<button data-ref="client-profile-dropdown" @click="open = !open"
class="max-w-xs flex items-center text-sm rounded-full focus:outline-none focus:ring">

View File

@ -7,8 +7,7 @@
<div class="flex-1 px-3 md:px-8 flex justify-between items-center">
<span class="text-xl text-gray-900" data-ref="meta-title">@yield('meta_title')</span>
<div class="flex items-center md:ml-6 md:mr-2">
<div @click.away="open = false" class="ml-3 relative" x-data="{ open: false }">
<div @click.outside="open = false" class="ml-3 relative" x-data="{ open: false }">
<div>
<button data-ref="client-profile-dropdown" @click="open = !open"
class="max-w-xs flex items-center text-sm rounded-full focus:outline-none focus:ring">

View File

@ -161,14 +161,14 @@
@endif
</div>
@elseif(!$steps['payment_required'])
<form wire:submit.prevent="handlePaymentNotRequired" class="mt-8">
<form wire:submit="handlePaymentNotRequired" class="mt-8">
@csrf
<button class="px-3 py-2 border rounded mr-4 hover:border-blue-600">
{{ ctrans('texts.click_to_continue') }}
</button>
</form>
@elseif($steps['show_start_trial'])
<form wire:submit.prevent="handleTrial" class="mt-8">
<form wire:submit="handleTrial" class="mt-8">
@csrf
<button class="px-3 py-2 border rounded mr-4 hover:border-blue-600">
{{ ctrans('texts.trial_call_to_action') }}
@ -176,12 +176,12 @@
</form>
@else
<form wire:submit.prevent="authenticate" class="mt-8">
<form wire:submit="authenticate" class="mt-8">
@csrf
<label for="email_address">
<span class="input-label">{{ ctrans('texts.email_address') }}</span>
<input wire:model.defer="email" type="email" class="input w-full"/>
<input wire:model="email" type="email" class="input w-full"/>
@error('email')
<p class="validation validation-fail block w-full" role="alert">
@ -193,7 +193,7 @@
@if($steps['existing_user'])
<label for="password" class="block mt-2">
<span class="input-label">{{ ctrans('texts.password') }}</span>
<input wire:model.defer="password" type="password" class="input w-full" autofocus/>
<input wire:model="password" type="password" class="input w-full" autofocus/>
@error('password')
<p class="validation validation-fail block w-full" role="alert">
@ -229,11 +229,11 @@
</div>
</div>
<form wire:submit.prevent="handleCoupon" class="flex items-center mt-4">
<form wire:submit="handleCoupon" class="flex items-center mt-4">
@csrf
<label class="w-full mr-2">
<input type="text" wire:model.defer="coupon" class="input w-full m-0"/>
<input type="text" wire:model="coupon" class="input w-full m-0"/>
</label>
<button class="button button-primary bg-primary">{{ ctrans('texts.apply') }}</button>

View File

@ -30,7 +30,7 @@
</div>
@endif
<form wire:submit.prevent="submit">
<form wire:submit="submit">
<!-- Recurring Plan Products-->
<ul role="list" class="-my-6 divide-y divide-gray-200">
@if(!empty($subscription->recurring_product_ids))
@ -62,7 +62,7 @@
@else
<p class="text-sm font-light text-gray-700 text-right mr-2 mt-2">{{ ctrans('texts.qty') }}</p>
@endif
<select wire:model.debounce.300ms="data.{{ $index }}.recurring_qty" class="rounded-md border-gray-300 shadow-sm sm:text-sm"
<select wire:model.live.debounce.300ms="data.{{ $index }}.recurring_qty" class="rounded-md border-gray-300 shadow-sm sm:text-sm"
@if($subscription->use_inventory_management && $product->in_stock_quantity == 0)
disabled
@endif
@ -164,7 +164,7 @@
@else
<p class="text-sm font-light text-gray-700 text-right mr-2 mt-2">{{ ctrans('texts.qty') }}</p>
@endif
<select wire:model.debounce.300ms="data.{{ $index }}.optional_recurring_qty" class="rounded-md border-gray-300 shadow-sm sm:text-sm"
<select wire:model.live.debounce.300ms="data.{{ $index }}.optional_recurring_qty" class="rounded-md border-gray-300 shadow-sm sm:text-sm"
@if($subscription->use_inventory_management && $product->in_stock_quantity == 0)
disabled
@endif
@ -210,7 +210,7 @@
@else
<p class="text-sm font-light text-gray-700 text-right mr-2 mt-2">{{ ctrans('texts.qty') }}</p>
@endif
<select wire:model.debounce.300ms="data.{{ $index }}.optional_qty" class="rounded-md border-gray-300 shadow-sm sm:text-sm">
<select wire:model.live.debounce.300ms="data.{{ $index }}.optional_qty" class="rounded-md border-gray-300 shadow-sm sm:text-sm">
<option value="0" selected="selected">0</option>
@for ($i = 1; $i <= ($subscription->use_inventory_management ? min($product->in_stock_quantity, min(100,$product->max_quantity)) : min(100,$product->max_quantity)); $i++)
<option value="{{$i}}">{{$i}}</option>
@ -250,7 +250,7 @@
@endforeach
@if(!empty($subscription->promo_code) && !$subscription->trial_enabled)
<form wire:submit.prevent="handleCoupon" class="">
<form wire:submit="handleCoupon" class="">
@csrf
<div class="mt-4">
<label for="coupon" class="block text-sm font-medium text-white">{{ ctrans('texts.promo_code') }}</label>
@ -258,7 +258,7 @@
<div class="relative flex flex-grow items-stretch focus-within:z-10">
<div class="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3">
</div>
<input type="text" wire:model.defer="coupon" class="block w-full rounded-none rounded-l-md border-gray-300 pl-2 focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm text-gray-700" placeholder="">
<input type="text" wire:model="coupon" class="block w-full rounded-none rounded-l-md border-gray-300 pl-2 focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm text-gray-700" placeholder="">
</div>
<button class="relative -ml-px inline-flex items-center space-x-2 rounded-r-md border border-gray-300 bg-gray-50 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-100 focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500">
@ -305,7 +305,7 @@
<span>{{ $total }}</span>
</div>
<div class="mx-auto text-center mt-20 content-center" x-data="{open: @entangle('payment_started'), toggle: @entangle('payment_confirmed'), buttonDisabled: false}" x-show.important="open" x-transition>
<div class="mx-auto text-center mt-20 content-center" x-data="{open: @entangle('payment_started').live, toggle: @entangle('payment_confirmed').live, buttonDisabled: false}" x-show.important="open" x-transition>
<h2 class="text-2xl font-bold tracking-wide border-b-2 pb-4">{{ $heading_text ?? ctrans('texts.checkout') }}</h2>
@if (session()->has('message'))
@component('portal.ninja2020.components.message')
@ -313,7 +313,7 @@
@endcomponent
@endif
@if($subscription->trial_enabled)
<form wire:submit.prevent="handleTrial" class="mt-8">
<form wire:submit="handleTrial" class="mt-8">
@csrf
<button class="relative -ml-px inline-flex items-center space-x-2 rounded border border-gray-300 bg-gray-50 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-100 focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500">
{{ ctrans('texts.trial_call_to_action') }}
@ -331,7 +331,7 @@
@endforeach
</div>
@elseif(intval($float_amount_total) == 0)
<form wire:submit.prevent="handlePaymentNotRequired" class="mt-8">
<form wire:submit="handlePaymentNotRequired" class="mt-8">
@csrf
<button class="relative -ml-px inline-flex items-center space-x-2 rounded border border-gray-300 bg-gray-50 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-100 focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500">
{{ ctrans('texts.click_to_continue') }}
@ -358,7 +358,7 @@
</div>
@if(!$email || $errors->has('email'))
<form wire:submit.prevent="handleEmail" class="">
<form wire:submit="handleEmail" class="">
@csrf
<div class="mt-4">
<label for="email" class="block text-sm font-medium text-white">{{ ctrans('texts.email') }}</label>
@ -366,7 +366,7 @@
<div class="relative flex flex-grow items-stretch focus-within:z-10">
<div class="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3">
</div>
<input type="text" wire:model.defer="email" class="block w-full rounded-none rounded-l-md border-gray-300 pl-2 focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm text-gray-700" placeholder="">
<input type="text" wire:model="email" class="block w-full rounded-none rounded-l-md border-gray-300 pl-2 focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm text-gray-700" placeholder="">
</div>
<button class="relative -ml-px inline-flex items-center space-x-2 rounded-r-md border border-gray-300 bg-gray-50 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-100 focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500">
@ -388,7 +388,7 @@
<p class="w-full p-2">{{ ctrans('texts.otp_code_message', ['email' => $email])}}</p>
</div>
<div class="pb-6 px-6 w-80 mx-auto text-center">
<form wire:submit.prevent="handleLogin" class="" x-data="otpForm()">
<form wire:submit="handleLogin" class="" x-data="otpForm()">
<p class="mb-4"></p>
<div class="flex justify-between">
<template x-for="(input, index) in length" :key="index">

View File

@ -2,7 +2,7 @@
<div class="flex items-center justify-between">
<div class="flex items-center">
<span class="mr-2 text-sm hidden md:block">{{ ctrans('texts.per_page') }}</span>
<select wire:model="per_page" class="form-select py-1 text-sm">
<select wire:model.live="per_page" class="form-select py-1 text-sm">
<option>5</option>
<option selected>10</option>
<option>15</option>

View File

@ -52,7 +52,7 @@
<div class="flex items-center justify-between mt-6">
<div class="flex items-center">
<span class="mr-2 text-sm hidden md:block">{{ ctrans('texts.per_page') }}</span>
<select wire:model="per_page" class="form-select py-1 text-sm">
<select wire:model.live="per_page" class="form-select py-1 text-sm">
<option>5</option>
<option selected>10</option>
<option>15</option>

View File

@ -2,7 +2,7 @@
<div class="flex items-center justify-between">
<div class="flex items-center">
<span class="hidden mr-2 text-sm md:block">{{ ctrans('texts.per_page') }}</span>
<select wire:model="per_page" class="py-1 text-sm form-select">
<select wire:model.live="per_page" class="py-1 text-sm form-select">
<option>5</option>
<option selected>10</option>
<option>15</option>
@ -11,15 +11,15 @@
</div>
<div class="flex items-center">
<div class="mr-3">
<input wire:model="status" value="paid" type="checkbox" class="cursor-pointer form-checkbox" id="paid-checkbox">
<input wire:model.live="status" value="paid" type="checkbox" class="cursor-pointer form-checkbox" id="paid-checkbox">
<label for="paid-checkbox" class="text-sm cursor-pointer">{{ ctrans('texts.status_paid') }}</label>
</div>
<div class="mr-3">
<input wire:model="status" value="unpaid" type="checkbox" class="cursor-pointer form-checkbox" id="unpaid-checkbox">
<input wire:model.live="status" value="unpaid" type="checkbox" class="cursor-pointer form-checkbox" id="unpaid-checkbox">
<label for="unpaid-checkbox" class="text-sm cursor-pointer">{{ ctrans('texts.status_unpaid') }}</label>
</div>
<div class="mr-3">
<input wire:model="status" value="overdue" type="checkbox" class="cursor-pointer form-checkbox" id="overdue-checkbox">
<input wire:model.live="status" value="overdue" type="checkbox" class="cursor-pointer form-checkbox" id="overdue-checkbox">
<label for="overdue-checkbox" class="text-sm cursor-pointer">{{ ctrans('texts.past_due') }}</label>
</div>
</div>

View File

@ -1,6 +1,6 @@
<div>
@unless(count($methods) == 0)
<div x-data="{ open: false }" @keydown.window.escape="open = false" @click.away="open = false"
<div x-data="{ open: false }" @keydown.window.escape="open = false" @click.outside="open = false"
class="relative inline-block text-left" dusk="payment-methods-dropdown">
<div>
<div class="rounded-md shadow-sm">
@ -20,7 +20,7 @@
<div class="py-1">
@foreach($methods as $index => $method)
@if($method['label'] == 'Custom')
<a href="#" @click="{ open = false }" dusk="pay-with-custom"
<a href="#" @click="open = false" dusk="pay-with-custom"
data-company-gateway-id="{{ $method['company_gateway_id'] }}"
data-gateway-type-id="{{ $method['gateway_type_id'] }}"
class="block px-4 py-2 text-sm leading-5 text-gray-700 dropdown-gateway-button hover:bg-gray-100 hover:text-gray-900 focus:outline-none focus:bg-gray-100 focus:text-gray-900"
@ -28,7 +28,7 @@
{{ \App\Models\CompanyGateway::find($method['company_gateway_id'])->firstOrFail()->getConfigField('name') }}
</a>
@elseif($total > 0)
<a href="#" @click="{ open = false }" dusk="pay-with-{{ $index }}"
<a href="#" @click="open = false" dusk="pay-with-{{ $index }}"
data-company-gateway-id="{{ $method['company_gateway_id'] }}"
data-gateway-type-id="{{ $method['gateway_type_id'] }}"
class="block px-4 py-2 text-sm leading-5 text-gray-700 dropdown-gateway-button hover:bg-gray-100 hover:text-gray-900 focus:outline-none focus:bg-gray-100 focus:text-gray-900"

View File

@ -2,7 +2,7 @@
<div class="flex items-center justify-between">
<div class="flex items-center">
<span class="mr-2 text-sm hidden md:block">{{ ctrans('texts.per_page') }}</span>
<select wire:model="per_page" class="form-select py-1 text-sm">
<select wire:model.live="per_page" class="form-select py-1 text-sm">
<option>5</option>
<option selected>10</option>
<option>15</option>

View File

@ -2,7 +2,7 @@
<div class="flex items-center justify-between">
<div class="flex items-center">
<span class="mr-2 text-sm hidden md:block">{{ ctrans('texts.per_page') }}</span>
<select wire:model="per_page" class="form-select py-1 text-sm">
<select wire:model.live="per_page" class="form-select py-1 text-sm">
<option>5</option>
<option selected>10</option>
<option>15</option>

View File

@ -2,7 +2,7 @@
<div class="flex items-center justify-between">
<div class="flex items-center">
<span class="hidden mr-2 text-sm md:block">{{ ctrans('texts.per_page') }}</span>
<select wire:model="per_page" class="py-1 text-sm form-select">
<select wire:model.live="per_page" class="py-1 text-sm form-select">
<option>5</option>
<option selected>10</option>
<option>15</option>
@ -11,11 +11,11 @@
</div>
<div class="flex items-center">
<div class="mr-3">
<input wire:model="status" value="sent" type="checkbox" class="cursor-pointer form-checkbox" id="paid-checkbox">
<input wire:model.live="status" value="sent" type="checkbox" class="cursor-pointer form-checkbox" id="paid-checkbox">
<label for="paid-checkbox" class="text-sm cursor-pointer">{{ ctrans('texts.status_sent') }}</label>
</div>
<div class="mr-3">
<input wire:model="status" value="accepted" type="checkbox" class="cursor-pointer form-checkbox" id="unpaid-checkbox">
<input wire:model.live="status" value="accepted" type="checkbox" class="cursor-pointer form-checkbox" id="unpaid-checkbox">
<label for="unpaid-checkbox" class="text-sm cursor-pointer">{{ ctrans('texts.accepted') }}</label>
</div>
</div>

View File

@ -2,7 +2,7 @@
<div class="flex items-center justify-between">
<div class="flex items-center">
<span class="hidden mr-2 text-sm md:block">{{ ctrans('texts.per_page') }}</span>
<select wire:model="per_page" class="py-1 text-sm form-select">
<select wire:model.live="per_page" class="py-1 text-sm form-select">
<option>5</option>
<option selected>10</option>
<option>15</option>
@ -11,15 +11,15 @@
</div>
<div class="flex items-center">
<div class="mr-3">
<input wire:model="status" value="{{ App\Models\Quote::STATUS_SENT }}" value="sent" type="checkbox" class="cursor-pointer form-checkbox" id="sent-checkbox">
<input wire:model.live="status" value="{{ App\Models\Quote::STATUS_SENT }}" value="sent" type="checkbox" class="cursor-pointer form-checkbox" id="sent-checkbox">
<label for="sent-checkbox" class="text-sm cursor-pointer">{{ ctrans('texts.status_pending') }}</label>
</div>
<div class="mr-3">
<input wire:model="status" value="{{ App\Models\Quote::STATUS_APPROVED }}" value="approved" type="checkbox" class="cursor-pointer form-checkbox" id="approved-checkbox">
<input wire:model.live="status" value="{{ App\Models\Quote::STATUS_APPROVED }}" value="approved" type="checkbox" class="cursor-pointer form-checkbox" id="approved-checkbox">
<label for="approved-checkbox" class="text-sm cursor-pointer">{{ ctrans('texts.approved') }}</label>
</div>
<div class="mr-3">
<input wire:model="status" value="{{ App\Models\Quote::STATUS_EXPIRED }}" value="expired" type="checkbox" class="cursor-pointer form-checkbox" id="expired-checkbox">
<input wire:model.live="status" value="{{ App\Models\Quote::STATUS_EXPIRED }}" value="expired" type="checkbox" class="cursor-pointer form-checkbox" id="expired-checkbox">
<label for="expired-checkbox" class="text-sm cursor-pointer">{{ ctrans('texts.expired') }}</label>
</div>
</div>

View File

@ -2,7 +2,7 @@
<div class="flex items-center justify-between">
<div class="flex items-center">
<span class="mr-2 text-sm hidden md:block">{{ ctrans('texts.per_page') }}</span>
<select wire:model="per_page" class="form-select py-1 text-sm">
<select wire:model.live="per_page" class="form-select py-1 text-sm">
<option>5</option>
<option selected>10</option>
<option>15</option>

View File

@ -1,4 +1,4 @@
<div class="container mx-auto grid grid-cols-12 mb-4" data-ref="required-fields-container">
<div wire:ignore.self class="container mx-auto grid grid-cols-12 mb-4" data-ref="required-fields-container">
<div class="col-span-12 lg:col-span-6 lg:col-start-4 overflow-hidden bg-white shadow rounded-lg">
<div class="px-4 py-5 border-b border-gray-200 sm:px-6">
<h3 class="text-lg font-medium leading-6 text-gray-900">
@ -10,12 +10,12 @@
</p>
</div>
<form id="required-client-info-form" wire:submit.prevent="handleSubmit(Object.fromEntries(new FormData(document.getElementById('required-client-info-form'))))">
<form id="required-client-info-form" x-on:submit.prevent="$wire.handleSubmit(Object.fromEntries(new FormData(document.getElementById('required-client-info-form'))))">
@foreach($fields as $field)
@if(!array_key_exists('filled', $field))
@component('portal.ninja2020.components.general.card-element', ['title' => $field['label']])
@if($field['name'] == 'client_country_id' || $field['name'] == 'client_shipping_country_id')
<select id="client_country" class="input w-full form-select bg-white" name="{{ $field['name'] }}" wire:model.defer="{{ str_replace(["client_","_line_","contact_"], ["client.","","contact."], $field['name']) }}">
<select id="client_country" class="input w-full form-select bg-white" name="{{ $field['name'] }}" wire:model="{{ str_replace(["client_","_line_","contact_"], ["client.","","contact."], $field['name']) }}">
<option value="none"></option>
@foreach($countries as $country)
@ -25,7 +25,7 @@
@endforeach
</select>
@else
<input class="input w-full" type="{{ $field['type'] ?? 'text' }}" name="{{ $field['name'] }}" wire:model.defer="{{ str_replace(["client_","_line_","contact_"], ["client.","","contact."], $field['name']) }}">
<input class="input w-full" type="{{ $field['type'] ?? 'text' }}" name="{{ $field['name'] }}" wire:model="{{ str_replace(["client_","_line_","contact_"], ["client.","","contact."], $field['name']) }}">
@endif
@if(session()->has('validation_errors') && array_key_exists($field['name'], session('validation_errors')))
@ -48,16 +48,16 @@
@if($show_terms)
@component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.terms_of_service') ])
<div x-data="{ open: false }">
<div x-data="{ open: false }">
<input
wire:click="toggleTermsAccepted()"
id="terms"
name="terms_accepted"
type="checkbox"
class="h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500"
/>
/>
<a href="#" class="group relative inline-block ml-4 text-blue-500 hover:text-red-500 duration-300 no-underline" @click="open = true">{{ ctrans('texts.agree_to_terms', ['terms' => ctrans('texts.terms')]) }}</a>
<div x-show="open" class="fixed bottom-0 inset-x-0 px-4 pb-4 sm:inset-0 sm:flex sm:items-center sm:justify-center z-50"
@ -102,7 +102,7 @@
</div>
</div>
@endcomponent

View File

@ -2,7 +2,7 @@
<div class="flex items-center justify-between">
<div class="flex items-center">
<span class="mr-2 text-sm hidden md:block">{{ ctrans('texts.per_page') }}</span>
<select wire:model="per_page" class="form-select py-1 text-sm">
<select wire:model.live="per_page" class="form-select py-1 text-sm">
<option>5</option>
<option selected>10</option>
<option>15</option>

View File

@ -2,7 +2,7 @@
<div class="flex items-center justify-between">
<div class="flex items-center">
<span class="mr-2 text-sm hidden md:block">{{ ctrans('texts.per_page') }}</span>
<select wire:model="per_page" class="form-select py-1 text-sm">
<select wire:model.live="per_page" class="form-select py-1 text-sm">
<option>5</option>
<option selected>10</option>
<option>15</option>

View File

@ -2,7 +2,7 @@
<div class="flex items-center justify-between">
<div class="flex items-center">
<span class="mr-2 text-sm hidden md:block">{{ ctrans('texts.per_page') }}</span>
<select wire:model="per_page" class="form-select py-1 text-sm">
<select wire:model.live="per_page" class="form-select py-1 text-sm">
<option>5</option>
<option selected>10</option>
<option>15</option>

View File

@ -14,7 +14,7 @@
</div>
</div>
<div class="mt-5 sm:mt-0 sm:ml-6 sm:flex-shrink-0 sm:flex sm:items-center">
<form wire:submit.prevent="makeDefault">
<form wire:submit="makeDefault">
<button class="button button-primary bg-primary" {{ $token->is_default ? 'disabled' : '' }}>
{{ ctrans('texts.save_as_default') }}
</button>

View File

@ -15,4 +15,4 @@
<div class="flex flex-col">
@livewire('credits-table', ['company_id' => $company->id, 'db' => $company->db])
</div>
@endsection
@endsection

View File

@ -1,6 +1,6 @@
<div class="flex flex-col justify-center items-center my-10">
<form wire:submit.prevent="submit">
<form wire:submit="submit">
@csrf
@method('POST')
<div class="shadow overflow-hidden rounded">
@ -8,7 +8,7 @@
<div class="grid grid-cols-6 gap-6 max-w-4xl">
<div class="col-span-6 sm:col-span-3">
<label for="first_name" class="input-label">@lang('texts.first_name')</label>
<input id="first_name" class="input w-full" name="first_name" wire:model.defer="first_name"/>
<input id="first_name" class="input w-full" name="first_name" wire:model="first_name"/>
@error('first_name')
<div class="validation validation-fail">
{{ $message }}
@ -18,7 +18,7 @@
<div class="col-span-6 sm:col-span-3">
<label for="last_name" class="input-label">@lang('texts.last_name')</label>
<input id="last_name" class="input w-full" name="last_name" wire:model.defer="last_name"/>
<input id="last_name" class="input w-full" name="last_name" wire:model="last_name"/>
@error('last_name')
<div class="validation validation-fail">
{{ $message }}
@ -29,7 +29,7 @@
<div class="col-span-6 sm:col-span-4">
<label for="email_address" class="input-label">@lang('texts.email_address')</label>
<input id="email_address" class="input w-full" type="email" name="email"
wire:model.defer="email" disabled="true"/>
wire:model="email" disabled="true"/>
@error('email')
<div class="validation validation-fail">
{{ $message }}
@ -40,7 +40,7 @@
<div class="col-span-6 sm:col-span-4">
<label for="company_name" class="input-label">@lang('texts.company_name')</label>
<input id="company_name" class="input w-full" name="company_name"
wire:model.defer="company_name"/>
wire:model="company_name"/>
@error('company_name')
<div class="validation validation-fail">
{{ $message }}
@ -53,19 +53,19 @@
<div class="radio mr-4">
<input class="form-radio cursor-pointer" type="radio" value="US" name="country" checked
wire:model.defer="country">
wire:model="country">
<span>{{ ctrans('texts.country_United States') }}</span>
</div>
<div class="radio mr-4">
<input class="form-radio cursor-pointer" type="radio" value="CA" name="country"
wire:model.defer="country">
wire:model="country">
<span>{{ ctrans('texts.country_Canada') }}</span>
</div>
<div class="radio mr-4">
<input class="form-radio cursor-pointer" type="radio" value="GB" name="country"
wire:model.defer="country">
wire:model="country">
<span>{{ ctrans('texts.country_United Kingdom') }}</span>
</div>
@ -76,7 +76,7 @@
<label for="country" class="input-label">@lang('texts.debit_cards')</label>
<div class="checkbox">
<input class="form-checkbox cursor-pointer mr-2" type="checkbox" name="debit_cards" value="1" wire:model.defer="debit_cards">
<input class="form-checkbox cursor-pointer mr-2" type="checkbox" name="debit_cards" value="1" wire:model="debit_cards">
<span>{{ ctrans('texts.accept_debit_cards') }}</span>
</div>
</div>
@ -87,7 +87,7 @@
<div class="col-span-6 sm:col-span-4 {{ $country != 'US' ? 'hidden' : 'block' }}">
<label for="country" class="input-label">@lang('texts.ach')</label>
<div class="checkbox">
<input class="form-checkbox cursor-pointer mr-2" type="checkbox" name="ach" value="1" wire:model="ach">
<input class="form-checkbox cursor-pointer mr-2" type="checkbox" name="ach" value="1" wire:model.live="ach">
<span>{{ ctrans('texts.enable_ach')}}</span>
</div>
</div>
@ -96,7 +96,7 @@
<div class="col-span-6 sm:col-span-4">
<label for="country" class="input-label"></label>
<div class="checkbox">
<input class="form-checkbox cursor-pointer mr-2" type="checkbox" name="wepay_payment_tos_agree" value="1" wire:model.defer="wepay_payment_tos_agree">
<input class="form-checkbox cursor-pointer mr-2" type="checkbox" name="wepay_payment_tos_agree" value="1" wire:model="wepay_payment_tos_agree">
<span>{!! ctrans('texts.wepay_payment_tos_agree', ['terms' => $terms, 'privacy_policy' => $privacy_policy]) !!}</span>
</div>
@error('wepay_payment_tos_agree')

View File

@ -1,4 +1,4 @@
<div style="display: none;" id="displaySignatureModal" class="fixed bottom-0 inset-x-0 px-4 pb-4 sm:inset-0 sm:flex sm:items-center sm:justify-center" x-data>
<div style="display: none;" id="displaySignatureModal" class="fixed bottom-0 inset-x-0 px-4 pb-4 sm:inset-0 sm:flex sm:items-center sm:justify-center" x-data="{ open: true }">
<div x-show="open" x-transition:enter="ease-out duration-300" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" class="fixed inset-0 transition-opacity">
<div class="absolute inset-0 bg-gray-500 opacity-75"></div>
</div>
@ -20,7 +20,7 @@
</p>
</div>
</div>
</div>
<div class="flex w-full mx-auto content-center">
<p class="text-sm mx-auto content-center">{{ ctrans('texts.sign_here_ux_tip') }}</p>
@ -36,7 +36,7 @@
{{ ctrans('texts.close') }}
</button>
</div>
</div>
</div>
</div>

View File

@ -1,4 +1,4 @@
<div style="display: none;" id="displayTermsModal" class="fixed bottom-0 inset-x-0 px-4 pb-4 sm:inset-0 sm:flex sm:items-center sm:justify-center" x-data>
<div x-data="{ open: true }" style="display: none;" id="displayTermsModal" class="fixed bottom-0 inset-x-0 px-4 pb-4 sm:inset-0 sm:flex sm:items-center sm:justify-center">
<div x-show="open" x-transition:enter="ease-out duration-300" x-transition:enter-start="opacity-0" x-transition:enter-end="opacity-100" x-transition:leave="ease-in duration-200" x-transition:leave-start="opacity-100" x-transition:leave-end="opacity-0" class="fixed inset-0 transition-opacity">
<div class="absolute inset-0 bg-gray-500 opacity-75"></div>
</div>
@ -25,9 +25,9 @@
</div>
<div class="mt-5 sm:mt-4 sm:flex sm:flex-row-reverse">
<div class="flex w-full rounded-md shadow-sm sm:ml-3 sm:w-auto" x-data>
<button
<button
type="button"
id="accept-terms-button"
id="accept-terms-button"
onclick="setTimeout(() => this.disabled = true, 0); setTimeout(() => this.disabled = false, 5000); return true;"
class="button button-primary bg-primary">
{{ ctrans('texts.i_agree') }}

View File

@ -65,7 +65,6 @@
<!-- Scripts -->
@vite('resources/js/app.js')
<script src="{{ asset('vendor/alpinejs@2.8.2/alpine.js') }}" defer></script>
<!-- Fonts -->
<style>

View File

@ -74,7 +74,6 @@
<!-- Scripts -->
@vite('resources/js/app.js')
<script src="{{ asset('vendor/alpinejs@2.8.2/alpine.js') }}" defer></script>
<!-- Fonts -->
<style>

View File

@ -66,7 +66,6 @@
@else
<script src="{{ str_replace("setup", "", Request::url())}}js/app.js" defer></script>
@endif
<script src="{{ asset('vendor/alpinejs@2.8.2/alpine.js') }}" defer></script>
<!-- Fonts -->
{{-- <link rel="dns-prefetch" href="https://fonts.gstatic.com"> --}}
@ -89,7 +88,7 @@
@else
<link href="{{ str_replace("setup", "", Request::url())}}css/app.css" rel="stylesheet">
@endif
@if(auth()->guard('contact')->user() && !auth()->guard('contact')->user()->user->account->isPaid())
{{-- <link href="{{ mix('favicon.png') }}" rel="shortcut icon" type="image/png"> --}}
@endif

View File

@ -65,7 +65,6 @@
<!-- Scripts -->
@vite('resources/js/app.js')
<script src="{{ asset('vendor/alpinejs@2.8.2/alpine.js') }}" defer></script>
<!-- Fonts -->
{{-- <link rel="dns-prefetch" href="https://fonts.gstatic.com"> --}}

View File

@ -7,7 +7,7 @@
</div> <!-- End of left-side -->
<div class="mt-5 md:mt-0 md:col-span-2">
<form wire:submit.prevent="submit" id="update_client">
<form wire:submit="submit" id="update_client">
@csrf
@method('PUT')
<div class="shadow overflow-hidden rounded">
@ -17,7 +17,7 @@
<label for="first_name" class="input-label">@lang('texts.first_name')</label>
<input id="contact_first_name"
class="input w-full {{ in_array('contact_first_name', (array) session('missing_required_fields')) ? 'border border-red-400' : '' }}"
name="first_name" wire:model.defer="first_name"/>
name="first_name" wire:model="first_name"/>
@error('first_name')
<div class="validation validation-fail">
{{ $message }}
@ -29,7 +29,7 @@
<label for="last_name" class="input-label">@lang('texts.last_name')</label>
<input id="contact_last_name"
class="input w-full {{ in_array('contact_last_name', (array) session('missing_required_fields')) ? 'border border-red-400' : '' }}"
name="last_name" wire:model.defer="last_name"/>
name="last_name" wire:model="last_name"/>
@error('last_name')
<div class="validation validation-fail">
{{ $message }}
@ -41,7 +41,7 @@
<label for="email_address" class="input-label">@lang('texts.email_address')</label>
<input id="contact_email_address"
class="input w-full {{ in_array('contact_email', (array) session('missing_required_fields')) ? 'border border-red-400' : '' }}"
type="email" name="email" wire:model.defer="email"/>
type="email" name="email" wire:model="email"/>
@error('email')
<div class="validation validation-fail">
{{ $message }}
@ -52,7 +52,7 @@
<div class="col-span-6 sm:col-span-4">
<label for="contact_phone" class="input-label">@lang('texts.phone')</label>
<input id="contact_phone" class="input w-full" name="phone"
wire:model.defer="phone"/>
wire:model="phone"/>
@error('phone')
<div class="validation validation-fail">
{{ $message }}
@ -63,7 +63,7 @@
<div class="col-span-6 sm:col-span-6 lg:col-span-3">
<label for="contact_password" class="input-label">@lang('texts.password')</label>
<input id="contact_password" class="input w-full" name="password"
wire:model.defer="password" type="password"/>
wire:model="password" type="password"/>
@error('password')
<div class="validation validation-fail">
{{ $message }}
@ -76,7 +76,7 @@
class="input-label">@lang('texts.confirm_password')</label>
<input id="contact_password_confirmation" class="input w-full"
name="password_confirmation"
wire:model.defer="password_confirmation" type="password"/>
wire:model="password_confirmation" type="password"/>
@error('password_confirmation')
<div class="validation validation-fail">
{{ $message }}

View File

@ -7,14 +7,14 @@
</div> <!-- End of left side -->
<div class="mt-5 md:mt-0 md:col-span-2">
<form wire:submit.prevent="submit" method="POST" id="update_contact">
<form wire:submit="submit" method="POST" id="update_contact">
@csrf
<div class="shadow overflow-hidden rounded">
<div class="px-4 py-5 bg-white sm:p-6">
<div class="grid grid-cols-6 gap-6">
<div class="col-span-6 sm:col-span-3">
<label for="client_name" class="input-label">{{ ctrans('texts.name') }}</label>
<input id="client_name" class="input w-full" name="name" wire:model.defer="name"/>
<input id="client_name" class="input w-full" name="name" wire:model="name"/>
@error('name')
<div class="validation validation-fail">
{{ $message }}
@ -26,7 +26,7 @@
<label for="client_vat_number"
class="input-label">{{ ctrans('texts.vat_number') }}</label>
<input id="client_vat_number" class="input w-full" name="vat_number"
wire:model.defer="vat_number"/>
wire:model="vat_number"/>
@error('vat_number')
<div class="validation validation-fail">
{{ $message }}
@ -36,7 +36,7 @@
<div class="col-span-6 sm:col-span-3">
<label for="client_phone" class="input-label">{{ ctrans('texts.phone') }}</label>
<input id="client_phone" class="input w-full" name="phone" wire:model.defer="phone"/>
<input id="client_phone" class="input w-full" name="phone" wire:model="phone"/>
@error('phone')
<div class="validation validation-fail">
{{ $message }}
@ -51,7 +51,7 @@
<span class="text-xs ml-2 text-gray-600">E.g. https://example.com</span>
</div>
<input id="client_website" class="input w-full" name="website"
wire:model.defer="website"/>
wire:model="website"/>
@error('website')
<div class="validation validation-fail">
{{ $message }}

View File

@ -6,13 +6,13 @@
</div>
</div>
<div class="mt-5 md:mt-0 md:col-span-2">
<form wire:submit.prevent="submit" method="POST" id="update_billing_address">
<form wire:submit="submit" method="POST" id="update_billing_address">
@csrf
<div class="px-4 py-5 bg-white sm:p-6">
<div class="grid grid-cols-6 gap-6">
<div class="col-span-6 sm:col-span-4">
<label for="address1" class="input-label">{{ ctrans('texts.address1') }}</label>
<input id="address1" class="input w-full {{ in_array('billing_address1', (array) session('missing_required_fields')) ? 'border border-red-400' : '' }}" name="address1" wire:model.defer="address1" />
<input id="address1" class="input w-full {{ in_array('billing_address1', (array) session('missing_required_fields')) ? 'border border-red-400' : '' }}" name="address1" wire:model="address1" />
@error('address1')
<div class="validation validation-fail">
{{ $message }}
@ -21,7 +21,7 @@
</div>
<div class="col-span-6 sm:col-span-3">
<label for="address2" class="input-label">{{ ctrans('texts.address2') }}</label>
<input id="address2" class="input w-full {{ in_array('billing_address2', (array) session('missing_required_fields')) ? 'border border-red-400' : '' }}" name="address2" wire:model.defer="address2" />
<input id="address2" class="input w-full {{ in_array('billing_address2', (array) session('missing_required_fields')) ? 'border border-red-400' : '' }}" name="address2" wire:model="address2" />
@error('address2')
<div class="validation validation-fail">
{{ $message }}
@ -30,7 +30,7 @@
</div>
<div class="col-span-6 sm:col-span-3">
<label for="city" class="input-label">{{ ctrans('texts.city') }}</label>
<input id="city" class="input w-full {{ in_array('billing_city', (array) session('missing_required_fields')) ? 'border border-red-400' : '' }}" name="city" wire:model.defer="city" />
<input id="city" class="input w-full {{ in_array('billing_city', (array) session('missing_required_fields')) ? 'border border-red-400' : '' }}" name="city" wire:model="city" />
@error('city')
<div class="validation validation-fail">
{{ $message }}
@ -39,7 +39,7 @@
</div>
<div class="col-span-6 sm:col-span-2">
<label for="state" class="input-label">{{ ctrans('texts.state') }}</label>
<input id="state" class="input w-full {{ in_array('billing_state', (array) session('missing_required_fields')) ? 'border border-red-400' : '' }}" name="state" wire:model.defer="state" />
<input id="state" class="input w-full {{ in_array('billing_state', (array) session('missing_required_fields')) ? 'border border-red-400' : '' }}" name="state" wire:model="state" />
@error('state')
<div class="validation validation-fail">
{{ $message }}
@ -48,7 +48,7 @@
</div>
<div class="col-span-6 sm:col-span-2">
<label for="postal_code" class="input-label">{{ ctrans('texts.postal_code') }}</label>
<input id="postal_code" class="input w-full {{ in_array('billing_postal_code', (array) session('missing_required_fields')) ? 'border border-red-400' : '' }}" name="postal_code" wire:model.defer="postal_code" />
<input id="postal_code" class="input w-full {{ in_array('billing_postal_code', (array) session('missing_required_fields')) ? 'border border-red-400' : '' }}" name="postal_code" wire:model="postal_code" />
@error('postal_code')
<div class="validation validation-fail">
{{ $message }}
@ -57,7 +57,7 @@
</div>
<div class="col-span-6 sm:col-span-2">
<label for="country" class="input-label">@lang('texts.country')</label>
<select id="country" class="input w-full form-select bg-white {{ in_array('billing_country', (array) session('missing_required_fields')) ? 'border border-red-400' : '' }}" wire:model.defer="country_id">
<select id="country" class="input w-full form-select bg-white {{ in_array('billing_country', (array) session('missing_required_fields')) ? 'border border-red-400' : '' }}" wire:model="country_id">
<option value="none"></option>
@foreach($countries as $country)
<option value="{{ $country->id }}">

View File

@ -6,14 +6,14 @@
</div>
</div>
<div class="mt-5 md:mt-0 md:col-span-2">
<form wire:submit.prevent="submit" method="POST" id="update_shipping_address">
<form wire:submit="submit" method="POST" id="update_shipping_address">
@csrf
<div class="shadow overflow-hidden rounded">
<div class="px-4 py-5 bg-white sm:p-6">
<div class="grid grid-cols-6 gap-6">
<div class="col-span-6 sm:col-span-4">
<label for="shipping_address1" class="input-label">{{ ctrans('texts.shipping_address1') }}</label>
<input id="shipping_address1" class="input w-full" name="shipping_address1" wire:model.defer="shipping_address1" />
<input id="shipping_address1" class="input w-full" name="shipping_address1" wire:model="shipping_address1" />
@error('shipping_address1')
<div class="validation validation-fail">
{{ $message }}
@ -22,7 +22,7 @@
</div>
<div class="col-span-6 sm:col-span-3">
<label for="shipping_address2" class="input-label">@lang('texts.shipping_address2')</label>
<input id="shipping_address2" class="input w-full" name="shipping_address2" wire:model.defer="shipping_address2" />
<input id="shipping_address2" class="input w-full" name="shipping_address2" wire:model="shipping_address2" />
@error('shipping_address2')
<div class="validation validation-fail">
{{ $message }}
@ -31,7 +31,7 @@
</div>
<div class="col-span-6 sm:col-span-3">
<label for="shipping_city" class="input-label">@lang('texts.shipping_city')</label>
<input id="shipping_city" class="input w-full" name="shipping_city" wire:model.defer="shipping_city" />
<input id="shipping_city" class="input w-full" name="shipping_city" wire:model="shipping_city" />
@error('shipping_city')
<div class="validation validation-fail">
{{ $message }}
@ -40,7 +40,7 @@
</div>
<div class="col-span-6 sm:col-span-2">
<label for="shipping_state" class="input-label">@lang('texts.shipping_state')</label>
<input id="shipping_state" class="input w-full" name="shipping_state" wire:model.defer="shipping_state" />
<input id="shipping_state" class="input w-full" name="shipping_state" wire:model="shipping_state" />
@error('shipping_state')
<div class="validation validation-fail">
{{ $message }}
@ -49,7 +49,7 @@
</div>
<div class="col-span-6 sm:col-span-2">
<label for="shipping_postal_code" class="input-label">@lang('texts.shipping_postal_code')</label>
<input id="shipping_postal_code" class="input w-full" name="shipping_postal_code" wire:model.defer="shipping_postal_code" />
<input id="shipping_postal_code" class="input w-full" name="shipping_postal_code" wire:model="shipping_postal_code" />
@error('shipping_postal_code')
<div class="validation validation-fail">
{{ $message }}
@ -58,7 +58,7 @@
</div>
<div class="col-span-4 sm:col-span-2">
<label for="shipping_country" class="input-label">@lang('texts.shipping_country')</label>
<select id="shipping_country" class="input w-full form-select bg-white" wire:model.defer="shipping_country_id">
<select id="shipping_country" class="input w-full form-select bg-white" wire:model="shipping_country_id">
<option value="none"></option>
@foreach($countries as $country)
<option value="{{ $country->id }}">

View File

@ -1,4 +1,4 @@
<form action="{{ route('client.quotes.bulk') }}" method="post" id="approve-form" />
<form action="{{ route('client.quotes.bulk') }}" method="post" id="approve-form">
@csrf
<input type="hidden" name="action" value="approve">
@ -11,18 +11,17 @@
<div class="px-4 py-5 sm:p-6">
<div class="sm:flex sm:items-start sm:justify-between">
<div>
<h3 class="text-lg leading-6 font-medium text-gray-900">
{{ ctrans('texts.approve') }}
</h3>
<div class="btn hidden md:block" data-clipboard-text="{{url("client/quote/{$key}")}}" aria-label="Copied!">
<div class="flex text-sm leading-6 font-medium text-gray-500">
<p class="mr-2">{{url("client/quote/{$key}")}}</p>
<p><img class="h-5 w-5" src="{{ asset('assets/clippy.svg') }}" alt="Copy to clipboard"></p>
</div>
</div>
</div>
<div class="mt-5 sm:mt-0 sm:ml-6 sm:flex-shrink-0 sm:flex sm:items-center">

View File

@ -11,7 +11,7 @@
})(window,document,'script','dataLayer','GTM-WMJ5W23');</script>
<!-- End Google Tag Manager -->
@endif
<!-- Error: {{ session('error') }} -->
@if (config('services.analytics.tracking_id'))
@ -58,7 +58,6 @@
<!-- Scripts -->
@vite('resources/js/app.js')
<script src="{{ asset('vendor/alpinejs@2.8.2/alpine.js') }}" defer></script>
<!-- Fonts -->
{{-- <link rel="dns-prefetch" href="https://fonts.gstatic.com"> --}}
@ -75,7 +74,7 @@
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
</style>
<!-- Styles -->
@vite('resources/sass/app.scss')
@if(auth()->guard('contact')->user() && !auth()->guard('contact')->user()->user->account->isPaid())

View File

@ -0,0 +1,60 @@
@php
if (! isset($scrollTo)) {
$scrollTo = 'body';
}
$scrollIntoViewJsSnippet = ($scrollTo !== false)
? <<<JS
(\$el.closest('{$scrollTo}') || document.querySelector('{$scrollTo}')).scrollIntoView()
JS
: '';
@endphp
<div>
@if ($paginator->hasPages())
<nav>
<ul class="pagination">
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
<span class="page-link" aria-hidden="true">&lsaquo;</span>
</li>
@else
<li class="page-item">
<button type="button" dusk="previousPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}" class="page-link" wire:click="previousPage('{{ $paginator->getPageName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" wire:loading.attr="disabled" rel="prev" aria-label="@lang('pagination.previous')">&lsaquo;</button>
</li>
@endif
{{-- Pagination Elements --}}
@foreach ($elements as $element)
{{-- "Three Dots" Separator --}}
@if (is_string($element))
<li class="page-item disabled" aria-disabled="true"><span class="page-link">{{ $element }}</span></li>
@endif
{{-- Array Of Links --}}
@if (is_array($element))
@foreach ($element as $page => $url)
@if ($page == $paginator->currentPage())
<li class="page-item active" wire:key="paginator-{{ $paginator->getPageName() }}-page-{{ $page }}" aria-current="page"><span class="page-link">{{ $page }}</span></li>
@else
<li class="page-item" wire:key="paginator-{{ $paginator->getPageName() }}-page-{{ $page }}"><button type="button" class="page-link" wire:click="gotoPage({{ $page }}, '{{ $paginator->getPageName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}">{{ $page }}</button></li>
@endif
@endforeach
@endif
@endforeach
{{-- Next Page Link --}}
@if ($paginator->hasMorePages())
<li class="page-item">
<button type="button" dusk="nextPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}" class="page-link" wire:click="nextPage('{{ $paginator->getPageName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" wire:loading.attr="disabled" rel="next" aria-label="@lang('pagination.next')">&rsaquo;</button>
</li>
@else
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
<span class="page-link" aria-hidden="true">&rsaquo;</span>
</li>
@endif
</ul>
</nav>
@endif
</div>

View File

@ -1,3 +1,15 @@
@php
if (! isset($scrollTo)) {
$scrollTo = 'body';
}
$scrollIntoViewJsSnippet = ($scrollTo !== false)
? <<<JS
(\$el.closest('{$scrollTo}') || document.querySelector('{$scrollTo}')).scrollIntoView()
JS
: '';
@endphp
<div>
@if ($paginator->hasPages())
<nav>
@ -10,11 +22,11 @@
@else
@if(method_exists($paginator,'getCursorName'))
<li class="page-item">
<button dusk="previousPage" type="button" class="page-link" wire:click="setPage('{{$paginator->previousCursor()->encode()}}','{{ $paginator->getCursorName() }}')" wire:loading.attr="disabled" rel="prev">@lang('pagination.previous')</button>
<button dusk="previousPage" type="button" class="page-link" wire:key="cursor-{{ $paginator->getCursorName() }}-{{ $paginator->previousCursor()->encode() }}" wire:click="setPage('{{$paginator->previousCursor()->encode()}}','{{ $paginator->getCursorName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" wire:loading.attr="disabled" rel="prev">@lang('pagination.previous')</button>
</li>
@else
<li class="page-item">
<button type="button" dusk="previousPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}" class="page-link" wire:click="previousPage('{{ $paginator->getPageName() }}')" wire:loading.attr="disabled" rel="prev">@lang('pagination.previous')</button>
<button type="button" dusk="previousPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}" class="page-link" wire:click="previousPage('{{ $paginator->getPageName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" wire:loading.attr="disabled" rel="prev">@lang('pagination.previous')</button>
</li>
@endif
@endif
@ -23,11 +35,11 @@
@if ($paginator->hasMorePages())
@if(method_exists($paginator,'getCursorName'))
<li class="page-item">
<button dusk="nextPage" type="button" class="page-link" wire:click="setPage('{{$paginator->nextCursor()->encode()}}','{{ $paginator->getCursorName() }}')" wire:loading.attr="disabled" rel="next">@lang('pagination.next')</button>
<button dusk="nextPage" type="button" class="page-link" wire:key="cursor-{{ $paginator->getCursorName() }}-{{ $paginator->nextCursor()->encode() }}" wire:click="setPage('{{$paginator->nextCursor()->encode()}}','{{ $paginator->getCursorName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" wire:loading.attr="disabled" rel="next">@lang('pagination.next')</button>
</li>
@else
<li class="page-item">
<button type="button" dusk="nextPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}" class="page-link" wire:click="nextPage('{{ $paginator->getPageName() }}')" wire:loading.attr="disabled" rel="next">@lang('pagination.next')</button>
<button type="button" dusk="nextPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}" class="page-link" wire:click="nextPage('{{ $paginator->getPageName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" wire:loading.attr="disabled" rel="next">@lang('pagination.next')</button>
</li>
@endif
@else

View File

@ -0,0 +1,56 @@
@php
if (! isset($scrollTo)) {
$scrollTo = 'body';
}
$scrollIntoViewJsSnippet = ($scrollTo !== false)
? <<<JS
(\$el.closest('{$scrollTo}') || document.querySelector('{$scrollTo}')).scrollIntoView()
JS
: '';
@endphp
<div>
@if ($paginator->hasPages())
<nav role="navigation" aria-label="Pagination Navigation" class="flex justify-between">
<span>
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<span class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 rounded-md select-none">
{!! __('pagination.previous') !!}
</span>
@else
@if(method_exists($paginator,'getCursorName'))
<button type="button" dusk="previousPage" wire:key="cursor-{{ $paginator->getCursorName() }}-{{ $paginator->previousCursor()->encode() }}" wire:click="setPage('{{$paginator->previousCursor()->encode()}}','{{ $paginator->getCursorName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" wire:loading.attr="disabled" class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
{!! __('pagination.previous') !!}
</button>
@else
<button
type="button" wire:click="previousPage('{{ $paginator->getPageName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" wire:loading.attr="disabled" dusk="previousPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}" class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
{!! __('pagination.previous') !!}
</button>
@endif
@endif
</span>
<span>
{{-- Next Page Link --}}
@if ($paginator->hasMorePages())
@if(method_exists($paginator,'getCursorName'))
<button type="button" dusk="nextPage" wire:key="cursor-{{ $paginator->getCursorName() }}-{{ $paginator->nextCursor()->encode() }}" wire:click="setPage('{{$paginator->nextCursor()->encode()}}','{{ $paginator->getCursorName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" wire:loading.attr="disabled" class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
{!! __('pagination.next') !!}
</button>
@else
<button type="button" wire:click="nextPage('{{ $paginator->getPageName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" wire:loading.attr="disabled" dusk="nextPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}" class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
{!! __('pagination.next') !!}
</button>
@endif
@else
<span class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 rounded-md select-none">
{!! __('pagination.next') !!}
</span>
@endif
</span>
</nav>
@endif
</div>

View File

@ -0,0 +1,126 @@
@php
if (! isset($scrollTo)) {
$scrollTo = 'body';
}
$scrollIntoViewJsSnippet = ($scrollTo !== false)
? <<<JS
(\$el.closest('{$scrollTo}') || document.querySelector('{$scrollTo}')).scrollIntoView()
JS
: '';
@endphp
<div>
@if ($paginator->hasPages())
<nav role="navigation" aria-label="Pagination Navigation" class="flex items-center justify-between">
<div class="flex justify-between flex-1 sm:hidden">
<span>
@if ($paginator->onFirstPage())
<span class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 rounded-md select-none">
{!! __('pagination.previous') !!}
</span>
@else
<button type="button" wire:click="previousPage('{{ $paginator->getPageName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" wire:loading.attr="disabled" dusk="previousPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}.before" class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
{!! __('pagination.previous') !!}
</button>
@endif
</span>
<span>
@if ($paginator->hasMorePages())
<button type="button" wire:click="nextPage('{{ $paginator->getPageName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" wire:loading.attr="disabled" dusk="nextPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}.before" class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150">
{!! __('pagination.next') !!}
</button>
@else
<span class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 rounded-md select-none">
{!! __('pagination.next') !!}
</span>
@endif
</span>
</div>
<div class="hidden sm:flex-1 sm:flex sm:items-center sm:justify-between">
<div>
<p class="text-sm text-gray-700 leading-5">
<span>{!! __('Showing') !!}</span>
<span class="font-medium">{{ $paginator->firstItem() }}</span>
<span>{!! __('to') !!}</span>
<span class="font-medium">{{ $paginator->lastItem() }}</span>
<span>{!! __('of') !!}</span>
<span class="font-medium">{{ $paginator->total() }}</span>
<span>{!! __('results') !!}</span>
</p>
</div>
<div>
<span class="relative z-0 inline-flex rounded-md shadow-sm">
<span>
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<span aria-disabled="true" aria-label="{{ __('pagination.previous') }}">
<span class="relative inline-flex items-center px-2 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default rounded-l-md leading-5" aria-hidden="true">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd" />
</svg>
</span>
</span>
@else
<button type="button" wire:click="previousPage('{{ $paginator->getPageName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" dusk="previousPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}.after" rel="prev" class="relative inline-flex items-center px-2 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 rounded-l-md leading-5 hover:text-gray-400 focus:z-10 focus:outline-none focus:border-blue-300 focus:shadow-outline-blue active:bg-gray-100 active:text-gray-500 transition ease-in-out duration-150" aria-label="{{ __('pagination.previous') }}">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd" />
</svg>
</button>
@endif
</span>
{{-- Pagination Elements --}}
@foreach ($elements as $element)
{{-- "Three Dots" Separator --}}
@if (is_string($element))
<span aria-disabled="true">
<span class="relative inline-flex items-center px-4 py-2 -ml-px text-sm font-medium text-gray-700 bg-white border border-gray-300 cursor-default leading-5 select-none">{{ $element }}</span>
</span>
@endif
{{-- Array Of Links --}}
@if (is_array($element))
@foreach ($element as $page => $url)
<span wire:key="paginator-{{ $paginator->getPageName() }}-page{{ $page }}">
@if ($page == $paginator->currentPage())
<span aria-current="page">
<span class="relative inline-flex items-center px-4 py-2 -ml-px text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 select-none">{{ $page }}</span>
</span>
@else
<button type="button" wire:click="gotoPage({{ $page }}, '{{ $paginator->getPageName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" class="relative inline-flex items-center px-4 py-2 -ml-px text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 hover:text-gray-500 focus:z-10 focus:outline-none focus:border-blue-300 focus:shadow-outline-blue active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150" aria-label="{{ __('Go to page :page', ['page' => $page]) }}">
{{ $page }}
</button>
@endif
</span>
@endforeach
@endif
@endforeach
<span>
{{-- Next Page Link --}}
@if ($paginator->hasMorePages())
<button type="button" wire:click="nextPage('{{ $paginator->getPageName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" dusk="nextPage{{ $paginator->getPageName() == 'page' ? '' : '.' . $paginator->getPageName() }}.after" rel="next" class="relative inline-flex items-center px-2 py-2 -ml-px text-sm font-medium text-gray-500 bg-white border border-gray-300 rounded-r-md leading-5 hover:text-gray-400 focus:z-10 focus:outline-none focus:border-blue-300 focus:shadow-outline-blue active:bg-gray-100 active:text-gray-500 transition ease-in-out duration-150" aria-label="{{ __('pagination.next') }}">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd" />
</svg>
</button>
@else
<span aria-disabled="true" aria-label="{{ __('pagination.next') }}">
<span class="relative inline-flex items-center px-2 py-2 -ml-px text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default rounded-r-md leading-5" aria-hidden="true">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd" />
</svg>
</span>
</span>
@endif
</span>
</span>
</div>
</div>
</nav>
@endif
</div>

View File

@ -14,7 +14,7 @@ namespace Tests\Feature\ClientPortal;
use App\DataMapper\ClientSettings;
use App\DataMapper\CompanySettings;
use App\Http\Livewire\CreditsTable;
use App\Livewire\CreditsTable;
use App\Models\Account;
use App\Models\Client;
use App\Models\ClientContact;

View File

@ -12,7 +12,7 @@
namespace Tests\Feature\ClientPortal;
use App\Http\Livewire\InvoicesTable;
use App\Livewire\InvoicesTable;
use App\Models\Account;
use App\Models\Client;
use App\Models\ClientContact;