Refactor: Alamat feature

This commit is contained in:
sayasilvi 2026-03-07 23:34:32 +07:00
parent 6097b439fc
commit b0798cc569
15 changed files with 473 additions and 450 deletions

View File

@ -38,13 +38,6 @@ public function loginProcess(Request $request)
$petani = Petani::where('username', $request->username)->first(); $petani = Petani::where('username', $request->username)->first();
if ($petani && Hash::check($request->password, $petani->password)) { if ($petani && Hash::check($request->password, $petani->password)) {
// Validasi Status Akun Petani
if ($petani->status_akun == 'menunggu') {
return back()->withErrors(['login_error' => 'Akun Anda masih dalam proses verifikasi Admin.']);
}
if ($petani->status_akun == 'ditolak') {
return back()->withErrors(['login_error' => 'Pendaftaran Anda ditolak. Silakan hubungi Admin.']);
}
Auth::guard('petani')->login($petani); Auth::guard('petani')->login($petani);
$request->session()->regenerate(); $request->session()->regenerate();
@ -100,10 +93,10 @@ public function registerProcess(Request $request)
'no_hp' => $request->no_hp, 'no_hp' => $request->no_hp,
'alamat' => $request->alamat, 'alamat' => $request->alamat,
'nama_usaha' => $request->nama_usaha ?? 'Toko Tani ' . $request->nama_lengkap, 'nama_usaha' => $request->nama_usaha ?? 'Toko Tani ' . $request->nama_lengkap,
'status_akun' => 'menunggu' 'status_akun' => 'aktif'
]); ]);
return redirect('/login')->with('success', 'Registrasi Petani Berhasil! Mohon tunggu verifikasi Admin.'); return redirect('/login')->with('success', 'Registrasi Petani Berhasil! Silakan langsung Login.');
} else { } else {
Pembeli::create([ Pembeli::create([
@ -121,13 +114,9 @@ public function registerProcess(Request $request)
public function logout(Request $request) public function logout(Request $request)
{ {
// Logout semua guard untuk keamanan if (Auth::guard('admin')->check()) Auth::guard('admin')->logout();
if (Auth::guard('admin')->check()) if (Auth::guard('petani')->check()) Auth::guard('petani')->logout();
Auth::guard('admin')->logout(); if (Auth::guard('pembeli')->check()) Auth::guard('pembeli')->logout();
if (Auth::guard('petani')->check())
Auth::guard('petani')->logout();
if (Auth::guard('pembeli')->check())
Auth::guard('pembeli')->logout();
$request->session()->invalidate(); $request->session()->invalidate();
$request->session()->regenerateToken(); $request->session()->regenerateToken();

View File

@ -42,10 +42,6 @@ public function store(Request $request)
'harga' => 'required|numeric|min:0', 'harga' => 'required|numeric|min:0',
'stok' => 'required|integer|min:0', 'stok' => 'required|integer|min:0',
'deskripsi' => 'required|string', 'deskripsi' => 'required|string',
'provinsi_code' => 'required',
'kota_code' => 'required',
'kecamatan_code' => 'required',
'desa_code' => 'required',
'foto_produk' => 'required|image|mimes:jpeg,png,jpg|max:2048', 'foto_produk' => 'required|image|mimes:jpeg,png,jpg|max:2048',
'foto_tambahan.*' => 'nullable|image|mimes:jpeg,png,jpg|max:2048' 'foto_tambahan.*' => 'nullable|image|mimes:jpeg,png,jpg|max:2048'
]); ]);
@ -62,10 +58,6 @@ public function store(Request $request)
'kategori_id' => $request->kategori_id, 'kategori_id' => $request->kategori_id,
'nama_produk' => $request->nama_produk, 'nama_produk' => $request->nama_produk,
'harga' => $request->harga, 'harga' => $request->harga,
'provinsi_code' => $request->provinsi_code,
'kota_code' => $request->kota_code,
'kecamatan_code' => $request->kecamatan_code,
'desa_code' => $request->desa_code,
'stok' => $request->stok, 'stok' => $request->stok,
'deskripsi' => $request->deskripsi, 'deskripsi' => $request->deskripsi,
'foto_produk' => $fotoPath, 'foto_produk' => $fotoPath,
@ -110,10 +102,6 @@ public function update(Request $request, $id)
'nama_produk' => 'required|string|max:255', 'nama_produk' => 'required|string|max:255',
'kategori_id' => 'required|exists:kategoris,id', 'kategori_id' => 'required|exists:kategoris,id',
'harga' => 'required|numeric|min:0', 'harga' => 'required|numeric|min:0',
'provinsi_code' => 'required',
'kota_code' => 'required',
'kecamatan_code' => 'required',
'desa_code' => 'required',
'stok' => 'required|integer|min:0', 'stok' => 'required|integer|min:0',
'deskripsi' => 'required|string', 'deskripsi' => 'required|string',
'foto_produk' => 'nullable|image|mimes:jpeg,png,jpg|max:2048', 'foto_produk' => 'nullable|image|mimes:jpeg,png,jpg|max:2048',
@ -136,10 +124,6 @@ public function update(Request $request, $id)
'nama_produk' => $request->nama_produk, 'nama_produk' => $request->nama_produk,
'kategori_id' => $request->kategori_id, 'kategori_id' => $request->kategori_id,
'harga' => $request->harga, 'harga' => $request->harga,
'provinsi_code' => $request->provinsi_code,
'kota_code' => $request->kota_code,
'kecamatan_code' => $request->kecamatan_code,
'desa_code' => $request->desa_code,
'stok' => $request->stok, 'stok' => $request->stok,
'deskripsi' => $request->deskripsi, 'deskripsi' => $request->deskripsi,
'foto_produk' => $produk->foto_produk 'foto_produk' => $produk->foto_produk

View File

@ -6,6 +6,10 @@
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use Laravolt\Indonesia\Models\Province;
use Laravolt\Indonesia\Models\City;
use Laravolt\Indonesia\Models\District;
use Laravolt\Indonesia\Models\Village;
class ProfileController extends Controller class ProfileController extends Controller
{ {
@ -13,7 +17,13 @@ class ProfileController extends Controller
public function editPetani() public function editPetani()
{ {
$user = Auth::guard('petani')->user(); $user = Auth::guard('petani')->user();
return view('petani.profile', compact('user'));
$provinsis = Province::all();
$kotas = $user->provinsi_code ? City::where('province_code', $user->provinsi_code)->get() : [];
$kecamatans = $user->kota_code ? District::where('city_code', $user->kota_code)->get() : [];
$desas = $user->kecamatan_code ? Village::where('district_code', $user->kecamatan_code)->get() : [];
return view('petani.profile', compact('user', 'provinsis', 'kotas', 'kecamatans', 'desas'));
} }
public function updatePetani(Request $request) public function updatePetani(Request $request)
@ -24,11 +34,23 @@ public function updatePetani(Request $request)
'nama_lengkap' => 'required|string|max:255', 'nama_lengkap' => 'required|string|max:255',
'email' => 'required|email|unique:petanis,email,' . $user->id, 'email' => 'required|email|unique:petanis,email,' . $user->id,
'password' => 'nullable|min:6|confirmed', 'password' => 'nullable|min:6|confirmed',
'foto' => 'nullable|image|max:2048' 'foto' => 'nullable|image|max:2048',
'provinsi_code' => 'required',
'alamat' => 'required|string',
'kota_code' => 'required',
'kecamatan_code' => 'required',
'desa_code' => 'required',
'link_maps' => 'nullable|url',
]); ]);
$user->nama_lengkap = $request->nama_lengkap; $user->nama_lengkap = $request->nama_lengkap;
$user->email = $request->email; $user->email = $request->email;
$user->provinsi_code = $request->provinsi_code;
$user->alamat = $request->alamat;
$user->kota_code = $request->kota_code;
$user->kecamatan_code = $request->kecamatan_code;
$user->desa_code = $request->desa_code;
$user->link_maps = $request->link_maps;
if ($request->filled('password')) { if ($request->filled('password')) {
$user->password = Hash::make($request->password); $user->password = Hash::make($request->password);
@ -38,12 +60,11 @@ public function updatePetani(Request $request)
if ($user->foto && Storage::exists('public/' . $user->foto)) { if ($user->foto && Storage::exists('public/' . $user->foto)) {
Storage::delete('public/' . $user->foto); Storage::delete('public/' . $user->foto);
} }
$path = $request->file('foto')->store('avatars', 'public'); $user->foto = $request->file('foto')->store('avatars', 'public');
$user->foto = $path;
} }
$user->save(); $user->save();
return back()->with('success', 'Profil berhasil diperbarui!'); return back()->with('success', 'Profil dan Lokasi berhasil diperbarui!');
} }
// --- FITUR PEMBELI --- // --- FITUR PEMBELI ---

View File

@ -21,6 +21,11 @@ class Petani extends Authenticatable implements CanResetPassword
'password', 'password',
'no_hp', 'no_hp',
'alamat', 'alamat',
'provinsi_code',
'kota_code',
'link_maps',
'kecamatan_code',
'desa_code',
'nama_usaha', 'nama_usaha',
'status_akun' 'status_akun'
]; ];
@ -43,4 +48,14 @@ public function pesanTerkirim()
{ {
return $this->morphMany(Pesan::class, 'pengirim'); return $this->morphMany(Pesan::class, 'pengirim');
} }
public function kota()
{
return $this->belongsTo(\Laravolt\Indonesia\Models\City::class, 'kota_code', 'code');
}
public function provinsi()
{
return $this->belongsTo(\Laravolt\Indonesia\Models\Province::class, 'provinsi_code', 'code');
}
} }

View File

@ -18,10 +18,6 @@ class Produk extends Model
'stok', 'stok',
'deskripsi', 'deskripsi',
'foto_produk', 'foto_produk',
'provinsi_code',
'kota_code',
'kecamatan_code',
'desa_code',
]; ];
public function petani() public function petani()

View File

@ -7,23 +7,19 @@
return new class extends Migration { return new class extends Migration {
public function up(): void public function up(): void
{ {
Schema::table('produks', function (Blueprint $table) { Schema::table('petanis', function (Blueprint $table) {
if (Schema::hasColumn('produks', 'lokasi')) { $table->char('provinsi_code', 2)->nullable()->after('alamat');
$table->dropColumn('lokasi');
}
$table->char('provinsi_code', 2)->nullable()->after('deskripsi');
$table->char('kota_code', 4)->nullable()->after('provinsi_code'); $table->char('kota_code', 4)->nullable()->after('provinsi_code');
$table->char('kecamatan_code', 7)->nullable()->after('kota_code'); $table->char('kecamatan_code', 7)->nullable()->after('kota_code');
$table->char('desa_code', 10)->nullable()->after('kecamatan_code'); $table->char('desa_code', 10)->nullable()->after('kecamatan_code');
$table->text('link_maps')->nullable()->after('desa_code');
}); });
} }
public function down(): void public function down(): void
{ {
Schema::table('produks', function (Blueprint $table) { Schema::table('petanis', function (Blueprint $table) {
$table->dropColumn(['provinsi_code', 'kota_code', 'kecamatan_code', 'desa_code']); $table->dropColumn(['provinsi_code', 'kota_code', 'kecamatan_code', 'desa_code', 'link_maps']);
$table->string('lokasi')->nullable();
}); });
} }
}; };

View File

@ -8,13 +8,10 @@
class PetaniSeeder extends Seeder class PetaniSeeder extends Seeder
{ {
/**
* Run the database seeds.
*/
public function run(): void public function run(): void
{ {
// Petani SUDAH AKTIF
DB::table('petanis')->insert([ DB::table('petanis')->insert([
[
'nik' => '3518012345678901', 'nik' => '3518012345678901',
'nama_lengkap' => 'Siti Aminah', 'nama_lengkap' => 'Siti Aminah',
'username' => 'siti_sayur', 'username' => 'siti_sayur',
@ -22,14 +19,17 @@ public function run(): void
'password' => Hash::make('password123'), 'password' => Hash::make('password123'),
'no_hp' => '085678901234', 'no_hp' => '085678901234',
'alamat' => 'Dusun Krajan RT 02 RW 01', 'alamat' => 'Dusun Krajan RT 02 RW 01',
'provinsi_code' => '35',
'kota_code' => '3518',
'kecamatan_code' => '3518100',
'desa_code' => '3518100001',
'link_maps' => 'https://maps.app.goo.gl/XXdummy123',
'nama_usaha' => 'Sayur Segar Bu Siti', 'nama_usaha' => 'Sayur Segar Bu Siti',
'status_akun' => 'aktif', 'status_akun' => 'aktif',
'created_at' => now(), 'created_at' => now(),
'updated_at' => now(), 'updated_at' => now(),
]); ],
[
// Petani BARU DAFTAR menunggu verifikasi
DB::table('petanis')->insert([
'nik' => '3518012345678902', 'nik' => '3518012345678902',
'nama_lengkap' => 'Budi Santoso', 'nama_lengkap' => 'Budi Santoso',
'username' => 'budi_tani', 'username' => 'budi_tani',
@ -37,25 +37,34 @@ public function run(): void
'password' => Hash::make('password123'), 'password' => Hash::make('password123'),
'no_hp' => '081234567890', 'no_hp' => '081234567890',
'alamat' => 'Jl. Raya Desa Sukamaju No. 12', 'alamat' => 'Jl. Raya Desa Sukamaju No. 12',
'provinsi_code' => '35',
'kota_code' => '3518',
'kecamatan_code' => '3518100',
'desa_code' => '3518100001',
'link_maps' => 'https://maps.app.goo.gl/XXdummy123',
'nama_usaha' => 'Budi Farm Organik', 'nama_usaha' => 'Budi Farm Organik',
'status_akun' => 'menunggu', 'status_akun' => 'aktif',
'created_at' => now(), 'created_at' => now(),
'updated_at' => now(), 'updated_at' => now(),
]); ],
[
// Petani DITOLAK
DB::table('petanis')->insert([
'nik' => '3518012345678903', 'nik' => '3518012345678903',
'nama_lengkap' => 'Joko Widodo', 'nama_lengkap' => 'Joko Widodo',
'username' => 'joko_tani', 'username' => 'joko_tani',
'email' => 'wiwokdetok@gmail.com', 'email' => 'joko@gmail.com',
'password' => Hash::make('password123'), 'password' => Hash::make('password123'),
'no_hp' => '089876543210', 'no_hp' => '089876543210',
'alamat' => 'Jl. Buntu No. 99', 'alamat' => 'Jl. Buntu No. 99',
'provinsi_code' => '35',
'kota_code' => '3518',
'kecamatan_code' => '3518100',
'desa_code' => '3518100001',
'link_maps' => 'https://maps.app.goo.gl/XXdummy123',
'nama_usaha' => 'Joko Tani Jaya', 'nama_usaha' => 'Joko Tani Jaya',
'status_akun' => 'ditolak', 'status_akun' => 'aktif',
'created_at' => now(), 'created_at' => now(),
'updated_at' => now(), 'updated_at' => now(),
]
]); ]);
} }
} }

View File

@ -7,23 +7,18 @@
use App\Models\ProdukImage; use App\Models\ProdukImage;
use App\Models\Kategori; use App\Models\Kategori;
use App\Models\Petani; use App\Models\Petani;
use Illuminate\Support\Str;
class ProdukSeeder extends Seeder class ProdukSeeder extends Seeder
{ {
/**
* Run the database seeds.
*/
public function run(): void public function run(): void
{ {
$petani = Petani::inRandomOrder()->first(); $petani = Petani::first();
if (!$petani) { if (!$petani) {
$this->command->error('Tabel petani kosong. Jalankan PetaniSeeder terlebih dahulu!'); $this->command->error('Tabel petani kosong. Jalankan PetaniSeeder terlebih dahulu!');
return; return;
} }
// KATEGORI
$kategoriGabah = [ $kategoriGabah = [
['nama' => 'Gabah Kering Panen (GKP)', 'slug' => 'gkp', 'ikon' => 'fas fa-seedling'], ['nama' => 'Gabah Kering Panen (GKP)', 'slug' => 'gkp', 'ikon' => 'fas fa-seedling'],
['nama' => 'Gabah Kering Giling (GKG)', 'slug' => 'gkg', 'ikon' => 'fas fa-sun'], ['nama' => 'Gabah Kering Giling (GKG)', 'slug' => 'gkg', 'ikon' => 'fas fa-sun'],
@ -42,7 +37,6 @@ public function run(): void
); );
} }
// DAFTAR PRODUK
$daftarProduk = [ $daftarProduk = [
[ [
'nama' => 'Gabah Ciherang (GKP) Baru Panen', 'nama' => 'Gabah Ciherang (GKP) Baru Panen',
@ -68,37 +62,11 @@ public function run(): void
'kategori_slug' => 'benih-padi', 'kategori_slug' => 'benih-padi',
'gallery' => 1 'gallery' => 1
], ],
[
'nama' => 'Gabah Padi Ketan Putih Super',
'harga' => 8000,
'stok' => 300,
'deskripsi' => 'Padi ketan putih murni, tidak tercampur padi biasa. Cocok untuk industri tape atau olahan ketan. Kualitas super.',
'kategori_slug' => 'padi-ketan',
'gallery' => 2
],
[
'nama' => 'Gabah Mentik Wangi Organik',
'harga' => 9000,
'stok' => 100,
'deskripsi' => 'Gabah Mentik Wangi (Pandan Wangi Jawa) ditanam full organik tanpa pestisida kimia. Aroma sangat wangi, beras pulen.',
'kategori_slug' => 'padi-organik',
'gallery' => 2
],
[
'nama' => 'Gabah Kering Giling (GKG) Situbagendit',
'harga' => 7200,
'stok' => 1500,
'deskripsi' => 'Gabah Situbagendit kering jemur 3 hari. Cocok untuk stok gudang penggilingan. Lokasi Nganjuk.',
'kategori_slug' => 'gkg',
'gallery' => 1
],
]; ];
// INSERT DATA
foreach ($daftarProduk as $item) { foreach ($daftarProduk as $item) {
$kategori = Kategori::where('slug', $item['kategori_slug'])->first(); $kategori = Kategori::where('slug', $item['kategori_slug'])->first();
// Create Produk
$produk = Produk::create([ $produk = Produk::create([
'petani_id' => $petani->id, 'petani_id' => $petani->id,
'kategori_id' => $kategori->id, 'kategori_id' => $kategori->id,

View File

@ -4,8 +4,8 @@
@section('content') @section('content')
{{-- BREADCRUMB --}} {{-- BREADCRUMB --}}
<div class="container-fluid py-3 mb-3"> <div class="container-fluid py-3 mb-3">
<div class="container"> <div class="container">
<nav aria-label="breadcrumb"> <nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0"> <ol class="breadcrumb mb-0">
@ -15,9 +15,9 @@
</ol> </ol>
</nav> </nav>
</div> </div>
</div> </div>
<div class="container pb-5"> <div class="container pb-5">
<div class="row g-4 g-lg-5"> <div class="row g-4 g-lg-5">
{{-- GALERI PRODUK --}} {{-- GALERI PRODUK --}}
@ -98,9 +98,11 @@ class="badge bg-primary bg-opacity-10 px-3 py-2 rounded-pill fw-bold border bord
<i class="fas fa-store fs-5"></i> <i class="fas fa-store fs-5"></i>
</div> </div>
<div class="flex-grow-1"> <div class="flex-grow-1">
<p class="text-muted small mb-0 fw-bold text-uppercase" style="font-size: 0.7rem;">Dijual Oleh
</p>
<h6 class="fw-bold text-dark mb-0">{{ $produk->petani->nama_lengkap ?? 'Petani Mitra' }}</h6> <h6 class="fw-bold text-dark mb-0">{{ $produk->petani->nama_lengkap ?? 'Petani Mitra' }}</h6>
<small class="text-muted d-block" style="font-size: 0.8rem;">
<i class="fas fa-map-marker-alt text-danger me-1"></i>
{{ Str::limit($produk->petani->alamat ?? 'Alamat tidak tersedia', 35) }}
</small>
</div> </div>
<button type="button" class="btn btn-outline-success btn-sm rounded-pill px-3 fw-bold" <button type="button" class="btn btn-outline-success btn-sm rounded-pill px-3 fw-bold"
data-bs-toggle="modal" data-bs-target="#chatModal"> data-bs-toggle="modal" data-bs-target="#chatModal">
@ -108,6 +110,17 @@ class="badge bg-primary bg-opacity-10 px-3 py-2 rounded-pill fw-bold border bord
</button> </button>
</div> </div>
{{-- Link Maps --}}
@if(isset($produk->petani->link_maps) && $produk->petani->link_maps != '')
<a href="{{ $produk->petani->link_maps }}" target="_blank"
class="btn btn-light border-danger text-danger border fw-bold mb-4 w-100 text-start shadow-sm"
style="border-radius: 10px;">
<i class="fas fa-map-marker-alt me-2 fs-5 align-middle"></i>
Lihat Lokasi Lahan di Google Maps
<i class="fas fa-external-link-alt float-end mt-1 text-muted opacity-50"></i>
</a>
@endif
{{-- FORM PEMBELIAN --}} {{-- FORM PEMBELIAN --}}
<form action="{{ route('cart.add') }}" method="POST"> <form action="{{ route('cart.add') }}" method="POST">
@csrf @csrf
@ -181,10 +194,10 @@ class="btn btn-outline-dark rounded-pill py-2 border-2 fw-bold fs-6"
</div> </div>
</div> </div>
@endif @endif
</div> </div>
{{-- MODAL CHAT --}} {{-- MODAL CHAT --}}
<div class="modal fade" id="chatModal" tabindex="-1" aria-hidden="true"> <div class="modal fade" id="chatModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered"> <div class="modal-dialog modal-dialog-centered">
<div class="modal-content border-0 shadow-lg rounded-3"> <div class="modal-content border-0 shadow-lg rounded-3">
<div class="modal-header bg-primary text-white border-0"> <div class="modal-header bg-primary text-white border-0">
@ -221,12 +234,12 @@ class="btn btn-outline-dark rounded-pill py-2 border-2 fw-bold fs-6"
</form> </form>
</div> </div>
</div> </div>
</div> </div>
@endsection @endsection
@section('js') @section('js')
<script> <script>
const hargaSatuan = {{ $produk->harga }}; const hargaSatuan = {{ $produk->harga }};
function updateQty(change) { function updateQty(change) {
@ -271,5 +284,5 @@ function changeImage(element) {
element.style.borderWidth = '2px'; element.style.borderWidth = '2px';
element.style.opacity = '1'; element.style.opacity = '1';
} }
</script> </script>
@endsection @endsection

View File

@ -188,7 +188,7 @@ class="btn {{ request('kategori') == '' || request('kategori') == 'Semua' ? 'btn
Semua Semua
</a> </a>
{{-- 2. Looping Kategori dari Database --}} {{-- Looping Kategori dari Database --}}
@foreach($kategoriList as $kat) @foreach($kategoriList as $kat)
<a href="#" data-kategori="{{ $kat->slug }}" <a href="#" data-kategori="{{ $kat->slug }}"
class="btn {{ request('kategori') == $kat->slug ? 'btn-primary' : 'btn-outline-primary' }} rounded-pill px-4 py-2 m-1 btn-category"> class="btn {{ request('kategori') == $kat->slug ? 'btn-primary' : 'btn-outline-primary' }} rounded-pill px-4 py-2 m-1 btn-category">

View File

@ -18,7 +18,12 @@ class="card-img-top w-100 h-100 object-fit-cover" alt="{{ $produk->nama_produk }
{{ $produk->kategori->nama_kategori ?? 'Umum' }} {{ $produk->kategori->nama_kategori ?? 'Umum' }}
</span> </span>
<h5 class="fw-bold mb-2 text-dark">{{ $produk->nama_produk }}</h5> <h6 class="fw-bold mb-1 text-dark text-truncate" style="max-width: 100%;">{{ $produk->nama_produk }}</h6>
<small class="text-muted d-block mb-2" style="font-size: 0.8rem;">
<i class="fas fa-map-marker-alt text-danger me-1"></i>
{{ Str::limit($produk->petani->alamat ?? 'Alamat tidak tersedia', 35) }}
</small>
<p class="text-muted small mb-3" style="line-height: 1.5;"> <p class="text-muted small mb-3" style="line-height: 1.5;">
{{ Str::limit($produk->deskripsi, 60) }} {{ Str::limit($produk->deskripsi, 60) }}
@ -32,6 +37,7 @@ class="card-img-top w-100 h-100 object-fit-cover" alt="{{ $produk->nama_produk }
Rp {{ number_format($produk->harga, 0, ',', '.') }} Rp {{ number_format($produk->harga, 0, ',', '.') }}
</h6> </h6>
</div> </div>
<a href="{{ route('produk.detail', $produk->id) }}" <a href="{{ route('produk.detail', $produk->id) }}"
class="btn btn-primary btn-sm rounded-pill px-3 stretched-link"> class="btn btn-primary btn-sm rounded-pill px-3 stretched-link">
Lihat <i class="fa fa-arrow-right ms-1"></i> Lihat <i class="fa fa-arrow-right ms-1"></i>

View File

@ -175,7 +175,12 @@ class="card-img-top w-100 h-100" alt="{{ $produk->nama_produk }}"
<div> <div>
<span class="badge bg-primary mb-2">{{ $produk->kategori->nama_kategori ?? 'Umum' <span class="badge bg-primary mb-2">{{ $produk->kategori->nama_kategori ?? 'Umum'
}}</span> }}</span>
<h6 class="fw-bold mb-2 text-dark">{{ $produk->nama_produk }}</h6> <h6 class="fw-bold mb-2 text-dark text-truncate" style="max-width: 100%;">{{
$produk->nama_produk }}</h6>
<small class="text-muted d-block mb-2" style="font-size: 0.8rem;">
<i class="fas fa-map-marker-alt text-danger me-1"></i>
{{ Str::limit($produk->petani->alamat ?? 'Alamat tidak tersedia', 35) }}
</small>
<p class="text-muted small mb-3">{{ Str::limit($produk->deskripsi, 60) }}</p> <p class="text-muted small mb-3">{{ Str::limit($produk->deskripsi, 60) }}</p>
</div> </div>

View File

@ -52,36 +52,6 @@
<textarea name="deskripsi" class="form-control" rows="4" <textarea name="deskripsi" class="form-control" rows="4"
placeholder="Jelaskan kualitas produk Anda..." required></textarea> placeholder="Jelaskan kualitas produk Anda..." required></textarea>
</div> </div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">Provinsi</label>
<select name="provinsi_code" id="provinsi" class="form-select" required>
<option value="">Pilih Provinsi</option>
@foreach ($provinsis as $prov)
<option value="{{ $prov->code }}">{{ $prov->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label">Kota / Kabupaten</label>
<select name="kota_code" id="kota" class="form-select" required disabled>
<option value="">Pilih Kota/Kabupaten</option>
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label">Kecamatan</label>
<select name="kecamatan_code" id="kecamatan" class="form-select" required disabled>
<option value="">Pilih Kecamatan</option>
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label">Desa / Kelurahan</label>
<select name="desa_code" id="desa" class="form-select" required disabled>
<option value="">Pilih Desa</option>
</select>
</div>
</div>
</div> </div>
{{-- UPLOAD GAMBAR --}} {{-- UPLOAD GAMBAR --}}

View File

@ -51,49 +51,6 @@
<label class="fw-bold">Deskripsi</label> <label class="fw-bold">Deskripsi</label>
<textarea name="deskripsi" class="form-control" rows="4" required>{{ $produk->deskripsi }}</textarea> <textarea name="deskripsi" class="form-control" rows="4" required>{{ $produk->deskripsi }}</textarea>
</div> </div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">Provinsi</label>
<select name="provinsi_code" id="provinsi" class="form-select" required>
<option value="">Pilih Provinsi</option>
@foreach ($provinsis as $prov)
<option value="{{ $prov->code }}" {{ $produk->provinsi_code == $prov->code ?
'selected' : '' }}>{{ $prov->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label">Kota / Kabupaten</label>
<select name="kota_code" id="kota" class="form-select" required>
<option value="">Pilih Kota/Kabupaten</option>
@foreach ($kotas as $kota)
<option value="{{ $kota->code }}" {{ $produk->kota_code == $kota->code ?
'selected' : '' }}>{{ $kota->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label">Kecamatan</label>
<select name="kecamatan_code" id="kecamatan" class="form-select" required>
<option value="">Pilih Kecamatan</option>
@foreach ($kecamatans as $kec)
<option value="{{ $kec->code }}" {{ $produk->kecamatan_code == $kec->code ?
'selected' : '' }}>{{ $kec->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label">Desa / Kelurahan</label>
<select name="desa_code" id="desa" class="form-select" required>
<option value="">Pilih Desa</option>
@foreach ($desas as $desa)
<option value="{{ $desa->code }}" {{ $produk->desa_code == $desa->code ?
'selected' : '' }}>{{ $desa->name }}</option>
@endforeach
</select>
</div>
</div>
</div> </div>
{{-- KELOLA GAMBAR --}} {{-- KELOLA GAMBAR --}}

View File

@ -4,7 +4,7 @@
@section('page-title', 'Pengaturan Akun') @section('page-title', 'Pengaturan Akun')
@section('content') @section('content')
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
@if (session('success')) @if (session('success'))
<div class="alert alert-success">{{ session('success') }}</div> <div class="alert alert-success">{{ session('success') }}</div>
@ -54,10 +54,104 @@
</div> </div>
</div> </div>
<div class="mb-3">
<label class="form-label">Alamat Lengkap (Jalan/Dusun/RT/RW)</label>
<textarea name="alamat" class="form-control" rows="3" required>{{ $user->alamat }}</textarea>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label class="form-label">Provinsi</label>
<select name="provinsi_code" id="provinsi" class="form-select" required>
<option value="">Pilih Provinsi</option>
@foreach($provinsis as $prov)
<option value="{{ $prov->code }}" {{ $user->provinsi_code == $prov->code ? 'selected' :
'' }}>{{ $prov->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label">Kota/Kabupaten</label>
<select name="kota_code" id="kota" class="form-select" required>
<option value="">Pilih Kota</option>
@foreach($kotas as $kota)
<option value="{{ $kota->code }}" {{ $user->kota_code == $kota->code ? 'selected' : ''
}}>{{ $kota->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label">Kecamatan</label>
<select name="kecamatan_code" id="kecamatan" class="form-select" required>
<option value="">Pilih Kecamatan</option>
@foreach($kecamatans as $kecamatan)
<option value="{{ $kecamatan->code }}" {{ $user->kecamatan_code == $kecamatan->code ?
'selected' : '' }}>{{ $kecamatan->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-6 mb-3">
<label class="form-label">Desa/Kelurahan</label>
<select name="desa_code" id="desa" class="form-select" required>
<option value="">Pilih Desa</option>
@foreach($desas as $desa)
<option value="{{ $desa->code }}" {{ $user->desa_code == $desa->code ? 'selected' : ''
}}>{{ $desa->name }}</option>
@endforeach
</select>
</div>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Link Google Maps Lahan/Toko (Opsional)</label>
<input type="url" name="link_maps" class="form-control"
placeholder="Contoh: http://maps.google.com/..." value="{{ $user->link_maps }}">
</div>
<button type="submit" class="btn btn-primary">Simpan Perubahan</button> <button type="submit" class="btn btn-primary">Simpan Perubahan</button>
</div> </div>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
@endsection
@section('js')
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script>
$(document).ready(function() {
$('#provinsi').on('change', function() {
let code = $(this).val();
$('#kota').html('<option value="">Memuat...</option>');
if(code) {
$.post("{{ url('get-kota') }}", {code: code, _token: '{{ csrf_token() }}'}, function(data) {
$('#kota').html('<option value="">Pilih Kota</option>');
$.each(data, function(key, val) { $('#kota').append(`<option value="${val.code}">${val.name}</option>`); });
});
}
});
$('#kota').on('change', function() {
let code = $(this).val();
$('#kecamatan').html('<option value="">Memuat...</option>');
if(code) {
$.post("{{ url('get-kecamatan') }}", {code: code, _token: '{{ csrf_token() }}'}, function(data) {
$('#kecamatan').html('<option value="">Pilih Kecamatan</option>');
$.each(data, function(key, val) { $('#kecamatan').append(`<option value="${val.code}">${val.name}</option>`); });
});
}
});
$('#kecamatan').on('change', function() {
let code = $(this).val();
$('#desa').html('<option value="">Memuat...</option>');
if(code) {
$.post("{{ url('get-desa') }}", {code: code, _token: '{{ csrf_token() }}'}, function(data) {
$('#desa').html('<option value="">Pilih Desa</option>');
$.each(data, function(key, val) { $('#desa').append(`<option value="${val.code}">${val.name}</option>`); });
});
}
});
});
</script>
@endsection @endsection