Abo Einmalprodukte und Bestätigung abschließen
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
2bdc9ada3c
commit
2269ce031f
57 changed files with 3647 additions and 371 deletions
56
resources/views/admin/abo/_confirm_add_modal.blade.php
Normal file
56
resources/views/admin/abo/_confirm_add_modal.blade.php
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
<div class="modal fade" id="modal-confirm-add" tabindex="-1" role="dialog" aria-labelledby="modal-confirm-add-label"
|
||||
aria-hidden="true" data-title-add="{{ __('abo.confirm_add_title_normal') }}"
|
||||
data-title-increase="{{ __('abo.confirm_increase_title') }}"
|
||||
data-info-add="{{ __('abo.confirm_add_info') }}"
|
||||
data-info-increase="{{ __('abo.confirm_increase_info') }}"
|
||||
data-per-delivery="{{ __('abo.confirm_per_delivery') }}"
|
||||
data-current-total="{{ $user_abo->getFormattedAmount() }}"
|
||||
data-next-billing-date="{{ $user_abo->next_date ?: __('abo.confirm_next_delivery_unknown') }}">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="modal-confirm-add-label"></h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="alert alert-info mb-3">
|
||||
<span id="confirm-add-info-text"></span>
|
||||
</div>
|
||||
<div class="font-weight-bold mb-2">{{ __('abo.confirm_article_details') }}</div>
|
||||
<table class="table table-sm mb-0">
|
||||
<tr>
|
||||
<td class="font-weight-bold">{{ __('order.article') }}:</td>
|
||||
<td id="confirm-add-product-name"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="font-weight-bold">{{ __('tables.quantity') }}:</td>
|
||||
<td id="confirm-add-qty-info"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="font-weight-bold">{{ __('abo.confirm_additional_costs') }}:</td>
|
||||
<td id="confirm-add-product-price"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="font-weight-bold">{{ __('abo.confirm_new_total') }}:</td>
|
||||
<td id="confirm-add-new-total"></td>
|
||||
</tr>
|
||||
</table>
|
||||
<p class="small text-muted mb-0 mt-3">
|
||||
{!! __('abo.confirm_legal_notice', [
|
||||
'nextBillingDate' => '<span id="confirm-add-next-billing-date"></span>',
|
||||
'agb' => '<a href="'.url('/agb').'" target="_blank">'.__('abo.confirm_terms_link').'</a>',
|
||||
'withdrawal' => '<a href="'.asset('download/mivita_widerruf_formular.pdf').'" target="_blank">'.__('abo.confirm_withdrawal_link').'</a>',
|
||||
]) !!}
|
||||
</p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default"
|
||||
data-dismiss="modal">{{ __('abo.confirm_add_cancel') }}</button>
|
||||
<button type="button" class="btn btn-primary"
|
||||
id="confirm-add-btn">{{ __('abo.confirm_add_ok') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -134,8 +134,10 @@
|
|||
@php
|
||||
$only_show_products = isset($only_show_products) ? $only_show_products : false;
|
||||
$add_only_mode = isset($add_only_mode) ? $add_only_mode : false;
|
||||
$split_mode = isset($split_mode) ? $split_mode : false;
|
||||
$summary = isset($summary) ? $summary : null;
|
||||
@endphp
|
||||
@include('admin.abo._order_abo_show', ['only_show_products' => $only_show_products, 'add_only_mode' => $add_only_mode])
|
||||
@include('admin.abo._order_abo_show', ['only_show_products' => $only_show_products, 'add_only_mode' => $add_only_mode, 'split_mode' => $split_mode, 'summary' => $summary])
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
@php($cartInstance = \App\Services\AboOrderCart::INSTANCE)
|
||||
@if(isset($error_message) && $error_message)
|
||||
<div class="alert alert-danger mt-2" id="insert_show_error_message">{{ $error_message }}</div>
|
||||
@endif
|
||||
|
|
@ -65,37 +66,49 @@
|
|||
<tr>
|
||||
<td colspan="4"><hr></td>
|
||||
</tr>
|
||||
@if(isset($split_mode) && $split_mode)
|
||||
<tr>
|
||||
<td colspan="3" class="text-right small"><strong>{{ __('abo.abo_subtotal') }}:</strong></td>
|
||||
<td class="text-right small">{{ formatNumber($summary['abo']['gross'] ?? 0) }} €</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3" class="text-right small no-border-top"><strong>{{ __('abo.abo_next_delivery_total') }}:</strong></td>
|
||||
<td class="text-right small no-border-top">{{ formatNumber($summary['total_with_shipping'] ?? 0) }} €</td>
|
||||
</tr>
|
||||
@else
|
||||
@php($taxFree = Yard::instance($cartInstance)->getUserTaxFree())
|
||||
<tr>
|
||||
<td colspan="3" class="text-right small"><strong>{{ __('order.subtotal') }}:</strong></td>
|
||||
<td class="text-right small">{{ Yard::instance('shopping')->subtotal() }} €</td>
|
||||
<td class="text-right small">{{ Yard::instance($cartInstance)->subtotal() }} €</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3" class="text-right small no-border-top"><strong>{{ __('Delivery country') }}:</strong></td>
|
||||
<td class="text-right small no-border-top">{{ Yard::instance('shopping')->getShippingCountryName() }}</td>
|
||||
<td class="text-right small no-border-top">{{ Yard::instance($cartInstance)->getShippingCountryName() }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3" class="text-right small no-border-top"><strong>{{ __('order.shipping_costs') }}:</strong></td>
|
||||
<td class="text-right small no-border-top">{{ Yard::instance('shopping')->shipping() }} € </td>
|
||||
<td class="text-right small no-border-top">{{ $taxFree ? Yard::instance($cartInstance)->shippingNet() : Yard::instance($cartInstance)->shipping() }} € </td>
|
||||
</tr>
|
||||
@if(Yard::instance('shopping')->getUserTaxFree())
|
||||
@if($taxFree)
|
||||
<tr>
|
||||
<td colspan="3" class="text-right small no-border-top"><strong>{{ __('order.sum_net') }}:</strong></td>
|
||||
<td class="text-right small no-border-top">{{ Yard::instance('shopping')->subtotalWithShipping() }} €</td>
|
||||
<td class="text-right small no-border-top">{{ Yard::instance($cartInstance)->subtotalWithShipping() }} €</td>
|
||||
</tr>
|
||||
@else
|
||||
<tr>
|
||||
<td colspan="3" class="text-right small no-border-top"><strong>{{ __('order.total_without_VAT') }}:</strong></td>
|
||||
<td class="text-right small no-border-top">{{ Yard::instance('shopping')->subtotalWithShipping() }} €</td>
|
||||
<td class="text-right small no-border-top">{{ Yard::instance($cartInstance)->subtotalWithShipping() }} €</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3" class="text-right small no-border-top"><strong>{{ __('order.plus_VAT') }}:</strong></td>
|
||||
<td class="text-right small no-border-top">{{ Yard::instance('shopping')->taxWithShipping() }} €</td>
|
||||
<td class="text-right small no-border-top">{{ Yard::instance($cartInstance)->taxWithShipping() }} €</td>
|
||||
</tr>
|
||||
@endif
|
||||
<tr>
|
||||
<td colspan="3" class="text-right"><strong>{{ __('order.total_sum') }}:</strong></td>
|
||||
<td class="text-right">{{ Yard::instance('shopping')->totalWithShipping() }} €</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3" class="text-right"><strong>{{ __('order.total_sum') }}:</strong></td>
|
||||
<td class="text-right">{{ Yard::instance($cartInstance)->totalWithShipping() }} €</td>
|
||||
</tr>
|
||||
@endif
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
50
resources/views/admin/abo/_order_combined_summary.blade.php
Normal file
50
resources/views/admin/abo/_order_combined_summary.blade.php
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
@php
|
||||
$cartInstance = \App\Services\AboOrderCart::INSTANCE;
|
||||
$taxFree = Yard::instance($cartInstance)->getUserTaxFree();
|
||||
@endphp
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h5 class="font-weight-semibold mb-0">{{ __('abo.combined_summary_hl') }}</h5>
|
||||
</div>
|
||||
<div class="card-body bg-light">
|
||||
<table class="table table-product m-0">
|
||||
<tbody>
|
||||
@if(($summary['one_time']['gross'] ?? 0) > 0)
|
||||
<tr>
|
||||
<td class="small"><strong>{{ __('abo.onetime_subtotal') }}:</strong></td>
|
||||
<td class="text-right small">{{ formatNumber($summary['one_time']['gross']) }} €</td>
|
||||
</tr>
|
||||
@endif
|
||||
<tr>
|
||||
<td class="small"><strong>{{ __('abo.abo_subtotal') }}:</strong></td>
|
||||
<td class="text-right small">{{ formatNumber($summary['abo']['gross'] ?? 0) }} €</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="small no-border-top"><strong>{{ __('Delivery country') }}:</strong></td>
|
||||
<td class="text-right small no-border-top">{{ Yard::instance($cartInstance)->getShippingCountryName() }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="small no-border-top"><strong>{{ __('order.shipping_costs') }}:</strong></td>
|
||||
<td class="text-right small no-border-top">{{ $taxFree ? Yard::instance($cartInstance)->shippingNet() : Yard::instance($cartInstance)->shipping() }} €</td>
|
||||
</tr>
|
||||
@if($taxFree)
|
||||
<tr>
|
||||
<td class="small no-border-top"><strong>{{ __('order.sum_net') }}:</strong></td>
|
||||
<td class="text-right small no-border-top">{{ Yard::instance($cartInstance)->subtotalWithShipping() }} €</td>
|
||||
</tr>
|
||||
@else
|
||||
<tr>
|
||||
<td class="small no-border-top"><strong>{{ __('order.total_without_VAT') }}:</strong></td>
|
||||
<td class="text-right small no-border-top">{{ Yard::instance($cartInstance)->subtotalWithShipping() }} €</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="small no-border-top"><strong>{{ __('order.plus_VAT') }}:</strong></td>
|
||||
<td class="text-right small no-border-top">{{ Yard::instance($cartInstance)->taxWithShipping() }} €</td>
|
||||
</tr>
|
||||
@endif
|
||||
<tr class="bg-white">
|
||||
<td class="pt-2 pb-2"><strong>{{ __('order.total_sum') }}:</strong></td>
|
||||
<td class="text-right font-weight-bold pt-2 pb-2">{{ Yard::instance($cartInstance)->totalWithShipping() }} €</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
23
resources/views/admin/abo/_order_onetime.blade.php
Normal file
23
resources/views/admin/abo/_order_onetime.blade.php
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<div class="card-body">
|
||||
<h5 class="font-weight-semibold mb-2">
|
||||
<i class="fa fa-bolt text-warning"></i> {{ __('abo.onetime_card_hl') }}
|
||||
</h5>
|
||||
<div class="alert alert-info">{!! __('abo.onetime_card_info') !!}</div>
|
||||
<div class="alert alert-warning small mb-3">
|
||||
<strong>{{ __('abo.onetime_important_hl') }}</strong>
|
||||
<ul class="mb-0 pl-3">
|
||||
<li>{{ __('abo.onetime_reset_hint') }}</li>
|
||||
<li>{{ __('abo.onetime_coverage_hint') }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<button type="button" class="btn btn-sm btn-warning btn-block mt-2"
|
||||
data-toggle="modal" data-target="#modals-load-content"
|
||||
data-id="{{ $user_abo->id }}"
|
||||
data-action="abo-add-onetime"
|
||||
data-route="{{ route('modal_load') }}"><i class="fa fa-plus-circle"></i> {{ __('abo.add_onetime_product') }}</button>
|
||||
|
||||
<div id="insert_show_onetime_order" data-onetime-abo-id="{{ $user_abo->id }}" class="mt-2">
|
||||
@include('admin.abo._order_onetime_show', ['user_abo' => $user_abo, 'summary' => $summary])
|
||||
</div>
|
||||
</div>
|
||||
105
resources/views/admin/abo/_order_onetime_show.blade.php
Normal file
105
resources/views/admin/abo/_order_onetime_show.blade.php
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
@php
|
||||
$one_time_items = $user_abo->one_time_items()->with('product')->get();
|
||||
$hasOneTimeChanges = \App\Services\AboOneTimeService::hasUnconfirmedChanges($user_abo);
|
||||
$hasConfirmedOneTimeItems = \App\Services\AboOneTimeService::hasConfirmedItems($user_abo);
|
||||
$oneTimeGross = $summary['one_time']['gross'] ?? 0;
|
||||
$nextDeliveryTotal = $summary['total_with_shipping'] ?? 0;
|
||||
$oneTimeConfirmationState = $hasOneTimeChanges ? 'changed' : ($hasConfirmedOneTimeItems ? 'confirmed' : 'empty');
|
||||
@endphp
|
||||
@if(isset($error_message) && $error_message)
|
||||
<div class="alert alert-danger mt-2" id="insert_onetime_error_message">{{ $error_message }}</div>
|
||||
@endif
|
||||
<div class="table-responsive">
|
||||
<table class="table table-product m-0" style="min-width:550px;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>{{ __('order.article') }}</th>
|
||||
<th>{{ __('tables.quantity') }}</th>
|
||||
<th class="text-right">{{ __('tables.price') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse($one_time_items as $one_time_item)
|
||||
<tr>
|
||||
<td>
|
||||
@if($one_time_item->product && count($one_time_item->product->images))
|
||||
<img class="img-fluid img-extra" alt="" src="{{ route('product_image', [$one_time_item->product->images->first()->slug]) }}">
|
||||
@endif
|
||||
</td>
|
||||
<td class="min-width-80">
|
||||
<strong>{{ $one_time_item->product?->getLang('name') }}</strong>
|
||||
<span class="badge badge-pill badge-warning"><i class="fa fa-bolt"></i> {{ __('abo.onetime_badge') }}</span>
|
||||
<div class="text-body">
|
||||
<div>{{ __('order.content') }}: {{ $one_time_item->product?->contents }}</div>
|
||||
<div>{{ __('order.art_no') }}: {{ $one_time_item->product?->number }}</div>
|
||||
</div>
|
||||
<div class="options">
|
||||
<a href="#" class="auto-delete-product remove_onetime_from_cart product-tooltip" data-onetime-item-id="{{ $one_time_item->id }}"><i class="fa fa-times"></i> {{ __('order.article_remove') }}</a>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="no-line-break input-group-min-w">
|
||||
<div class="input-group d-inline-flex w-auto">
|
||||
<span class="input-group-prepend">
|
||||
<button type="button" class="btn btn-secondary icon-btn md-btn-extra onetime-remove-from-basket" data-onetime-item-id="{{ $one_time_item->id }}">-</button>
|
||||
</span>
|
||||
<input type="text" class="form-control text-center input-extra onetime-input-onchange" name="onetime_qty_{{ $one_time_item->id }}" data-onetime-item-id="{{ $one_time_item->id }}" value="{{ $one_time_item->qty }}">
|
||||
<span class="input-group-append">
|
||||
<button type="button" class="btn btn-secondary icon-btn md-btn-extra onetime-add-from-basket" data-onetime-item-id="{{ $one_time_item->id }}">+</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="text-right font-weight-semibold align-top px-3 py-2" style="width: 100px;">
|
||||
<div class="no-line-break">{{ $one_time_item->getFormattedTotalPrice() }} €</div>
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="4" class="text-muted small py-3 text-center">{{ __('abo.onetime_empty') }}</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="4"><hr></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3" class="text-right small"><strong>{{ __('abo.onetime_subtotal') }}:</strong></td>
|
||||
<td class="text-right small">{{ formatNumber($summary['one_time']['gross'] ?? 0) }} €</td>
|
||||
</tr>
|
||||
@if($oneTimeGross > 0 || $hasOneTimeChanges || $hasConfirmedOneTimeItems)
|
||||
<tr>
|
||||
<td colspan="3" class="text-right small no-border-top"><strong>{{ __('abo.onetime_next_delivery_total') }}:</strong></td>
|
||||
<td class="text-right small no-border-top">{{ formatNumber($nextDeliveryTotal) }} €</td>
|
||||
</tr>
|
||||
@endif
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
@if($oneTimeGross > 0 || $hasOneTimeChanges || $hasConfirmedOneTimeItems)
|
||||
<div class="mt-3" id="onetime_confirmation_block" data-confirmation-state="{{ $oneTimeConfirmationState }}" aria-live="polite">
|
||||
<p class="small text-muted mb-2">
|
||||
{!! __('abo.onetime_legal_notice', [
|
||||
'nextBillingDate' => $user_abo->next_date ?: __('abo.confirm_next_delivery_unknown'),
|
||||
'agb' => '<a href="'.url('/agb').'" target="_blank">'.__('abo.confirm_terms_link').'</a>',
|
||||
'withdrawal' => '<a href="'.asset('download/mivita_widerruf_formular.pdf').'" target="_blank">'.__('abo.confirm_withdrawal_link').'</a>',
|
||||
]) !!}
|
||||
</p>
|
||||
@if($hasOneTimeChanges)
|
||||
<div class="d-flex flex-wrap justify-content-end">
|
||||
<button type="button" class="btn btn-default mr-2 mb-2 onetime-discard-changes">
|
||||
{{ __('abo.onetime_discard_changes') }}
|
||||
</button>
|
||||
<button type="button" class="btn btn-primary mb-2 onetime-confirm-changes">
|
||||
{{ __('abo.onetime_confirm_paid') }}
|
||||
</button>
|
||||
</div>
|
||||
@elseif($hasConfirmedOneTimeItems)
|
||||
<div class="alert alert-success small mb-0">
|
||||
<span aria-hidden="true">✓</span> {{ __('abo.onetime_confirm_success') }}
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
|
|
@ -51,13 +51,14 @@
|
|||
'data-add-only-mode' => '0',
|
||||
]) !!}
|
||||
<input type="hidden" name="is_for" value="{{ $user_abo->is_for }}">
|
||||
@php($cartInstance = \App\Services\AboOrderCart::INSTANCE)
|
||||
<div class="card mt-3">
|
||||
@include('admin.abo._order_abo', ['add_only_mode' => false])
|
||||
</div>
|
||||
|
||||
@if ($comp_products && Yard::instance('shopping')->getNumComp() > 0)
|
||||
@if ($comp_products && Yard::instance($cartInstance)->getNumComp() > 0)
|
||||
<div id="holder_html_view_comp_product">
|
||||
@include('user.order.comp_product')
|
||||
@include('user.order.comp_product', ['cart_instance' => $cartInstance])
|
||||
</div>
|
||||
@endif
|
||||
|
||||
|
|
@ -78,47 +79,7 @@
|
|||
|
||||
<a href="{{ route('admin_abos') }}" class="btn btn-sm btn-default mt-2 float-right">{{ __('back') }}</a>
|
||||
|
||||
<div class="modal fade" id="modal-confirm-add" tabindex="-1" role="dialog" aria-labelledby="modal-confirm-add-label"
|
||||
aria-hidden="true" data-title-add-only="{{ __('abo.confirm_add_title') }}"
|
||||
data-title-normal="{{ __('abo.confirm_add_title_normal') }}"
|
||||
data-warning-add-only="{{ __('abo.confirm_add_warning') }}"
|
||||
data-warning-normal="{{ __('abo.confirm_add_warning_normal') }}">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="modal-confirm-add-label"></h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="alert alert-warning mb-3">
|
||||
<i class="fa fa-exclamation-triangle"></i> <span id="confirm-add-warning-text"></span>
|
||||
</div>
|
||||
<table class="table table-sm mb-0">
|
||||
<tr>
|
||||
<td class="font-weight-bold">{{ __('order.article') }}:</td>
|
||||
<td id="confirm-add-product-name"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="font-weight-bold">{{ __('tables.price') }}:</td>
|
||||
<td id="confirm-add-product-price"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="font-weight-bold">{{ __('tables.quantity') }}:</td>
|
||||
<td id="confirm-add-qty-info"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default"
|
||||
data-dismiss="modal">{{ __('abo.confirm_add_cancel') }}</button>
|
||||
<button type="button" class="btn btn-primary"
|
||||
id="confirm-add-btn">{{ __('abo.confirm_add_ok') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@include('admin.abo._confirm_add_modal')
|
||||
|
||||
@if ($user_abo->status === 3 && $user_abo->active)
|
||||
<div class="modal fade" id="modal-retry-abo-payment" tabindex="-1" role="dialog" aria-labelledby="modal-retry-abo-payment-label" aria-hidden="true">
|
||||
|
|
|
|||
|
|
@ -69,6 +69,12 @@
|
|||
{{ Form::text('settings[abo-min-duration][val]', \App\Models\Setting::getContentBySlug('abo-min-duration'), array('class'=>'form-control')) }}
|
||||
{{ Form::hidden('settings[abo-min-duration][type]', 'int') }}
|
||||
</div>
|
||||
<div class="form-group col-sm-6">
|
||||
<label class="form-label">Zeitfenster für einmalige Produkte vor Ausführung (Tage)*</label>
|
||||
{{ Form::text('settings[abo-onetime-window-days][val]', \App\Models\Setting::getContentBySlug('abo-onetime-window-days'), array('class'=>'form-control')) }}
|
||||
{{ Form::hidden('settings[abo-onetime-window-days][type]', 'int') }}
|
||||
<small class="form-text text-muted">Anzahl Tage vor der Abo-Ausführung, in denen einmalig Produkte aus dem normalen Sortiment hinzugefügt werden können (Standard: 4).</small>
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" name="action" value="save_prepayment" class="btn btn-primary btn-sm mb-2"><i class="ion ion-ios-save"></i> speichern</button>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,20 +2,20 @@
|
|||
|
||||
@section('content')
|
||||
|
||||
<h4 class="font-weight-bold py-2 mb-2">
|
||||
{{ __('navigation.my_abo') }}
|
||||
<span class="text-muted">{{ '#'.$user_abo->payone_userid }}</span>
|
||||
</h4>
|
||||
<h4 class="font-weight-bold py-2 mb-2">
|
||||
{{ __('navigation.my_abo') }}
|
||||
<span class="text-muted">{{ '#' . $user_abo->payone_userid }}</span>
|
||||
</h4>
|
||||
|
||||
@if(Session::has('alert-error'))
|
||||
<div class="col-sm-12">
|
||||
<div class="alert alert-danger p-2 mt-2">
|
||||
<ul>
|
||||
<li>{{ Session::get('alert-error') }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
@if (Session::has('alert-error'))
|
||||
<div class="col-sm-12">
|
||||
<div class="alert alert-danger p-2 mt-2">
|
||||
<ul>
|
||||
<li>{{ Session::get('alert-error') }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="card">
|
||||
@include('admin.abo._detail')
|
||||
|
|
@ -28,15 +28,59 @@
|
|||
@php
|
||||
$addOnlyMode = App\Services\AboHelper::isAddOnlyMode($user_abo, $view);
|
||||
@endphp
|
||||
{!! Form::open(['action' => route('user_abos_update', [$view, $user_abo->id]), 'class' => 'form-horizontal', 'id'=>'cart-order-form', 'data-add-only-mode' => $addOnlyMode ? '1' : '0']) !!}
|
||||
<input type="hidden" name="is_for" value="{{ $user_abo->is_for }}">
|
||||
<div class="card mt-3">
|
||||
@include('admin.abo._order_abo', ['add_only_mode' => $addOnlyMode])
|
||||
</div>
|
||||
{!! Form::open([
|
||||
'action' => route('user_abos_update', [$view, $user_abo->id]),
|
||||
'class' => 'form-horizontal',
|
||||
'id' => 'cart-order-form',
|
||||
'data-add-only-mode' => $addOnlyMode ? '1' : '0',
|
||||
]) !!}
|
||||
<input type="hidden" name="is_for" value="{{ $user_abo->is_for }}">
|
||||
@php
|
||||
$oneTimeWindowOpen = isset($one_time_window_open) ? $one_time_window_open : false;
|
||||
$summary = isset($summary) ? $summary : null;
|
||||
$cartInstance = \App\Services\AboOrderCart::INSTANCE;
|
||||
@endphp
|
||||
@if ($oneTimeWindowOpen)
|
||||
<div class="row mt-3">
|
||||
<div class="col-lg-8">
|
||||
<div class="card" id="onetime_order_card"
|
||||
data-onetime-route="{{ route('user_abos_onetime', [$view, $user_abo->id]) }}">
|
||||
@include('admin.abo._order_onetime', ['summary' => $summary])
|
||||
</div>
|
||||
<div class="card mt-3 mb-3">
|
||||
@include('admin.abo._order_abo', [
|
||||
'add_only_mode' => $addOnlyMode,
|
||||
'split_mode' => true,
|
||||
'summary' => $summary,
|
||||
])
|
||||
</div>
|
||||
<div id="holder_html_view_comp_product">
|
||||
@if ($comp_products && Yard::instance($cartInstance)->getNumComp() > 0)
|
||||
@include('user.order.comp_product', [
|
||||
'cart_instance' => $cartInstance,
|
||||
'base_comp_count' => $base_comp_count ?? Yard::instance($cartInstance)->getNumComp(),
|
||||
])
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4" id="combined_summary_col">
|
||||
<div class="card js-abo-sticky" id="combined_summary_card">
|
||||
@include('admin.abo._order_combined_summary', ['summary' => $summary])
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@else
|
||||
<div class="card mt-3">
|
||||
@include('admin.abo._order_abo', ['add_only_mode' => $addOnlyMode])
|
||||
</div>
|
||||
|
||||
@if($comp_products && Yard::instance('shopping')->getNumComp() > 0)
|
||||
<div id="holder_html_view_comp_product">
|
||||
@include('user.order.comp_product')
|
||||
@if ($comp_products && Yard::instance($cartInstance)->getNumComp() > 0)
|
||||
@include('user.order.comp_product', [
|
||||
'cart_instance' => $cartInstance,
|
||||
'base_comp_count' => $base_comp_count ?? Yard::instance($cartInstance)->getNumComp(),
|
||||
])
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
|
||||
|
|
@ -47,54 +91,18 @@
|
|||
</div>
|
||||
|
||||
|
||||
<a href="{{route('portal.my_subscriptions')}}" class="btn btn-sm btn-default float-right">{{ __('abo.back') }}</a>
|
||||
<a href="{{ route('portal.my_subscriptions') }}" class="btn btn-sm btn-default float-right">{{ __('abo.back') }}</a>
|
||||
|
||||
<div class="modal fade" id="modal-confirm-add" tabindex="-1" role="dialog" aria-labelledby="modal-confirm-add-label" aria-hidden="true"
|
||||
data-title-add-only="{{ __('abo.confirm_add_title') }}"
|
||||
data-title-normal="{{ __('abo.confirm_add_title_normal') }}"
|
||||
data-warning-add-only="{{ __('abo.confirm_add_warning') }}"
|
||||
data-warning-normal="{{ __('abo.confirm_add_warning_normal') }}">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="modal-confirm-add-label"></h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="alert alert-warning mb-3">
|
||||
<i class="fa fa-exclamation-triangle"></i> <span id="confirm-add-warning-text"></span>
|
||||
</div>
|
||||
<table class="table table-sm mb-0">
|
||||
<tr>
|
||||
<td class="font-weight-bold">{{ __('order.article') }}:</td>
|
||||
<td id="confirm-add-product-name"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="font-weight-bold">{{ __('tables.price') }}:</td>
|
||||
<td id="confirm-add-product-price"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="font-weight-bold">{{ __('tables.quantity') }}:</td>
|
||||
<td id="confirm-add-qty-info"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">{{ __('abo.confirm_add_cancel') }}</button>
|
||||
<button type="button" class="btn btn-primary" id="confirm-add-btn">{{ __('abo.confirm_add_ok') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@include('admin.abo._confirm_add_modal')
|
||||
|
||||
@endsection
|
||||
|
||||
@section('scripts')
|
||||
<script src="{{ asset('/js/iq-modal-cart.js') }}?v=1{{ get_file_last_time('/js/iq-modal-cart.js') }}"></script>
|
||||
<script src="{{ asset('/js/iq-abo-onetime.js') }}?v=1{{ get_file_last_time('/js/iq-abo-onetime.js') }}"></script>
|
||||
<script type="application/javascript">
|
||||
var iqModalCart = IqModalCart.init();
|
||||
var iqAboOneTime = IqAboOneTime.init();
|
||||
$( document ).ready(function() {
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -53,13 +53,52 @@
|
|||
'data-add-only-mode' => $addOnlyMode ? '1' : '0',
|
||||
]) !!}
|
||||
<input type="hidden" name="is_for" value="{{ $user_abo->is_for }}">
|
||||
<div class="card mt-3">
|
||||
@include('admin.abo._order_abo', ['add_only_mode' => $addOnlyMode])
|
||||
</div>
|
||||
@php
|
||||
$oneTimeWindowOpen = isset($one_time_window_open) ? $one_time_window_open : false;
|
||||
$summary = isset($summary) ? $summary : null;
|
||||
$cartInstance = \App\Services\AboOrderCart::INSTANCE;
|
||||
@endphp
|
||||
@if ($oneTimeWindowOpen)
|
||||
<div class="row mt-3">
|
||||
<div class="col-lg-8">
|
||||
<div class="card" id="onetime_order_card"
|
||||
data-onetime-route="{{ route('user_abos_onetime', [$view, $user_abo->id]) }}">
|
||||
@include('admin.abo._order_onetime', ['summary' => $summary])
|
||||
</div>
|
||||
<div class="card mt-3">
|
||||
@include('admin.abo._order_abo', [
|
||||
'add_only_mode' => $addOnlyMode,
|
||||
'split_mode' => true,
|
||||
'summary' => $summary,
|
||||
])
|
||||
</div>
|
||||
<div id="holder_html_view_comp_product">
|
||||
@if ($comp_products && Yard::instance($cartInstance)->getNumComp() > 0)
|
||||
@include('user.order.comp_product', [
|
||||
'cart_instance' => $cartInstance,
|
||||
'base_comp_count' => $base_comp_count ?? Yard::instance($cartInstance)->getNumComp(),
|
||||
])
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4" id="combined_summary_col">
|
||||
<div class="card js-abo-sticky" id="combined_summary_card">
|
||||
@include('admin.abo._order_combined_summary', ['summary' => $summary])
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@else
|
||||
<div class="card mt-3">
|
||||
@include('admin.abo._order_abo', ['add_only_mode' => $addOnlyMode])
|
||||
</div>
|
||||
|
||||
@if ($comp_products && Yard::instance('shopping')->getNumComp() > 0)
|
||||
<div id="holder_html_view_comp_product">
|
||||
@include('user.order.comp_product')
|
||||
@if ($comp_products && Yard::instance($cartInstance)->getNumComp() > 0)
|
||||
@include('user.order.comp_product', [
|
||||
'cart_instance' => $cartInstance,
|
||||
'base_comp_count' => $base_comp_count ?? Yard::instance($cartInstance)->getNumComp(),
|
||||
])
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
|
||||
|
|
@ -71,53 +110,15 @@
|
|||
|
||||
<a href="{{ route('user_abos', [$view]) }}" class="btn btn-sm btn-default float-right">{{ __('back') }}</a>
|
||||
|
||||
<div class="modal fade" id="modal-confirm-add" tabindex="-1" role="dialog" aria-labelledby="modal-confirm-add-label"
|
||||
aria-hidden="true" data-title-add-only="{{ __('abo.confirm_add_title') }}"
|
||||
data-title-normal="{{ __('abo.confirm_add_title_normal') }}"
|
||||
data-warning-add-only="{{ __('abo.confirm_add_warning') }}"
|
||||
data-warning-normal="{{ __('abo.confirm_add_warning_normal') }}">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="modal-confirm-add-label"></h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="alert alert-warning mb-3">
|
||||
<i class="fa fa-exclamation-triangle"></i> <span id="confirm-add-warning-text"></span>
|
||||
</div>
|
||||
<table class="table table-sm mb-0">
|
||||
<tr>
|
||||
<td class="font-weight-bold">{{ __('order.article') }}:</td>
|
||||
<td id="confirm-add-product-name"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="font-weight-bold">{{ __('tables.price') }}:</td>
|
||||
<td id="confirm-add-product-price"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="font-weight-bold">{{ __('tables.quantity') }}:</td>
|
||||
<td id="confirm-add-qty-info"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default"
|
||||
data-dismiss="modal">{{ __('abo.confirm_add_cancel') }}</button>
|
||||
<button type="button" class="btn btn-primary"
|
||||
id="confirm-add-btn">{{ __('abo.confirm_add_ok') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@include('admin.abo._confirm_add_modal')
|
||||
@endsection
|
||||
|
||||
@section('scripts')
|
||||
<script src="{{ asset('/js/iq-modal-cart.js') }}?v=1{{ get_file_last_time('/js/iq-modal-cart.js') }}"></script>
|
||||
<script src="{{ asset('/js/iq-abo-onetime.js') }}?v=1{{ get_file_last_time('/js/iq-abo-onetime.js') }}"></script>
|
||||
<script type="application/javascript">
|
||||
var iqModalCart = IqModalCart.init();
|
||||
var iqAboOneTime = IqAboOneTime.init();
|
||||
$( document ).ready(function() {
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,57 @@
|
|||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">
|
||||
<i class="fa fa-bolt text-warning"></i> {{ __('abo.add_onetime_product') }}
|
||||
</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">×</button>
|
||||
</div>
|
||||
<div class="modal-body px-0">
|
||||
<div class="card-datatable pt-0 table-responsive">
|
||||
<table id="datatable-abo-onetime" class="table table-striped table-bordered" data-user_abo-id="{{ $user_abo->id }}">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>{{ __('tables.image') }}</th>
|
||||
<th>{{ __('tables.products') }}</th>
|
||||
<th>{{ __('tables.article_no') }}</th>
|
||||
<th><span class="no-line-break">{{ __('tables.price') }}</span> {{ __('tables.net') }}</th>
|
||||
<th><span class="no-line-break">{{ __('tables.price') }}</span> {{ __('tables.gross') }}</th>
|
||||
<th>{{ __('tables.points') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">{{ __('close') }}</button>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
var oTable = $('#datatable-abo-onetime').DataTable({
|
||||
"processing": true,
|
||||
"serverSide": true,
|
||||
"ajax": '{!! route('user_abo_onetime_datatable', [$user_abo->id]) !!}',
|
||||
"order": [[2, "asc"]],
|
||||
"columns": [
|
||||
{ data: 'add_card', name: 'add_card', searchable: false, orderable: false },
|
||||
{ data: 'picture', name: 'picture', searchable: false, width: 35 },
|
||||
{ data: 'name', name: 'name' },
|
||||
{ data: 'number', name: 'number' },
|
||||
{ data: 'price_net', name: 'price_net', searchable: false, orderable: false },
|
||||
{ data: 'price_gross', name: 'price_gross', searchable: false, orderable: false },
|
||||
{ data: 'points', name: 'points', searchable: false },
|
||||
],
|
||||
"bLengthChange": false,
|
||||
"iDisplayLength": 1000,
|
||||
"paging": false,
|
||||
"language": {
|
||||
"url": "/js/datatables-{{ \App::getLocale() }}.json"
|
||||
},
|
||||
drawCallback: function (settings) {
|
||||
iqAboOneTime.reInitModal();
|
||||
}
|
||||
});
|
||||
iqAboOneTime.setDatabase('#datatable-abo-onetime');
|
||||
});
|
||||
</script>
|
||||
|
|
@ -1,39 +1,49 @@
|
|||
|
||||
<div class="card mt-4">
|
||||
@php($cartInstance = $cart_instance ?? 'shopping')
|
||||
@php($baseCompCount = $base_comp_count ?? Yard::instance($cartInstance)->getNumComp())
|
||||
<div class="card mt-3 mb-3">
|
||||
<div class="card-body">
|
||||
<input type="hidden" name="count_comp_products" value="{{Yard::instance('shopping')->getNumComp()}}">
|
||||
@for($i = 1; $i <= Yard::instance('shopping')->getNumComp(); $i++)
|
||||
@if(Yard::instance('shopping')->getNumComp() > 1)
|
||||
<h5 class="border-bottom pb-2">{{$i}}. {{ __('order.shipping_compensation_product') }} </h5>
|
||||
@else
|
||||
<h5 class="border-bottom pb-2">{{ __('order.shipping_compensation_product') }} </h5>
|
||||
@endif
|
||||
<input type="hidden" name="count_comp_products" value="{{ Yard::instance($cartInstance)->getNumComp() }}">
|
||||
@for ($i = 1; $i <= Yard::instance($cartInstance)->getNumComp(); $i++)
|
||||
@if (Yard::instance($cartInstance)->getNumComp() > 1)
|
||||
<h5 class="border-bottom pb-2">{{ $i }}. {{ __('order.shipping_compensation_product') }} </h5>
|
||||
@else
|
||||
<h5 class="border-bottom pb-2">{{ __('order.shipping_compensation_product') }} </h5>
|
||||
@endif
|
||||
@if ($i > $baseCompCount)
|
||||
<div class="alert alert-warning small">
|
||||
<i class="fa fa-info-circle"></i> {{ __('order.comp_required_by_additional_products') }}
|
||||
</div>
|
||||
@endif
|
||||
<div class="row no-gutters row-bordered">
|
||||
@php($counter = 1)
|
||||
@php($checked_id = Yard::instance('shopping')->getCompProductBy($i))
|
||||
@foreach($comp_products as $comp_product)
|
||||
@php($checked_id = Yard::instance($cartInstance)->getCompProductBy($i))
|
||||
@foreach ($comp_products as $comp_product)
|
||||
<div class="media col-md-6 col-lg-4 p-4">
|
||||
<div class="d-block ui-w-80 ui-bordered mr-3">
|
||||
@if(count($comp_product->images))
|
||||
<img src="{{ route('product_image', [$comp_product->images->first()->slug]) }}" class="img-fluid" alt="">
|
||||
@if (count($comp_product->images))
|
||||
<img src="{{ route('product_image', [$comp_product->images->first()->slug]) }}"
|
||||
class="img-fluid" alt="">
|
||||
@endif
|
||||
</div>
|
||||
<div class="media-body">
|
||||
<label class="switcher switcher-secondary">
|
||||
<input type="radio" class="switcher-input" value="{{$comp_product->id}}" data-comp_num="{{$i}}" name="switchers-comp-product[{{$i}}]" @if($checked_id == $comp_product->id) checked @endif required>
|
||||
<input type="radio" class="switcher-input" value="{{ $comp_product->id }}"
|
||||
data-comp_num="{{ $i }}"
|
||||
name="switchers-comp-product[{{ $i }}]"
|
||||
@if ($checked_id == $comp_product->id) checked @endif required>
|
||||
<span class="switcher-indicator">
|
||||
<span class="switcher-yes"></span>
|
||||
<span class="switcher-no"></span>
|
||||
</span>
|
||||
</span>
|
||||
<span class="switcher-label"></span>
|
||||
</label>
|
||||
<div class="text-body mt-2"><strong>{{ $comp_product->getLang('name') }}</strong></div>
|
||||
<div class="">{{ __('order.art_no') }}: {{ $comp_product->number }}</div>
|
||||
</div>
|
||||
</div>
|
||||
@php($counter++)
|
||||
@endforeach
|
||||
@php($counter++)
|
||||
@endforeach
|
||||
</div>
|
||||
@endfor
|
||||
@endfor
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -87,8 +87,44 @@
|
|||
font-size: 85%;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.md-btn-extra {
|
||||
width: calc(1.7rem + 2px);
|
||||
line-height: 1.5rem;
|
||||
}
|
||||
|
||||
/* Nicht umbrechen, sonst stapeln sich -/+/Input untereinander (Bootstrap input-group: flex-wrap: wrap). */
|
||||
.quantity-select .input-group {
|
||||
flex-wrap: nowrap;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.quantity-select .input-group .md-btn-extra {
|
||||
flex: 0 0 auto;
|
||||
width: calc(1.7rem + 2px);
|
||||
}
|
||||
|
||||
/* Spezifischer als ".quantity-select input.form-control" (min-width: 4em / inline-block) weiter oben. */
|
||||
.quantity-select .input-group .form-control.input-extra {
|
||||
flex: 0 0 44px;
|
||||
width: 44px;
|
||||
min-width: 44px;
|
||||
display: block;
|
||||
padding: 0.28rem 0.6rem;
|
||||
font-size: 0.8rem;
|
||||
font-weight: 600;
|
||||
min-height: calc(1.8rem + 2px);
|
||||
height: calc(1.8rem + 2px);
|
||||
}
|
||||
|
||||
.input-group-min-w {
|
||||
min-width: 102px;
|
||||
}
|
||||
</style>
|
||||
<div id="cartContent">
|
||||
@if (isset($error_message) && $error_message)
|
||||
<div class="alert alert-danger mt-2" id="insert_show_error_message">{{ $error_message }}</div>
|
||||
@endif
|
||||
|
||||
<div class="yard-items-head d-none d-sm-block">
|
||||
<div class="row">
|
||||
|
|
@ -176,10 +212,27 @@
|
|||
<span class="text-right product-tooltip" data-toggle="tooltip"
|
||||
title="{{ __('order.compensation_product') }}">1 x</span>
|
||||
@else
|
||||
<input type="number" class="form-control text-center cart-input-event-onchange"
|
||||
data-row-id="{{ $row->rowId }}" data-product-id="{{ $product->id }}"
|
||||
value="{{ $row->qty }}" name="quantity[{{ $row->rowId }}]"
|
||||
maxlength="3" max="999" min="1">
|
||||
<div class="no-line-break input-group-min-w d-inline-block">
|
||||
<div class="input-group d-inline-flex w-auto">
|
||||
<span class="input-group-prepend">
|
||||
<button type="button"
|
||||
class="btn btn-secondary icon-btn md-btn-extra cart-remove-event"
|
||||
data-row-id="{{ $row->rowId }}"
|
||||
data-product-id="{{ $product->id }}">-</button>
|
||||
</span>
|
||||
<input type="text"
|
||||
class="form-control text-center input-extra cart-input-event-onchange"
|
||||
data-row-id="{{ $row->rowId }}"
|
||||
data-product-id="{{ $product->id }}" value="{{ $row->qty }}"
|
||||
name="quantity[{{ $row->rowId }}]">
|
||||
<span class="input-group-append">
|
||||
<button type="button"
|
||||
class="btn btn-secondary icon-btn md-btn-extra cart-add-event"
|
||||
data-row-id="{{ $row->rowId }}"
|
||||
data-product-id="{{ $product->id }}">+</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<div class="price-total text-right">
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue