From 10f3abc047e4f40d350e2297a041867d189c8563 Mon Sep 17 00:00:00 2001 From: Bayu Lukman Yusuf Date: Tue, 20 Jan 2026 16:12:23 +0700 Subject: [PATCH] form address --- .../Controllers/Auth/AddressController.php | 118 ++ lang/en/addresses.php | 14 +- lang/id/addresses.php | 16 +- resources/views/account/addresses.blade.php | 1088 +++++++++++------ routes/web.php | 3 + 5 files changed, 887 insertions(+), 352 deletions(-) diff --git a/app/Http/Controllers/Auth/AddressController.php b/app/Http/Controllers/Auth/AddressController.php index d4cbae8..89d37ca 100644 --- a/app/Http/Controllers/Auth/AddressController.php +++ b/app/Http/Controllers/Auth/AddressController.php @@ -53,4 +53,122 @@ class AddressController extends Controller 'data' => $villages, ]; } + + public function update(Request $request, $id) + { + $request->validate([ + 'province_id' => 'required|exists:provinces,id', + 'city_id' => 'required|exists:cities,id', + 'district_id' => 'required|exists:districts,id', + 'subdistrict_id' => 'required|exists:subdistricts,id', + 'postal_code' => 'required|string|max:10', + 'address' => 'required|string|max:255', + 'is_primary' => 'boolean' + ]); + + $address = auth()->user()->addresses()->findOrFail($id); + + $address->update([ + 'province_id' => $request->province_id, + 'city_id' => $request->city_id, + 'district_id' => $request->district_id, + 'subdistrict_id' => $request->subdistrict_id, + 'postal_code' => $request->postal_code, + 'address' => $request->address, + 'is_primary' => $request->boolean('is_primary') + ]); + + // Update location names based on selected IDs + $province = Province::find($request->province_id); + $city = City::find($request->city_id); + $district = District::find($request->district_id); + $subdistrict = Subdistrict::find($request->subdistrict_id); + + $address->update([ + 'province_name' => $province?->name, + 'regency_name' => $city?->name, + 'district_name' => $district?->name, + 'village_name' => $subdistrict?->name, + ]); + + // If set as primary, unset other primary addresses + if ($request->boolean('is_primary')) { + auth()->user()->addresses() + ->where('id', '!=', $address->id) + ->update(['is_primary' => false]); + } + + return response()->json([ + 'success' => true, + 'message' => __('addresses.address_updated_successfully'), + 'address' => $address->fresh() + ]); + } + + public function store(Request $request) + { + $request->validate([ + 'province_id' => 'required|exists:provinces,id', + 'city_id' => 'required|exists:cities,id', + 'district_id' => 'required|exists:districts,id', + 'subdistrict_id' => 'required|exists:subdistricts,id', + 'postal_code' => 'required|string|max:10', + 'address' => 'required|string|max:255', + 'is_primary' => 'boolean' + ]); + + // Get location names + $province = Province::find($request->province_id); + $city = City::find($request->city_id); + $district = District::find($request->district_id); + $subdistrict = Subdistrict::find($request->subdistrict_id); + + $address = auth()->user()->addresses()->create([ + 'label' => 'Address ' . (auth()->user()->addresses()->count() + 1), + 'province_id' => $request->province_id, + 'city_id' => $request->city_id, + 'district_id' => $request->district_id, + 'subdistrict_id' => $request->subdistrict_id, + 'province_name' => $province?->name, + 'regency_name' => $city?->name, + 'district_name' => $district?->name, + 'village_name' => $subdistrict?->name, + 'postal_code' => $request->postal_code, + 'address' => $request->address, + 'is_primary' => $request->boolean('is_primary') + ]); + + // If set as primary, unset other primary addresses + if ($request->boolean('is_primary')) { + auth()->user()->addresses() + ->where('id', '!=', $address->id) + ->update(['is_primary' => false]); + } + + return response()->json([ + 'success' => true, + 'message' => __('addresses.address_created_successfully'), + 'address' => $address + ]); + } + + public function destroy($id) + { + $address = auth()->user()->addresses()->findOrFail($id); + + // Don't allow deletion if it's the only address + if (auth()->user()->addresses()->count() === 1) { + return response()->json([ + 'success' => false, + 'message' => __('addresses.cannot_delete_only_address') + ], 400); + } + + $address->delete(); + + return response()->json([ + 'success' => true, + 'message' => __('addresses.address_deleted_successfully') + ]); + } } diff --git a/lang/en/addresses.php b/lang/en/addresses.php index cb466a2..b1ddc1d 100644 --- a/lang/en/addresses.php +++ b/lang/en/addresses.php @@ -13,8 +13,8 @@ return [ 'select_city' => 'Select city...', 'district' => 'District', 'select_district' => 'Select district...', - 'village' => 'Village', - 'select_village' => 'Select village...', + 'village' => 'Subdistrict', + 'select_village' => 'Select subdistrict...', 'zip_code' => 'ZIP code', 'address' => 'Address', 'set_as_primary_address' => 'Set as primary address', @@ -29,6 +29,16 @@ return [ 'please_select_village' => 'Please select your village!', 'please_enter_zip_code' => 'Please enter your ZIP code!', 'please_enter_address' => 'Please enter your address!', + 'saving' => 'Saving', + 'error_saving_address' => 'Error saving address', + 'address_updated_successfully' => 'Address updated successfully', + 'address_created_successfully' => 'Address created successfully', + 'address_deleted_successfully' => 'Address deleted successfully', + 'cannot_delete_only_address' => 'Cannot delete the only address', + 'delete' => 'Delete', + 'cancel' => 'Cancel', + 'confirm_delete_address' => 'Are you sure you want to delete this address?', + 'this_action_cannot_be_undone' => 'This action cannot be undone.', 'regions' => [ 'africa' => 'Africa', 'asia' => 'Asia', diff --git a/lang/id/addresses.php b/lang/id/addresses.php index e7275bc..b9a2207 100644 --- a/lang/id/addresses.php +++ b/lang/id/addresses.php @@ -13,8 +13,8 @@ return [ 'select_city' => 'Pilih kota...', 'district' => 'Kecamatan', 'select_district' => 'Pilih kecamatan...', - 'village' => 'Kelurahan', - 'select_village' => 'Pilih kelurahan...', + 'village' => 'Kelurahan/Desa', + 'select_village' => 'Pilih kelurahan/desa...', 'zip_code' => 'Kode Pos', 'address' => 'Alamat', 'set_as_primary_address' => 'Jadikan alamat utama', @@ -26,9 +26,19 @@ return [ 'please_select_province' => 'Silakan pilih provinsi Anda!', 'please_select_city' => 'Silakan pilih kota Anda!', 'please_select_district' => 'Silakan pilih kecamatan Anda!', - 'please_select_village' => 'Silakan pilih kelurahan Anda!', + 'please_select_village' => 'Silakan pilih kelurahan/desa Anda!', 'please_enter_zip_code' => 'Silakan masukkan kode pos Anda!', 'please_enter_address' => 'Silakan masukkan alamat Anda!', + 'saving' => 'Menyimpan', + 'error_saving_address' => 'Terjadi kesalahan saat menyimpan alamat', + 'address_updated_successfully' => 'Alamat berhasil diperbarui', + 'address_created_successfully' => 'Alamat berhasil dibuat', + 'address_deleted_successfully' => 'Alamat berhasil dihapus', + 'cannot_delete_only_address' => 'Tidak dapat menghapus satu-satunya alamat', + 'delete' => 'Hapus', + 'cancel' => 'Batal', + 'confirm_delete_address' => 'Apakah Anda yakin ingin menghapus alamat ini?', + 'this_action_cannot_be_undone' => 'Tindakan ini tidak dapat dibatalkan.', 'regions' => [ 'africa' => 'Afrika', 'asia' => 'Asia', diff --git a/resources/views/account/addresses.blade.php b/resources/views/account/addresses.blade.php index 50ecf9c..6fcf8ad 100644 --- a/resources/views/account/addresses.blade.php +++ b/resources/views/account/addresses.blade.php @@ -30,13 +30,25 @@
-
+ + {{-- add message on success or error --}} + + + + + @csrf + @method('PUT')
-
{{ __('addresses.please_select_province') }}
@@ -46,30 +58,32 @@
- +
{{ __('addresses.please_select_city') }}
- +
{{ __('addresses.please_select_district') }}
- +
{{ __('addresses.please_select_village') }}
@@ -99,7 +113,7 @@ class="form-check-label">{{ __('addresses.set_as_primary_address') }}
-
+
@@ -107,6 +121,10 @@ data-bs-target=".primary-address-{{ $address->id }}" aria-expanded="true" aria-controls="primaryAddressPreview{{ $address->id }} primaryAddressEdit{{ $address->id }}">{{ __('addresses.close') }}
+ +
@@ -126,92 +144,61 @@
-