66use App \Models \Jurusan ;
77use App \Models \Komisariat ;
88use Filament \Pages \Page ;
9- use Filament \Support \Icons \Heroicon ;
109use BackedEnum ;
11- use Filament \Infolists \Components \ImageEntry ;
12- use Filament \Infolists \Components \TextEntry ;
13- use Filament \Infolists \Concerns \InteractsWithInfolists ;
14- use Filament \Infolists \Contracts \HasInfolists ;
15- use Filament \Schemas \Schema ;
16- use Livewire \Attributes \On ;
10+ use Filament \Support \Icons \Heroicon ;
11+ use Illuminate \Support \Facades \Storage ;
1712
18- class Visualisasi extends Page implements HasInfolists
13+ class visualisasi extends Page
1914{
20- use InteractsWithInfolists;
2115 protected static string |BackedEnum |null $ navigationIcon = Heroicon::Map;
2216 protected string $ view = 'filament.pages.visualisasi ' ;
23- protected int | string | array $ columnSpan = 'full ' ;
2417 protected static bool $ isLazy = false ;
2518
26- public ?Anggota $ selectedAnggota = null ;
27- public bool $ showAnggotaFilters = false ;
19+ // Kita kirim data mentah ke view, tidak perlu property livewire yang reaktif
20+ public $ anggotaJson ;
21+ public $ komisariatJson ;
22+ public $ jurusanOptions ;
23+ public $ komisariatOptions ;
2824
29- public $ selectedJurusan = null ;
30- public $ selectedKomisariat = null ;
31- public int $ markerCount = 0 ;
32- public function getJurusanOptionsProperty ()
33- {
34- return Jurusan::pluck ('nama_jurusan ' , 'id ' );
35- }
36- public function getKomisariatOptionsProperty ()
25+ public function mount ()
3726 {
38- return Komisariat::pluck ('nama ' , 'id ' );
39- }
40- public function getKomisariatsData (): array
41- {
42- return Komisariat::whereNotNull ('latitude ' )
27+ // 1. Siapkan Option untuk Select Filter
28+ $ this ->jurusanOptions = Jurusan::pluck ('nama_jurusan ' , 'id ' );
29+ $ this ->komisariatOptions = Komisariat::pluck ('nama ' , 'id ' );
30+
31+ // 2. Ambil Data Komisariat
32+ $ this ->komisariatJson = Komisariat::whereNotNull ('latitude ' )
4333 ->whereNotNull ('longitude ' )
44- ->get (['nama ' , 'latitude ' , 'longitude ' ])
34+ ->get (['id ' , ' nama ' , 'latitude ' , 'longitude ' ])
4535 ->toArray ();
46-
47- }
48- public function getAnggotasData (): array
49- {
50- $ query = Anggota::query ()->whereNotNull ('latitude ' )
51- ->whereNotNull ('longitude ' );
52- if ($ this ->selectedJurusan ) {
53- $ query ->where ('jurusan_id ' , $ this ->selectedJurusan );
54- }
55- if ($ this ->selectedKomisariat ) {
56- $ query ->where ('komisariat_id ' , $ this ->selectedKomisariat );
57- }
5836
59- return $ query ->get (['id ' , 'nama ' , 'latitude ' , 'longitude ' ])->toArray ();
60- }
61- public function updated ($ property ): void
62- {
63- if ($ property === 'selectedJurusan ' || $ property === 'selectedKomisariat ' ){
64- $ anggotaData = $ this ->getAnggotasData ();
65- $ this ->markerCount = count ($ anggotaData );
66- $ this ->dispatch ('redrawAnggotaMarkers ' , data: $ this ->getAnggotasData ());
67- }
68- }
69- #[On('showAnggotaDetails ' )]
70- public function showAnggotaDetails (int $ anggotaId ): void
71- {
72- $ this ->selectedAnggota = Anggota::find ($ anggotaId );
73- }
74-
75- #[On('hideInfolist ' )]
76- public function hideDetails (): void
77- {
78- $ this ->selectedAnggota = null ;
79- }
80- public function showAnggotaView (): void
81- {
82- $ this ->showAnggotaFilters = true ;
83- $ anggotaData = $ this ->getAnggotasData ();
84- $ this ->markerCount = count ($ anggotaData );
85- $ this ->dispatch ('drawAnggotaMarkers ' , data: $ this ->getAnggotasData ());
86- }
87-
88- public function showKomisariatView (): void
89- {
90- $ this ->showAnggotaFilters = false ;
91- $ this ->hideDetails ();
92- $ komisariatData = $ this ->getKomisariatsData ();
93- $ this ->markerCount = count ($ komisariatData );
94- $ this ->dispatch ('drawKomisariatMarkers ' , data: $ this ->getKomisariatsData ());
95- }
96-
97- public function infolist (Schema $ schema ): Schema
98- {
99- if (!$ this ->selectedAnggota ) {
100- return $ schema ;
101- }
37+ // 3. Ambil SEMUA Data Anggota beserta relasinya
38+ // Kita perlu select semua field yang mau ditampilkan di Detail
39+ $ anggotas = Anggota::with (['jurusan ' , 'komisariat ' ])
40+ ->whereNotNull ('latitude ' )
41+ ->whereNotNull ('longitude ' )
42+ ->get ();
10243
103- return $ schema
104- ->record ($ this ->selectedAnggota )
105- ->columns (2 )
106- ->components ([
107- ImageEntry::make ('foto ' )->square ()
108- ->defaultImageUrl (url ('/images/default-avatar.png ' )),
109- TextEntry::make ('nama ' )->label ('Nama ' ),
110- TextEntry::make ('kelamin ' )->label ('Kelamin ' ),
111- TextEntry::make ('no_wa ' )->label ('No. WA ' ),
112- TextEntry::make ('tempat_lahir ' )->label ('Tempat Lahir ' ),
113- TextEntry::make ('tanggal_lahir ' )->label ('Tanggal Lahir ' )->date ('d F Y ' ),
114- TextEntry::make ('alamat ' )->label ('Alamat ' ),
115- TextEntry::make ('jurusan.nama_jurusan ' )->label ('Jurusan ' ),
116- TextEntry::make ('komisariat.nama ' )->label ('Komisariat LK1 ' ),
117- TextEntry::make ('tahun_lk1 ' )->label ('Tahun LK1 ' ),
118- TextEntry::make ('cabang_lk2 ' )->label ('Cabang LK2 ' ),
119- TextEntry::make ('tahun_lk2 ' )->label ('Tahun LK2 ' ),
120- TextEntry::make ('badko_lk3 ' )->label ('Badko LK3 ' ),
121- TextEntry::make ('tahun_lk3 ' )->label ('Tahun LK3 ' ),
122- TextEntry::make ('tahun_lkk ' )->label ('Tahun LKK ' )->visible (fn ($ record ) => $ record ?->kelamin === 'Perempuan ' ),
123- TextEntry::make ('cabang_lkk ' )->label ('Cabang LKK ' )->visible (fn ($ record ) => $ record ?->kelamin === 'Perempuan ' ),
124- TextEntry::make ('tahun_masuk_kuliah ' )->label ('Tahun Masuk Kuliah ' ),
125- TextEntry::make ('latitude ' )->label ('Latitude ' ),
126- TextEntry::make ('longitude ' )->label ('Longitude ' ),
127- ]);
44+ // Format data agar mudah dikonsumsi JS (terutama URL gambar dan Tanggal)
45+ $ this ->anggotaJson = $ anggotas ->map (function ($ item ) {
46+ return [
47+ 'id ' => $ item ->id ,
48+ 'nama ' => $ item ->nama ,
49+ 'latitude ' => $ item ->latitude ,
50+ 'longitude ' => $ item ->longitude ,
51+ 'jurusan_id ' => $ item ->jurusan_id ,
52+ 'komisariat_id ' => $ item ->komisariat_id ,
53+ 'foto_url ' => $ item ->foto ? Storage::url ($ item ->foto ) : url ('/images/default-avatar.png ' ),
54+ 'kelamin ' => $ item ->kelamin ,
55+ 'no_wa ' => $ item ->no_wa ,
56+ 'tempat_lahir ' => $ item ->tempat_lahir ,
57+ 'tanggal_lahir ' => $ item ->tanggal_lahir ? \Carbon \Carbon::parse ($ item ->tanggal_lahir )->format ('d F Y ' ) : '- ' ,
58+ 'alamat ' => $ item ->alamat ,
59+ 'jurusan_nama ' => $ item ->jurusan ?->nama_jurusan ?? '- ' ,
60+ 'komisariat_nama ' => $ item ->komisariat ?->nama ?? '- ' ,
61+ 'tahun_lk1 ' => $ item ->tahun_lk1 ,
62+ 'tahun_masuk_kuliah ' => $ item ->tahun_masuk_kuliah ,
63+ 'tahun_lk2 ' => $ item ->tahun_lk2 ,
64+ 'cabang_lk2 ' => $ item ->cabang_lk2 ,
65+ 'tahun_lk3 ' => $ item ->tahun_lk3 ,
66+ 'badko_lk3 ' => $ item ->badko_lk3 ,
67+ 'tahun_lkk ' => $ item ->tahun_lkk ,
68+ 'cabang_lkk ' => $ item ->cabang_lkk ,
69+ 'prestasi ' => $ item ->prestasi ,
70+ ];
71+ })->toArray ();
12872 }
129- }
73+ }
0 commit comments