mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-05-31 22:34:37 -04:00
Client portal improvements (#3654)
* Invoice table filters * Quotes table filters * Improve tables & translation * Fix profile page inputs * Fix profile page inputs & bump TailwindCSS version
This commit is contained in:
parent
ffa3550e4a
commit
3aa884dc11
@ -4,6 +4,7 @@ namespace App\Http\Livewire;
|
|||||||
|
|
||||||
use App\Models\Invoice;
|
use App\Models\Invoice;
|
||||||
use App\Traits\WithSorting;
|
use App\Traits\WithSorting;
|
||||||
|
use Carbon\Carbon;
|
||||||
use Livewire\Component;
|
use Livewire\Component;
|
||||||
use Livewire\WithPagination;
|
use Livewire\WithPagination;
|
||||||
|
|
||||||
@ -32,17 +33,24 @@ class InvoicesTable extends Component
|
|||||||
$query = Invoice::query();
|
$query = Invoice::query();
|
||||||
$query = $query->orderBy($this->sort_field, $this->sort_asc ? 'asc' : 'desc');
|
$query = $query->orderBy($this->sort_field, $this->sort_asc ? 'asc' : 'desc');
|
||||||
|
|
||||||
// So $status_id will come in three way:
|
if (in_array('paid', $this->status)) {
|
||||||
// paid, unpaid & overdue. Need to transform them to real values.
|
$query = $query->orWhere('status_id', Invoice::STATUS_PAID);
|
||||||
|
}
|
||||||
|
|
||||||
if (count($this->status)) {
|
if (in_array('unpaid', $this->status)) {
|
||||||
$query = $query->whereIn('status_id', $this->status);
|
$query = $query->orWhereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('overdue', $this->status)) {
|
||||||
|
$query = $query->orWhereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL])
|
||||||
|
->where('due_date', '<', Carbon::now())
|
||||||
|
->orWhere('partial_due_date', '<', Carbon::now());
|
||||||
}
|
}
|
||||||
|
|
||||||
$query = $query->paginate($this->per_page);
|
$query = $query->paginate($this->per_page);
|
||||||
|
|
||||||
return render('components.livewire.invoices-table', [
|
return render('components.livewire.invoices-table', [
|
||||||
'invoices' => $query
|
'invoices' => $query,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,14 +26,23 @@ class QuotesTable extends Component
|
|||||||
|
|
||||||
public function render()
|
public function render()
|
||||||
{
|
{
|
||||||
// So $status_id will come in three way:
|
|
||||||
// draft, sent, approved & expired. Need to transform them to real values.
|
|
||||||
|
|
||||||
$query = Quote::query()
|
$query = Quote::query()
|
||||||
->orderBy($this->sort_field, $this->sort_asc ? 'asc' : 'desc');
|
->orderBy($this->sort_field, $this->sort_asc ? 'asc' : 'desc');
|
||||||
|
|
||||||
if (count($this->status)) {
|
if (in_array('draft', $this->status)) {
|
||||||
$query = $query->whereIn('status_id', $this->status);
|
$query = $query->orWhere('status_id', Quote::STATUS_DRAFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('sent', $this->status)) {
|
||||||
|
$query = $query->orWhere('status_id', Quote::STATUS_SENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('approved', $this->status)) {
|
||||||
|
$query = $query->orWhere('status_id', Quote::STATUS_APPROVED);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_array('expired', $this->status)) {
|
||||||
|
$query = $query->orWhere('status_id', Quote::STATUS_EXPIRED);
|
||||||
}
|
}
|
||||||
|
|
||||||
$query = $query->paginate($this->per_page);
|
$query = $query->paginate($this->per_page);
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
"resolve-url-loader": "^3.1.0",
|
"resolve-url-loader": "^3.1.0",
|
||||||
"sass": "^1.15.2",
|
"sass": "^1.15.2",
|
||||||
"sass-loader": "^8.0.0",
|
"sass-loader": "^8.0.0",
|
||||||
"tailwindcss": "^1.2.0",
|
"tailwindcss": "^1.3",
|
||||||
"turbolinks": "^5.2.0"
|
"turbolinks": "^5.2.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3203,4 +3203,6 @@ return [
|
|||||||
'of' => 'Of',
|
'of' => 'Of',
|
||||||
'view_credit' => 'View Credit',
|
'view_credit' => 'View Credit',
|
||||||
'to_view_entity_password' => 'To view the :entity you need to enter password.',
|
'to_view_entity_password' => 'To view the :entity you need to enter password.',
|
||||||
|
'showing_x_of' => 'Showing :first to :last out of :total results',
|
||||||
|
'no_results' => 'No results found.'
|
||||||
];
|
];
|
||||||
|
@ -39,33 +39,43 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@foreach($credits as $credit)
|
@forelse($credits as $credit)
|
||||||
<tr class="bg-white group hover:bg-gray-100">
|
<tr class="bg-white group hover:bg-gray-100">
|
||||||
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
||||||
{{ App\Utils\Number::formatMoney($credit->amount, $credit->client) }}
|
{{ App\Utils\Number::formatMoney($credit->amount, $credit->client) }}
|
||||||
</td>
|
</td>
|
||||||
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
||||||
{{ App\Utils\Number::formatMoney($credit->balance, $credit->client) }}
|
{{ App\Utils\Number::formatMoney($credit->balance, $credit->client) }}
|
||||||
</td>
|
</td>
|
||||||
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
||||||
{{ $credit->formatDate($credit->date, $credit->client->date_format()) }}
|
{{ $credit->formatDate($credit->date, $credit->client->date_format()) }}
|
||||||
</td>
|
</td>
|
||||||
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
||||||
{{ empty($credit->public_notes) ? '/' : $credit->public_notes }}
|
{{ empty($credit->public_notes) ? '/' : $credit->public_notes }}
|
||||||
</td>
|
</td>
|
||||||
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
||||||
<a href="{{ route('client.credits.show', $credit->hashed_id) }}" class="button-link">
|
<a href="{{ route('client.credits.show', $credit->hashed_id) }}" class="button-link">
|
||||||
@lang('texts.view')
|
@lang('texts.view')
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
@empty
|
||||||
|
<tr class="bg-white group hover:bg-gray-100">
|
||||||
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500" colspan="100%">
|
||||||
|
{{ ctrans('texts.no_results') }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforelse
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-center md:justify-between mt-6 mb-6">
|
<div class="flex justify-center md:justify-between mt-6 mb-6">
|
||||||
<span class="text-gray-700 text-sm hidden md:block">Showing {{ $credits->firstItem() }} to {{ $credits->lastItem() }} out of {{ $credits->total() }}</span>
|
@if($credits->total() > 0)
|
||||||
|
<span class="text-gray-700 text-sm hidden md:block">
|
||||||
|
{{ ctrans('texts.showing_x_of', ['first' => $credits->firstItem(), 'last' => $credits->lastItem(), 'total' => $credits->total()]) }}
|
||||||
|
</span>
|
||||||
|
@endif
|
||||||
{{ $credits->links() }}
|
{{ $credits->links() }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
@ -11,15 +11,15 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<div class="mr-3">
|
<div class="mr-3">
|
||||||
<input wire:click="statusChange(paid)" type="checkbox" class="form-checkbox">
|
<input wire:click="statusChange('paid')" type="checkbox" class="form-checkbox">
|
||||||
<label for="paid" class="text-sm">{{ ctrans('texts.status_paid') }}</label>
|
<label for="paid" class="text-sm">{{ ctrans('texts.status_paid') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="mr-3">
|
<div class="mr-3">
|
||||||
<input wire:click="statusChange(unpaid)" value="unpaid" type="checkbox" class="form-checkbox">
|
<input wire:click="statusChange('unpaid')" type="checkbox" class="form-checkbox">
|
||||||
<label for="unpaid" class="text-sm">{{ ctrans('texts.status_unpaid') }}</label>
|
<label for="unpaid" class="text-sm">{{ ctrans('texts.status_unpaid') }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="mr-3">
|
<div class="mr-3">
|
||||||
<input wire:click="statusChange(overdue)" value="overdue" type="checkbox" class="form-checkbox">
|
<input wire:click="statusChange('overdue')" type="checkbox" class="form-checkbox">
|
||||||
<label for="overdue" class="text-sm">{{ ctrans('texts.overdue') }}</label>
|
<label for="overdue" class="text-sm">{{ ctrans('texts.overdue') }}</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -63,7 +63,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@foreach($invoices as $invoice)
|
@forelse($invoices as $invoice)
|
||||||
<tr class="bg-white group hover:bg-gray-100">
|
<tr class="bg-white group hover:bg-gray-100">
|
||||||
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 font-medium text-gray-900">
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 font-medium text-gray-900">
|
||||||
<label>
|
<label>
|
||||||
@ -96,13 +96,23 @@
|
|||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
@empty
|
||||||
|
<tr class="bg-white group hover:bg-gray-100">
|
||||||
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500" colspan="100%">
|
||||||
|
{{ ctrans('texts.no_results') }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforelse
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-center md:justify-between mt-6 mb-6">
|
<div class="flex justify-center md:justify-between mt-6 mb-6">
|
||||||
<span class="text-gray-700 text-sm hidden md:block">Showing {{ $invoices->firstItem() }} to {{ $invoices->lastItem() }} out of {{ $invoices->total() }}</span>
|
@if($invoices->total() > 0)
|
||||||
|
<span class="text-gray-700 text-sm hidden md:block">
|
||||||
|
{{ ctrans('texts.showing_x_of', ['first' => $invoices->firstItem(), 'last' => $invoices->lastItem(), 'total' => $invoices->total()]) }}
|
||||||
|
</span>
|
||||||
|
@endif
|
||||||
{{ $invoices->links() }}
|
{{ $invoices->links() }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -41,47 +41,57 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@foreach($payment_methods as $payment_method)
|
@forelse($payment_methods as $payment_method)
|
||||||
<tr class="bg-white group hover:bg-gray-100">
|
<tr class="bg-white group hover:bg-gray-100">
|
||||||
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
||||||
{{ $payment_method->formatDateTimestamp($payment_method->created_at, $client->date_format()) }}
|
{{ $payment_method->formatDateTimestamp($payment_method->created_at, $client->date_format()) }}
|
||||||
</td>
|
</td>
|
||||||
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
||||||
{{ ctrans("texts.{$payment_method->gateway_type->alias}") }}
|
{{ ctrans("texts.{$payment_method->gateway_type->alias}") }}
|
||||||
</td>
|
</td>
|
||||||
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
||||||
{{ ucfirst(optional($payment_method->meta)->brand) }}
|
{{ ucfirst(optional($payment_method->meta)->brand) }}
|
||||||
</td>
|
</td>
|
||||||
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
||||||
@if(isset($payment_method->meta->exp_month) && isset($payment_method->meta->exp_year))
|
@if(isset($payment_method->meta->exp_month) && isset($payment_method->meta->exp_year))
|
||||||
{{ $payment_method->meta->exp_month}} / {{ $payment_method->meta->exp_year }}
|
{{ $payment_method->meta->exp_month}} / {{ $payment_method->meta->exp_year }}
|
||||||
@endif
|
@endif
|
||||||
</td>
|
</td>
|
||||||
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
||||||
@isset($payment_method->meta->last4)
|
@isset($payment_method->meta->last4)
|
||||||
**** {{ $payment_method->meta->last4 }}
|
**** {{ $payment_method->meta->last4 }}
|
||||||
@endisset
|
@endisset
|
||||||
</td>
|
</td>
|
||||||
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
||||||
@if($payment_method->is_default)
|
@if($payment_method->is_default)
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check">
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check">
|
||||||
<path d="M20 6L9 17l-5-5" />
|
<path d="M20 6L9 17l-5-5" />
|
||||||
</svg>
|
</svg>
|
||||||
@endif
|
@endif
|
||||||
</td>
|
</td>
|
||||||
<td class="px-6 py-4 whitespace-no-wrap flex items-center justify-end text-sm leading-5 font-medium">
|
<td class="px-6 py-4 whitespace-no-wrap flex items-center justify-end text-sm leading-5 font-medium">
|
||||||
<a href="{{ route('client.payment_methods.show', $payment_method->hashed_id) }}" class="text-blue-600 hover:text-indigo-900 focus:outline-none focus:underline">
|
<a href="{{ route('client.payment_methods.show', $payment_method->hashed_id) }}" class="text-blue-600 hover:text-indigo-900 focus:outline-none focus:underline">
|
||||||
@lang('texts.view')
|
@lang('texts.view')
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
@empty
|
||||||
|
<tr class="bg-white group hover:bg-gray-100">
|
||||||
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500" colspan="100%">
|
||||||
|
{{ ctrans('texts.no_results') }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforelse
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-center md:justify-between mt-6 mb-6">
|
<div class="flex justify-center md:justify-between mt-6 mb-6">
|
||||||
<span class="text-gray-700 text-sm hidden md:block">Showing {{ $payment_methods->firstItem() }} to {{ $payment_methods->lastItem() }} out of {{ $payment_methods->total() }}</span>
|
@if($payment_methods->total() > 0)
|
||||||
|
<span class="text-gray-700 text-sm hidden md:block">
|
||||||
|
{{ ctrans('texts.showing_x_of', ['first' => $payment_methods->firstItem(), 'last' => $payment_methods->lastItem(), 'total' => $payment_methods->total()]) }}
|
||||||
|
</span>
|
||||||
|
@endif
|
||||||
{{ $payment_methods->links() }}
|
{{ $payment_methods->links() }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
@ -43,8 +43,8 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@foreach($payments as $payment)
|
@forelse($payments as $payment)
|
||||||
<tr class="cursor-pointer bg-white group hover:bg-gray-100">
|
<tr class="bg-white group hover:bg-gray-100">
|
||||||
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
||||||
{{ $payment->formatDate($payment->date, $payment->client->date_format()) }}
|
{{ $payment->formatDate($payment->date, $payment->client->date_format()) }}
|
||||||
</td>
|
</td>
|
||||||
@ -66,12 +66,22 @@
|
|||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
@empty
|
||||||
|
<tr class="bg-white group hover:bg-gray-100">
|
||||||
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500" colspan="100%">
|
||||||
|
{{ ctrans('texts.no_results') }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforelse
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-center md:justify-between mt-6 mb-6">
|
<div class="flex justify-center md:justify-between mt-6 mb-6">
|
||||||
<span class="text-gray-700 text-sm hidden md:block">Showing {{ $payments->firstItem() }} to {{ $payments->lastItem() }} out of {{ $payments->total() }}</span>
|
@if($payments->total() > 0)
|
||||||
|
<span class="text-gray-700 text-sm hidden md:block">
|
||||||
|
{{ ctrans('texts.showing_x_of', ['first' => $payments->firstItem(), 'last' => $payments->lastItem(), 'total' => $payments->total()]) }}
|
||||||
|
</span>
|
||||||
|
@endif
|
||||||
{{ $payments->links() }}
|
{{ $payments->links() }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
@ -67,7 +67,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@foreach($quotes as $quote)
|
@forelse($quotes as $quote)
|
||||||
<tr class="bg-white group hover:bg-gray-100">
|
<tr class="bg-white group hover:bg-gray-100">
|
||||||
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 font-medium text-gray-900">
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 font-medium text-gray-900">
|
||||||
<label>
|
<label>
|
||||||
@ -95,13 +95,23 @@
|
|||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
@empty
|
||||||
|
<tr class="bg-white group hover:bg-gray-100">
|
||||||
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500" colspan="100%">
|
||||||
|
{{ ctrans('texts.no_results') }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforelse
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-center md:justify-between mt-6 mb-6">
|
<div class="flex justify-center md:justify-between mt-6 mb-6">
|
||||||
<span class="text-gray-700 text-sm hidden md:block">Showing {{ $quotes->firstItem() }} to {{ $quotes->lastItem() }} out of {{ $quotes->total() }}</span>
|
@if($quotes->total() > 0)
|
||||||
|
<span class="text-gray-700 text-sm hidden md:block">
|
||||||
|
{{ ctrans('texts.showing_x_of', ['first' => $quotes->firstItem(), 'last' => $quotes->lastItem(), 'total' => $quotes->total()]) }}
|
||||||
|
</span>
|
||||||
|
@endif
|
||||||
{{ $quotes->links() }}
|
{{ $quotes->links() }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@foreach($invoices as $invoice)
|
@forelse($invoices as $invoice)
|
||||||
<tr class="bg-white group hover:bg-gray-100">
|
<tr class="bg-white group hover:bg-gray-100">
|
||||||
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500">
|
||||||
{{ \App\Models\RecurringInvoice::frequencyForKey($invoice->frequency_id) }}
|
{{ \App\Models\RecurringInvoice::frequencyForKey($invoice->frequency_id) }}
|
||||||
@ -67,13 +67,23 @@
|
|||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
@empty
|
||||||
|
<tr class="bg-white group hover:bg-gray-100">
|
||||||
|
<td class="px-6 py-4 whitespace-no-wrap text-sm leading-5 text-gray-500" colspan="100%">
|
||||||
|
{{ ctrans('texts.no_results') }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforelse
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex justify-center md:justify-between mt-6 mb-6">
|
<div class="flex justify-center md:justify-between mt-6 mb-6">
|
||||||
<span class="text-gray-700 text-sm hidden md:block">Showing {{ $invoices->firstItem() }} to {{ $invoices->lastItem() }} out of {{ $invoices->total() }}</span>
|
@if($quotes->total() > 0)
|
||||||
|
<span class="text-gray-700 text-sm hidden md:block">
|
||||||
|
{{ ctrans('texts.showing_x_of', ['first' => $quotes->firstItem(), 'last' => $quotes->lastItem(), 'total' => $quotes->total()]) }}
|
||||||
|
</span>
|
||||||
|
@endif
|
||||||
{{ $invoices->links() }}
|
{{ $invoices->links() }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
<div class="grid grid-cols-6 gap-6">
|
<div class="grid grid-cols-6 gap-6">
|
||||||
<div class="col-span-6 sm:col-span-3">
|
<div class="col-span-6 sm:col-span-3">
|
||||||
<label for="first_name" class="input-label">@lang('texts.first_name')</label>
|
<label for="first_name" class="input-label">@lang('texts.first_name')</label>
|
||||||
<input id="first_name" class="input" name="first_name"
|
<input id="first_name" class="input w-full" name="first_name"
|
||||||
value="{{ auth()->user()->first_name }}"/>
|
value="{{ auth()->user()->first_name }}"/>
|
||||||
@error('first_name')
|
@error('first_name')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
<div class="col-span-6 sm:col-span-3">
|
<div class="col-span-6 sm:col-span-3">
|
||||||
<label for="last_name" class="input-label">@lang('texts.last_name')</label>
|
<label for="last_name" class="input-label">@lang('texts.last_name')</label>
|
||||||
<input id="last_name" class="input" name="last_name"
|
<input id="last_name" class="input w-full" name="last_name"
|
||||||
value="{{ auth()->user()->last_name }}"/>
|
value="{{ auth()->user()->last_name }}"/>
|
||||||
@error('last_name')
|
@error('last_name')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
@ -51,7 +51,7 @@
|
|||||||
|
|
||||||
<div class="col-span-6 sm:col-span-4">
|
<div class="col-span-6 sm:col-span-4">
|
||||||
<label for="email_address" class="input-label">@lang('texts.email_address')</label>
|
<label for="email_address" class="input-label">@lang('texts.email_address')</label>
|
||||||
<input id="email_address" class="input" type="email" name="email"
|
<input id="email_address" class="input w-full" type="email" name="email"
|
||||||
value="{{ auth()->user()->email }}"/>
|
value="{{ auth()->user()->email }}"/>
|
||||||
@error('email')
|
@error('email')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
@ -62,7 +62,7 @@
|
|||||||
|
|
||||||
<div class="col-span-6 sm:col-span-4">
|
<div class="col-span-6 sm:col-span-4">
|
||||||
<label for="phone" class="input-label">@lang('texts.phone')</label>
|
<label for="phone" class="input-label">@lang('texts.phone')</label>
|
||||||
<input id="phone" class="input" name="phone" value="{{ auth()->user()->phone }}"/>
|
<input id="phone" class="input w-full" name="phone" value="{{ auth()->user()->phone }}"/>
|
||||||
@error('phone')
|
@error('phone')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
{{ $message }}
|
{{ $message }}
|
||||||
@ -72,7 +72,7 @@
|
|||||||
|
|
||||||
<div class="col-span-6 sm:col-span-6 lg:col-span-3">
|
<div class="col-span-6 sm:col-span-6 lg:col-span-3">
|
||||||
<label for="password" class="input-label">@lang('texts.password')</label>
|
<label for="password" class="input-label">@lang('texts.password')</label>
|
||||||
<input id="password" class="input" name="password" type="password"/>
|
<input id="password" class="input w-full" name="password" type="password"/>
|
||||||
@error('password')
|
@error('password')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
{{ $message }}
|
{{ $message }}
|
||||||
@ -82,7 +82,7 @@
|
|||||||
|
|
||||||
<div class="col-span-6 sm:col-span-3 lg:col-span-3">
|
<div class="col-span-6 sm:col-span-3 lg:col-span-3">
|
||||||
<label for="state" class="input-label">@lang('texts.confirm_password')</label>
|
<label for="state" class="input-label">@lang('texts.confirm_password')</label>
|
||||||
<input id="state" class="input" name="password_confirmation" type="password"/>
|
<input id="state" class="input w-full" name="password_confirmation" type="password"/>
|
||||||
@error('password_confirmation')
|
@error('password_confirmation')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
{{ $message }}
|
{{ $message }}
|
||||||
@ -123,7 +123,7 @@
|
|||||||
<div class="grid grid-cols-6 gap-6">
|
<div class="grid grid-cols-6 gap-6">
|
||||||
<div class="col-span-6 sm:col-span-3">
|
<div class="col-span-6 sm:col-span-3">
|
||||||
<label for="street" class="input-label">@lang('texts.name')</label>
|
<label for="street" class="input-label">@lang('texts.name')</label>
|
||||||
<input id="name" class="input" name="name"
|
<input id="name" class="input w-full" name="name"
|
||||||
value="{{ auth()->user()->client->name }}"/>
|
value="{{ auth()->user()->client->name }}"/>
|
||||||
@error('name')
|
@error('name')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
@ -133,7 +133,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-span-6 sm:col-span-3">
|
<div class="col-span-6 sm:col-span-3">
|
||||||
<label for="website" class="input-label">@lang('texts.website')</label>
|
<label for="website" class="input-label">@lang('texts.website')</label>
|
||||||
<input id="website" class="input" name="last_name"
|
<input id="website" class="input w-full" name="last_name"
|
||||||
value="{{ auth()->user()->client->website }}"/>
|
value="{{ auth()->user()->client->website }}"/>
|
||||||
@error('website')
|
@error('website')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
@ -176,7 +176,7 @@
|
|||||||
<div class="grid grid-cols-6 gap-6">
|
<div class="grid grid-cols-6 gap-6">
|
||||||
<div class="col-span-6 sm:col-span-4">
|
<div class="col-span-6 sm:col-span-4">
|
||||||
<label for="address1" class="input-label">@lang('texts.address1')</label>
|
<label for="address1" class="input-label">@lang('texts.address1')</label>
|
||||||
<input id="address1" class="input" name="address1"
|
<input id="address1" class="input w-full" name="address1"
|
||||||
value="{{ auth()->user()->client->address1 }}"/>
|
value="{{ auth()->user()->client->address1 }}"/>
|
||||||
@error('address1')
|
@error('address1')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
@ -186,7 +186,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-span-6 sm:col-span-3">
|
<div class="col-span-6 sm:col-span-3">
|
||||||
<label for="address2" class="input-label">@lang('texts.address2')</label>
|
<label for="address2" class="input-label">@lang('texts.address2')</label>
|
||||||
<input id="address2" class="input" name="address2"
|
<input id="address2" class="input w-full" name="address2"
|
||||||
value="{{ auth()->user()->client->address2 }}"/>
|
value="{{ auth()->user()->client->address2 }}"/>
|
||||||
@error('address2')
|
@error('address2')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
@ -196,7 +196,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-span-6 sm:col-span-3">
|
<div class="col-span-6 sm:col-span-3">
|
||||||
<label for="city" class="input-label">@lang('texts.city')</label>
|
<label for="city" class="input-label">@lang('texts.city')</label>
|
||||||
<input id="city" class="input" name="city"
|
<input id="city" class="input w-full" name="city"
|
||||||
value="{{ auth()->user()->client->city }}"/>
|
value="{{ auth()->user()->client->city }}"/>
|
||||||
@error('city')
|
@error('city')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
@ -206,7 +206,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-span-6 sm:col-span-2">
|
<div class="col-span-6 sm:col-span-2">
|
||||||
<label for="state" class="input-label">@lang('texts.state')</label>
|
<label for="state" class="input-label">@lang('texts.state')</label>
|
||||||
<input id="state" class="input" name="state"
|
<input id="state" class="input w-full" name="state"
|
||||||
value="{{ auth()->user()->client->state }}"/>
|
value="{{ auth()->user()->client->state }}"/>
|
||||||
@error('state')
|
@error('state')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
@ -216,7 +216,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-span-6 sm:col-span-2">
|
<div class="col-span-6 sm:col-span-2">
|
||||||
<label for="postal_code" class="input-label">@lang('texts.postal_code')</label>
|
<label for="postal_code" class="input-label">@lang('texts.postal_code')</label>
|
||||||
<input id="postal_code" class="input" name="postal_code"
|
<input id="postal_code" class="input w-full" name="postal_code"
|
||||||
value="{{ auth()->user()->client->postal_code }}"/>
|
value="{{ auth()->user()->client->postal_code }}"/>
|
||||||
@error('postal_code')
|
@error('postal_code')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
@ -226,10 +226,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-span-6 sm:col-span-2">
|
<div class="col-span-6 sm:col-span-2">
|
||||||
<label for="country" class="input-label">@lang('texts.country')</label>
|
<label for="country" class="input-label">@lang('texts.country')</label>
|
||||||
<select id="country" class="input form-select" name="country">
|
<select id="country" class="input w-full form-select" name="country">
|
||||||
@foreach($countries as $country)
|
@foreach($countries as $country)
|
||||||
<option
|
<option
|
||||||
{{ $country == auth()->user()->client->country->id ? 'selected' : null }} value="{{ $country->id }}">{{ $country->full_name }}</option>
|
{{ $country == auth()->user()->client->country->id ? 'selected' : null }} value="{{ $country->id }}">
|
||||||
|
{{ $country->iso_3166_2 }}
|
||||||
|
({{ $country->name }})
|
||||||
|
</option>
|
||||||
@endforeach
|
@endforeach
|
||||||
</select>
|
</select>
|
||||||
@error('country')
|
@error('country')
|
||||||
@ -273,7 +276,7 @@
|
|||||||
<div class="col-span-6 sm:col-span-4">
|
<div class="col-span-6 sm:col-span-4">
|
||||||
<label for="shipping_address1"
|
<label for="shipping_address1"
|
||||||
class="input-label">@lang('texts.shipping_address1')</label>
|
class="input-label">@lang('texts.shipping_address1')</label>
|
||||||
<input id="shipping_address1" class="input" name="shipping_address1"
|
<input id="shipping_address1" class="input w-full" name="shipping_address1"
|
||||||
value="{{ auth()->user()->client->shipping_address1 }}"/>
|
value="{{ auth()->user()->client->shipping_address1 }}"/>
|
||||||
@error('shipping_address1')
|
@error('shipping_address1')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
@ -284,7 +287,7 @@
|
|||||||
<div class="col-span-6 sm:col-span-3">
|
<div class="col-span-6 sm:col-span-3">
|
||||||
<label for="shipping_address2"
|
<label for="shipping_address2"
|
||||||
class="input-label">@lang('texts.shipping_address2')</label>
|
class="input-label">@lang('texts.shipping_address2')</label>
|
||||||
<input id="shipping_address2" class="input" name="shipping_address2"
|
<input id="shipping_address2" class="input w-full" name="shipping_address2"
|
||||||
value="{{ auth()->user()->client->shipping_address2 }}"/>
|
value="{{ auth()->user()->client->shipping_address2 }}"/>
|
||||||
@error('shipping_address2')
|
@error('shipping_address2')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
@ -294,7 +297,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-span-6 sm:col-span-3">
|
<div class="col-span-6 sm:col-span-3">
|
||||||
<label for="shipping_city" class="input-label">@lang('texts.shipping_city')</label>
|
<label for="shipping_city" class="input-label">@lang('texts.shipping_city')</label>
|
||||||
<input id="shipping_city" class="input" name="shipping_city"
|
<input id="shipping_city" class="input w-full" name="shipping_city"
|
||||||
value="{{ auth()->user()->client->shipping_city }}"/>
|
value="{{ auth()->user()->client->shipping_city }}"/>
|
||||||
@error('shipping_city')
|
@error('shipping_city')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
@ -305,7 +308,7 @@
|
|||||||
<div class="col-span-6 sm:col-span-2">
|
<div class="col-span-6 sm:col-span-2">
|
||||||
<label for="shipping_state"
|
<label for="shipping_state"
|
||||||
class="input-label">@lang('texts.shipping_state')</label>
|
class="input-label">@lang('texts.shipping_state')</label>
|
||||||
<input id="shipping_state" class="input" name="shipping_state"
|
<input id="shipping_state" class="input w-full" name="shipping_state"
|
||||||
value="{{ auth()->user()->client->shipping_state }}"/>
|
value="{{ auth()->user()->client->shipping_state }}"/>
|
||||||
@error('shipping_state')
|
@error('shipping_state')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
@ -316,7 +319,7 @@
|
|||||||
<div class="col-span-6 sm:col-span-2">
|
<div class="col-span-6 sm:col-span-2">
|
||||||
<label for="shipping_postal_code"
|
<label for="shipping_postal_code"
|
||||||
class="input-label">@lang('texts.shipping_postal_code')</label>
|
class="input-label">@lang('texts.shipping_postal_code')</label>
|
||||||
<input id="shipping_postal_code" class="input" name="shipping_postal_code"
|
<input id="shipping_postal_code" class="input w-full" name="shipping_postal_code"
|
||||||
value="{{ auth()->user()->client->shipping_postal_code }}"/>
|
value="{{ auth()->user()->client->shipping_postal_code }}"/>
|
||||||
@error('shipping_postal_code')
|
@error('shipping_postal_code')
|
||||||
<div class="validation validation-fail">
|
<div class="validation validation-fail">
|
||||||
@ -324,13 +327,15 @@
|
|||||||
</div>
|
</div>
|
||||||
@enderror
|
@enderror
|
||||||
</div>
|
</div>
|
||||||
<div class="col-span-6 sm:col-span-2">
|
<div class="col-span-4 sm:col-span-2">
|
||||||
<label for="shipping_country"
|
<label for="shipping_country"
|
||||||
class="input-label">@lang('texts.shipping_country')</label>
|
class="input-label">@lang('texts.shipping_country')</label>
|
||||||
<select id="shipping_country" class="input form-select" name="shipping_country">
|
<select id="shipping_country" class="input w-full form-select" name="shipping_country">
|
||||||
@foreach($countries as $country)
|
@foreach($countries as $country)
|
||||||
<option
|
<option
|
||||||
{{ $country == auth()->user()->client->shipping_country->id ? 'selected' : null }} value="{{ $country->id }}">{{ $country->full_name }}
|
{{ $country == auth()->user()->client->shipping_country->id ? 'selected' : null }} value="{{ $country->id }}">
|
||||||
|
{{ $country->iso_3166_2 }}
|
||||||
|
({{ $country->name }})
|
||||||
</option>
|
</option>
|
||||||
@endforeach
|
@endforeach
|
||||||
</select>
|
</select>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user