form address

This commit is contained in:
Bayu Lukman Yusuf 2026-01-20 16:12:23 +07:00
parent a2caec5b74
commit 10f3abc047
5 changed files with 887 additions and 352 deletions

View File

@ -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')
]);
}
}

View File

@ -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',

View File

@ -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',

File diff suppressed because it is too large Load Diff

View File

@ -75,6 +75,9 @@ Route::put('/profile/password', [ProfileController::class, 'updatePassword'])->n
Route::get('/addresses', [AddressController::class, 'index'])->name('addresses');
Route::post('/addresses', [AddressController::class, 'store'])->name('addresses.store');
Route::put('/addresses/{id}', [AddressController::class, 'update'])->name('addresses.update');
Route::delete('/addresses/{id}', [AddressController::class, 'destroy'])->name('addresses.destroy');
Route::get('/addresses/provinces', [AddressController::class, 'provinces'])->name('addresses.provinces');
Route::get('/addresses/cities/{provinceId}', [AddressController::class, 'cities'])->name('addresses.cities');
Route::get('/addresses/districts/{provinceId}', [AddressController::class, 'districts'])->name('addresses.districts');