fix: make the address appear when added

This commit is contained in:
Valentin Lab
2025-10-04 11:30:24 +02:00
parent 9185269874
commit 7217d945a3
4 changed files with 155 additions and 26 deletions

View File

@@ -5,6 +5,7 @@ namespace App\Http\Controllers\Shop;
use App\Repositories\Shop\CustomerAddresses; use App\Repositories\Shop\CustomerAddresses;
use App\Repositories\Shop\Customers; use App\Repositories\Shop\Customers;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class CustomerController extends Controller class CustomerController extends Controller
{ {
@@ -56,6 +57,65 @@ class CustomerController extends Controller
return redirect()->route('Shop.Customers.edit'); return redirect()->route('Shop.Customers.edit');
} }
public function storeAddress(Request $request)
{
if (Customers::isNotConnected()) {
return response()->json(['message' => __('Authentification requise.')], 403);
}
$prefix = $request->input('prefix');
$types = ['deliveries' => 1, 'invoices' => 2];
if (! array_key_exists($prefix, $types)) {
return response()->json(['message' => __('Type d\'adresse inconnu.')], 422);
}
$addressData = $request->input($prefix, []);
$validator = Validator::make($addressData, [
'name' => ['nullable', 'string', 'max:150'],
'address' => ['required', 'string', 'max:255'],
'address2' => ['nullable', 'string', 'max:255'],
'zipcode' => ['required', 'string', 'max:30'],
'city' => ['required', 'string', 'max:255'],
], [
'address.required' => __('Merci de renseigner l\'adresse.'),
'zipcode.required' => __('Merci de renseigner le code postal.'),
'city.required' => __('Merci de renseigner la ville.'),
]);
if ($validator->fails()) {
return response()->json([
'message' => __('Merci de vérifier les informations saisies.'),
'errors' => $validator->errors(),
], 422);
}
$data = $validator->validated();
$customerId = Customers::getId();
$data['customer_id'] = $customerId;
$data['type'] = $types[$prefix];
if (empty($data['name'])) {
$data['name'] = Customers::getName($customerId);
}
$address = CustomerAddresses::store($data);
$html = view('Shop.Customers.partials.address_item', [
'address' => $address->toArray(),
'prefix' => $prefix,
'with_name' => true,
])->render();
return response()->json([
'success' => true,
'html' => $html,
'message' => __('Adresse enregistrée.'),
'id' => $address->id,
]);
}
public function delete_address($id) public function delete_address($id)
{ {
$address = CustomerAddresses::get($id); $address = CustomerAddresses::get($id);

View File

@@ -0,0 +1,23 @@
<div class="row mt-3 address-row" data-address-id="{{ $address['id'] }}">
<div class="col-1">
@php
$inputName = isset($prefix) && $prefix ? $prefix.'[address_id]' : 'address_id';
@endphp
<x-form.radios.icheck name="{{ $inputName }}" val="{{ $address['id'] }}" id="address_{{ $address['id'] }}" />
</div>
<div class="col-10">
@if ($with_name ?? false)
{{ $address['name'] ?? '' }}<br />
@endif
{{ $address['address'] }}<br />
@if (! empty($address['address2']))
{{ $address['address2'] }}<br />
@endif
{{ $address['zipcode'] }} {{ $address['city'] }}
</div>
<div class="col-1 text-right">
<a class="text-danger" href="{{ route('Shop.Customers.delete_address', ['id' => $address['id']]) }}">
<i class="fa fa-trash" data-id="{{ $address['id'] }}"></i>
</a>
</div>
</div>

View File

@@ -1,26 +1,12 @@
@foreach ($addresses ?? [] as $address) <div id="addresses_list_{{ $prefix }}" class="addresses-list">
<div class="row mt-3"> @foreach ($addresses ?? [] as $address)
<div class="col-1"> @include('Shop.Customers.partials.address_item', [
<x-form.radios.icheck name="@if ($prefix ?? false) {{ $prefix }} . '[]' @endif address_id" 'address' => $address,
val="{{ $address['id'] }}" id="address_{{ $address['id'] }}" /> 'prefix' => $prefix ?? null,
</div> 'with_name' => $with_name ?? false,
<div class="col-10"> ])
@if ($with_name ?? false) @endforeach
{{ $address['name'] }}<br /> </div>
@endif
{{ $address['address'] }}<br />
@if ($address['address2'])
{{ $address['address2'] }}<br />
@endif
{{ $address['zipcode'] }} {{ $address['city'] }}
</div>
<div class="col-1">
<a href="{{ route('Shop.Customers.delete_address', ['id' => $address['id']]) }}">
<i class="fa fa-trash" class="delete" data-id="{{ $address['id'] }}"></i>
</a>
</div>
</div>
@endforeach
<div id="add_address_container_{{ $prefix }}" class="green-dark d-none mb-3 mt-3"> <div id="add_address_container_{{ $prefix }}" class="green-dark d-none mb-3 mt-3">
<x-card classBody="bg-green-dark yellow" title="Nouvelle adresse" classTitle="h4"> <x-card classBody="bg-green-dark yellow" title="Nouvelle adresse" classTitle="h4">
@@ -31,6 +17,18 @@
'label' => 'Adresse', 'label' => 'Adresse',
'customer' => [], 'customer' => [],
]) ])
<div class="row mt-3">
<div class="col-md-6 mb-2">
<x-form.button id="save_address_{{ $prefix }}" class="btn-success btn-sm btn-block"
icon="fa-save" txt="Enregistrer cette adresse"
:metadata="'data-prefix='.$prefix" />
</div>
<div class="col-md-6 mb-2">
<x-form.button id="cancel_address_{{ $prefix }}" class="btn-outline-light btn-sm btn-block"
icon="fa-times" txt="Annuler"
:metadata="'data-prefix='.$prefix" />
</div>
</div>
</x-card> </x-card>
</div> </div>
@@ -43,8 +41,55 @@
@push('js') @push('js')
<script> <script>
$('#add_address_{{ $prefix }}').click(function() { (function() {
$('#add_address_container_{{ $prefix }}').toggleClass('d-none'); var prefix = '{{ $prefix }}';
}) var $formContainer = $('#add_address_container_{{ $prefix }}');
var $list = $('#addresses_list_{{ $prefix }}');
var storeUrl = '{{ route('Shop.Customers.address.store') }}';
$('#add_address_{{ $prefix }}').on('click', function() {
$formContainer.toggleClass('d-none');
});
$('#cancel_address_{{ $prefix }}').on('click', function() {
$formContainer.addClass('d-none');
$formContainer.find('input[type="text"]').val('');
});
$('#save_address_{{ $prefix }}').on('click', function() {
const data = $formContainer.find(':input').serialize();
$.ajax({
url: storeUrl,
method: 'POST',
data: data + '&prefix=' + prefix,
success: function(response) {
if (response.html) {
$list.append(response.html);
}
$formContainer.addClass('d-none');
$formContainer.find('input[type="text"]').val('');
if (response.id) {
$list.find('#address_' + response.id).prop('checked', true);
}
if (typeof initIcheck === 'function') {
initIcheck('#addresses_list_{{ $prefix }} input[type="radio"]');
}
const message = response.message || '{{ __('Adresse enregistrée.') }}';
if (typeof growl === 'function') {
growl(message, 'success');
}
},
error: function(xhr) {
let message = '{{ __('Une erreur est survenue lors de l\'enregistrement de l\'adresse.') }}';
if (xhr.responseJSON && xhr.responseJSON.message) {
message = xhr.responseJSON.message;
}
if (typeof growl === 'function') {
growl(message, 'error');
}
}
});
});
})();
</script> </script>
@endpush @endpush

View File

@@ -7,5 +7,6 @@ Route::prefix('Clients')->name('Customers.')->group(function () {
Route::get('edit', 'CustomerController@edit')->name('edit'); Route::get('edit', 'CustomerController@edit')->name('edit');
Route::post('storeProfileAjax', 'CustomerController@storeProfileAjax')->name('storeProfileAjax'); Route::post('storeProfileAjax', 'CustomerController@storeProfileAjax')->name('storeProfileAjax');
Route::post('store', 'CustomerController@store')->name('store'); Route::post('store', 'CustomerController@store')->name('store');
Route::post('address', 'CustomerController@storeAddress')->name('address.store');
Route::get('delete_address/{id}', 'CustomerController@delete_address')->name('delete_address'); Route::get('delete_address/{id}', 'CustomerController@delete_address')->name('delete_address');
}); });