Perbarui logika pengambilan data penerima penyaluran di WargaDashboardController dengan menambahkan pengecekan ID pengguna dan logging untuk debugging. Modifikasi tampilan di WargaPenerimaanView dan WargaPengaduanView untuk meningkatkan pengalaman pengguna dengan menambahkan indikator refresh dan memperbaiki layout. Perbarui BantuanCard untuk menampilkan informasi dengan lebih baik dan menambahkan tombol aksi untuk detail. Implementasikan CustomScrollView untuk stabilitas tampilan yang lebih baik.

This commit is contained in:
Khafidh Fuadi
2025-03-25 21:54:15 +07:00
parent 3b963178f4
commit e881b2e37f
8 changed files with 994 additions and 586 deletions

View File

@ -2,27 +2,27 @@ C/C++ Structured LogO
M M
KC:\dev\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txtC KC:\dev\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txtC
A A
?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD> ?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  <08>ɚ<EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>
 
}D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\additional_project_files.txt  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2  <20><><EFBFBD><EFBFBD><EFBFBD>2~ }D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\additional_project_files.txt  <08>ɚ<EFBFBD><EFBFBD>2  <20><><EFBFBD><EFBFBD><EFBFBD>2~
| |
zD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\android_gradle_build.json  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD> zD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\android_gradle_build.json  <08>ɚ<EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>
<EFBFBD> <EFBFBD>
D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\android_gradle_build_mini.json  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2p D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\android_gradle_build_mini.json  <08>ɚ<EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2p
n n
lD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\build.ninja  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<18><> <20><><EFBFBD><EFBFBD><EFBFBD>2t lD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\build.ninja  <08>ɚ<EFBFBD><EFBFBD>2<18><> <20><><EFBFBD><EFBFBD><EFBFBD>2t
r r
pD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\build.ninja.txt  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2y pD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\build.ninja.txt  <08>ɚ<EFBFBD><EFBFBD>2y
w w
uD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\build_file_index.txt  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 uD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\build_file_index.txt  <08>ɚ<EFBFBD><EFBFBD>2
K <20><><EFBFBD><EFBFBD><EFBFBD>2z K <20><><EFBFBD><EFBFBD><EFBFBD>2z
x x
vD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\compile_commands.json  <08>ɚ<EFBFBD><C99A>2 ~ vD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\compile_commands.json  <08>ɚ<EFBFBD><C99A>2 ~
| |
zD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\compile_commands.json.bin  <08>ɚ<EFBFBD><C99A>2 zD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\compile_commands.json.bin  <08>ɚ<EFBFBD><C99A>2
<EFBFBD> <EFBFBD>
<EFBFBD> <EFBFBD>
<EFBFBD>D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\metadata_generation_command.txt  <08>ɚ<EFBFBD><C99A>2 <18> <20><><EFBFBD><EFBFBD><EFBFBD>2w <EFBFBD>D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\metadata_generation_command.txt  <08>ɚ<EFBFBD><C99A>2 <18> <20><><EFBFBD><EFBFBD><EFBFBD>2w
u u
sD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\prefab_config.json  <08>ɚ<EFBFBD><C99A>2 sD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\prefab_config.json  <08>ɚ<EFBFBD><C99A>2
 ( <20><><EFBFBD><EFBFBD><EFBFBD>2|  ( <20><><EFBFBD><EFBFBD><EFBFBD>2|

View File

@ -2,27 +2,27 @@ C/C++ Structured LogO
M M
KC:\dev\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txtC KC:\dev\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txtC
A A
?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD> ?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  <08>Ԛ<EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>
<EFBFBD> <EFBFBD>
D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\additional_project_files.txt  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2  <20><><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD> D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\additional_project_files.txt  <08>Ԛ<EFBFBD><EFBFBD>2  <20><><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>
~ ~
|D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\android_gradle_build.json  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD> |D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\android_gradle_build.json  <08>Ԛ<EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>
<EFBFBD> <EFBFBD>
<EFBFBD>D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\android_gradle_build_mini.json  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2r <EFBFBD>D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\android_gradle_build_mini.json  <08>Ԛ<EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2r
p p
nD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\build.ninja  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<18><> <20><><EFBFBD><EFBFBD><EFBFBD>2v nD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\build.ninja  <08>Ԛ<EFBFBD><EFBFBD>2<18><> <20><><EFBFBD><EFBFBD><EFBFBD>2v
t t
rD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\build.ninja.txt  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2{ rD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\build.ninja.txt  <08>Ԛ<EFBFBD><EFBFBD>2{
y y
wD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\build_file_index.txt  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 wD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\build_file_index.txt  <08>Ԛ<EFBFBD><EFBFBD>2
K <20><><EFBFBD><EFBFBD><EFBFBD>2| K <20><><EFBFBD><EFBFBD><EFBFBD>2|
z z
xD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\compile_commands.json  <08>Ԛ<EFBFBD><D49A>2 <09> xD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\compile_commands.json  <08>Ԛ<EFBFBD><D49A>2 <09>
~ ~
|D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\compile_commands.json.bin  <08>Ԛ<EFBFBD><D49A>2 |D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\compile_commands.json.bin  <08>Ԛ<EFBFBD><D49A>2
<EFBFBD> <EFBFBD>
<EFBFBD> <EFBFBD>
<EFBFBD>D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\metadata_generation_command.txt  <08>Ԛ<EFBFBD><D49A>2 <18> <20><><EFBFBD><EFBFBD><EFBFBD>2y <EFBFBD>D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\metadata_generation_command.txt  <08>Ԛ<EFBFBD><D49A>2 <18> <20><><EFBFBD><EFBFBD><EFBFBD>2y
w w
uD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\prefab_config.json  <08>Ԛ<EFBFBD><D49A>2 uD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\prefab_config.json  <08>Ԛ<EFBFBD><D49A>2
 ( <20><><EFBFBD><EFBFBD><EFBFBD>2~  ( <20><><EFBFBD><EFBFBD><EFBFBD>2~

View File

@ -2,27 +2,27 @@ C/C++ Structured LogO
M M
KC:\dev\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txtC KC:\dev\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txtC
A A
?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  ؔ<EFBFBD><EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2{ ?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  <08>ښ<EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2{
y y
wD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\additional_project_files.txt  ؔ<EFBFBD><EFBFBD><EFBFBD>2  <20><><EFBFBD><EFBFBD><EFBFBD>2x wD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\additional_project_files.txt  <08>ښ<EFBFBD><EFBFBD>2  <20><><EFBFBD><EFBFBD><EFBFBD>2x
v v
tD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\android_gradle_build.json  ؔ<EFBFBD><EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2} tD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\android_gradle_build.json  <08>ښ<EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2}
{ {
yD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\android_gradle_build_mini.json  ؔ<EFBFBD><EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2j yD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\android_gradle_build_mini.json  <08>ښ<EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2j
h h
fD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\build.ninja  ؔ<EFBFBD><EFBFBD><EFBFBD>2<18><> <20><><EFBFBD><EFBFBD><EFBFBD>2n fD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\build.ninja  <08>ښ<EFBFBD><EFBFBD>2<18><> <20><><EFBFBD><EFBFBD><EFBFBD>2n
l l
jD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\build.ninja.txt  ؔ<EFBFBD><EFBFBD><EFBFBD>2s jD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\build.ninja.txt  <08>ښ<EFBFBD><EFBFBD>2s
q q
oD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\build_file_index.txt  ؔ<EFBFBD><EFBFBD><EFBFBD>2 oD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\build_file_index.txt  <08>ښ<EFBFBD><EFBFBD>2
K <20><><EFBFBD><EFBFBD><EFBFBD>2t K <20><><EFBFBD><EFBFBD><EFBFBD>2t
r r
pD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\compile_commands.json  <08>ښ<EFBFBD><DA9A>2 x pD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\compile_commands.json  <08>ښ<EFBFBD><DA9A>2 x
v v
tD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\compile_commands.json.bin  <08>ښ<EFBFBD><DA9A>2 tD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\compile_commands.json.bin  <08>ښ<EFBFBD><DA9A>2
~ ~
| |
zD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\metadata_generation_command.txt  <08>ښ<EFBFBD><DA9A>2 <18> <20><><EFBFBD><EFBFBD><EFBFBD>2q zD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\metadata_generation_command.txt  <08>ښ<EFBFBD><DA9A>2 <18> <20><><EFBFBD><EFBFBD><EFBFBD>2q
o o
mD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\prefab_config.json  <08>ښ<EFBFBD><DA9A>2 mD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\prefab_config.json  <08>ښ<EFBFBD><DA9A>2
 ( <20><><EFBFBD><EFBFBD><EFBFBD>2v  ( <20><><EFBFBD><EFBFBD><EFBFBD>2v

View File

@ -2,27 +2,27 @@ C/C++ Structured LogO
M M
KC:\dev\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txtC KC:\dev\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txtC
A A
?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2~ ?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  <08>ߚ<EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2~
| |
zD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\additional_project_files.txt  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2  <20><><EFBFBD><EFBFBD><EFBFBD>2{ zD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\additional_project_files.txt  <08>ߚ<EFBFBD><EFBFBD>2  <20><><EFBFBD><EFBFBD><EFBFBD>2{
y y
wD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\android_gradle_build.json  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD> wD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\android_gradle_build.json  <08>ߚ<EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>
~ ~
|D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\android_gradle_build_mini.json  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2m |D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\android_gradle_build_mini.json  <08>ߚ<EFBFBD><EFBFBD>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2m
k k
iD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\build.ninja  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<18><> <20><><EFBFBD><EFBFBD><EFBFBD>2q iD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\build.ninja  <08>ߚ<EFBFBD><EFBFBD>2<18><> <20><><EFBFBD><EFBFBD><EFBFBD>2q
o o
mD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\build.ninja.txt  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2v mD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\build.ninja.txt  <08>ߚ<EFBFBD><EFBFBD>2v
t t
rD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\build_file_index.txt  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 rD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\build_file_index.txt  <08>ߚ<EFBFBD><EFBFBD>2
K <20><><EFBFBD><EFBFBD><EFBFBD>2w K <20><><EFBFBD><EFBFBD><EFBFBD>2w
u u
sD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\compile_commands.json  <08>ߚ<EFBFBD><DF9A>2 { sD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\compile_commands.json  <08>ߚ<EFBFBD><DF9A>2 {
y y
wD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\compile_commands.json.bin  <08>ߚ<EFBFBD><DF9A>2 wD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\compile_commands.json.bin  <08>ߚ<EFBFBD><DF9A>2
<EFBFBD> <EFBFBD>
 
}D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\metadata_generation_command.txt  <08>ߚ<EFBFBD><DF9A>2 <18> <20><><EFBFBD><EFBFBD><EFBFBD>2t }D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\metadata_generation_command.txt  <08>ߚ<EFBFBD><DF9A>2 <18> <20><><EFBFBD><EFBFBD><EFBFBD>2t
r r
pD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\prefab_config.json  <08><><EFBFBD><EFBFBD><EFBFBD>2 pD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\prefab_config.json  <08><><EFBFBD><EFBFBD><EFBFBD>2
 ( <20><><EFBFBD><EFBFBD><EFBFBD>2y  ( <20><><EFBFBD><EFBFBD><EFBFBD>2y

View File

@ -211,8 +211,18 @@ class WargaDashboardController extends GetxController {
// Reset data terlebih dahulu untuk memastikan tidak ada data lama yang tersimpan // Reset data terlebih dahulu untuk memastikan tidak ada data lama yang tersimpan
penerimaPenyaluran.clear(); penerimaPenyaluran.clear();
// Log untuk debugging
print('DEBUG PENERIMAAN: Memulai fetchPenerimaPenyaluran()');
// Pastikan user sudah login dan memiliki ID
if (user?.id == null) {
print('DEBUG PENERIMAAN: User ID null, tidak bisa mengambil data');
return [];
}
// Gunakan langsung ID pengguna sebagai warga_id // Gunakan langsung ID pengguna sebagai warga_id
final wargaId = user!.id; final wargaId = user!.id;
print('DEBUG PENERIMAAN: Mengambil data untuk warga ID: $wargaId');
// Ambil data penerima penyaluran dengan join ke warga, stok bantuan, dan penyaluran bantuan // Ambil data penerima penyaluran dengan join ke warga, stok bantuan, dan penyaluran bantuan
final response = final response =
@ -230,10 +240,14 @@ class WargaDashboardController extends GetxController {
) )
''').eq('warga_id', wargaId).order('created_at', ascending: false); ''').eq('warga_id', wargaId).order('created_at', ascending: false);
print(
'DEBUG PENERIMAAN: Respons diterima dengan ${response.length} item');
final List<PenerimaPenyaluranModel> penerima = []; final List<PenerimaPenyaluranModel> penerima = [];
// Loop melalui setiap data penerima // Loop melalui setiap data penerima
for (var item in response) { for (var item in response) {
try {
// Pastikan data penerima sesuai dengan tipe data yang diharapkan // Pastikan data penerima sesuai dengan tipe data yang diharapkan
Map<String, dynamic> sanitizedPenerimaData = Map<String, dynamic> sanitizedPenerimaData =
Map<String, dynamic>.from(item); Map<String, dynamic>.from(item);
@ -252,7 +266,8 @@ class WargaDashboardController extends GetxController {
sanitizedPenerimaData['is_uang'] = isUang; sanitizedPenerimaData['is_uang'] = isUang;
// Ambil satuan bantuan // Ambil satuan bantuan
final satuan = sanitizedPenerimaData['stok_bantuan']['satuan'] ?? ''; final satuan =
sanitizedPenerimaData['stok_bantuan']['satuan'] ?? '';
sanitizedPenerimaData['satuan'] = satuan; sanitizedPenerimaData['satuan'] = satuan;
// Ambil nama kategori bantuan // Ambil nama kategori bantuan
@ -298,7 +313,8 @@ class WargaDashboardController extends GetxController {
} }
// Ambil kategori bantuan dari relasi langsung jika ada // Ambil kategori bantuan dari relasi langsung jika ada
if (sanitizedPenerimaData['penyaluran_bantuan']['kategori_bantuan'] != if (sanitizedPenerimaData['penyaluran_bantuan']
['kategori_bantuan'] !=
null) { null) {
final kategoriNama = sanitizedPenerimaData['penyaluran_bantuan'] final kategoriNama = sanitizedPenerimaData['penyaluran_bantuan']
['kategori_bantuan']['nama'] ?? ['kategori_bantuan']['nama'] ??
@ -313,10 +329,19 @@ class WargaDashboardController extends GetxController {
var model = PenerimaPenyaluranModel.fromJson(sanitizedPenerimaData); var model = PenerimaPenyaluranModel.fromJson(sanitizedPenerimaData);
penerima.add(model); penerima.add(model);
print('DEBUG PENERIMAAN: Berhasil parse item: ${model.id}');
} catch (parseError) {
print('DEBUG PENERIMAAN: Error parsing item: $parseError');
print('DEBUG PENERIMAAN: Data yang gagal di-parse: $item');
}
} }
// Pastikan list tidak kosong sebelum assign
if (penerima.isNotEmpty) {
// Update nilai observable // Update nilai observable
penerimaPenyaluran.assignAll(penerima); penerimaPenyaluran.assignAll(penerima);
print(
'DEBUG PENERIMAAN: Berhasil assign ${penerima.length} item ke list');
var diterima = var diterima =
penerima.where((p) => p.statusPenerimaan == 'DITERIMA').length; penerima.where((p) => p.statusPenerimaan == 'DITERIMA').length;
@ -325,10 +350,16 @@ class WargaDashboardController extends GetxController {
// Log untuk debugging // Log untuk debugging
print( print(
'Berhasil memuat ${penerima.length} data penerimaan untuk warga ID: $wargaId'); 'Berhasil memuat ${penerima.length} data penerimaan untuk warga ID: $wargaId');
} else {
print(
'DEBUG PENERIMAAN: Tidak ada data penerimaan yang berhasil di-parse');
}
return penerima; return penerima;
} catch (e) { } catch (e) {
print('Error fetchPenerimaPenyaluran: $e'); print('Error fetchPenerimaPenyaluran: $e');
// Pastikan list kosong jika terjadi error
penerimaPenyaluran.clear();
return []; return [];
} }
} }

View File

@ -15,13 +15,28 @@ class WargaPenerimaanView extends GetView<WargaDashboardController> {
return const Center(child: CircularProgressIndicator()); return const Center(child: CircularProgressIndicator());
} }
// Debug print untuk melihat jumlah item
print(
'DEBUG: Jumlah penerimaan tersedia: ${controller.penerimaPenyaluran.length}');
return RefreshIndicator( return RefreshIndicator(
onRefresh: () async { onRefresh: () async {
controller.fetchData(); // Tambahkan delay untuk memastikan refresh indicator terlihat
await Future.delayed(const Duration(milliseconds: 300));
controller.fetchPenerimaPenyaluran();
}, },
child: controller.penerimaPenyaluran.isEmpty child: controller.penerimaPenyaluran.isEmpty
? _buildEmptyState() ? ListView(
: _buildPenerimaanList(), physics: const AlwaysScrollableScrollPhysics(),
children: [
SizedBox(
height: Get.height *
0.7, // Pastikan tinggi cukup untuk memungkinkan scroll
child: _buildEmptyState(),
),
],
)
: _buildPenerimaanList(context),
); );
}), }),
); );
@ -86,21 +101,48 @@ class WargaPenerimaanView extends GetView<WargaDashboardController> {
); );
} }
Widget _buildPenerimaanList() { Widget _buildPenerimaanList(BuildContext context) {
return ListView.builder( // Debug print untuk melihat jumlah item
print(
'DEBUG: Membangun ListView dengan ${controller.penerimaPenyaluran.length} item bantuan');
// Menggunakan CustomScrollView dan SliverList untuk layout yang lebih stabil
return CustomScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
itemCount: controller.penerimaPenyaluran.length, sliver: SliverList(
itemBuilder: (context, index) { delegate: SliverChildBuilderDelegate(
(context, index) {
// Pastikan index dalam batas array
if (index >= controller.penerimaPenyaluran.length) {
return const SizedBox.shrink();
}
final item = controller.penerimaPenyaluran[index]; final item = controller.penerimaPenyaluran[index];
return BantuanCard( // Debug
print('DEBUG: Membangun item $index dengan id: ${item.id}');
// Menggunakan SizedBox untuk memberikan batas lebar dan tinggi
return SizedBox(
width: MediaQuery.of(context).size.width,
child: BantuanCard(
item: item, item: item,
onTap: () { onTap: () {
// Navigasi ke detail penerimaan // Navigasi ke detail penerimaan
Get.toNamed('/warga/detail-penerimaan', arguments: {'id': item.id}); Get.toNamed('/warga/detail-penerimaan',
arguments: {'id': item.id});
}, },
),
); );
}, },
childCount: controller.penerimaPenyaluran.length,
),
),
),
],
); );
} }
} }

View File

@ -13,13 +13,26 @@ class WargaPengaduanView extends GetView<WargaDashboardController> {
return const Center(child: CircularProgressIndicator()); return const Center(child: CircularProgressIndicator());
} }
// Debug print untuk melihat jumlah item
print('DEBUG: Jumlah pengaduan tersedia: ${controller.pengaduan.length}');
return RefreshIndicator( return RefreshIndicator(
onRefresh: () async { onRefresh: () async {
// Tambahkan delay untuk memastikan refresh indicator terlihat
await Future.delayed(const Duration(milliseconds: 300));
controller.fetchData(); controller.fetchData();
}, },
child: controller.pengaduan.isEmpty child: controller.pengaduan.isEmpty
? _buildEmptyState() ? ListView(
: _buildPengaduanList(), physics: const AlwaysScrollableScrollPhysics(),
children: [
SizedBox(
height: Get.height * 0.7,
child: _buildEmptyState(),
),
],
)
: _buildPengaduanList(context),
); );
}); });
} }
@ -56,12 +69,28 @@ class WargaPengaduanView extends GetView<WargaDashboardController> {
); );
} }
Widget _buildPengaduanList() { Widget _buildPengaduanList(BuildContext context) {
return ListView.builder( // Log untuk debugging jumlah item
print(
'DEBUG: Membangun ListView dengan ${controller.pengaduan.length} pengaduan');
// Menggunakan CustomScrollView untuk layout yang lebih stabil
return CustomScrollView(
physics: const AlwaysScrollableScrollPhysics(),
slivers: [
SliverPadding(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
itemCount: controller.pengaduan.length, sliver: SliverList(
itemBuilder: (context, index) { delegate: SliverChildBuilderDelegate(
(context, index) {
// Pastikan index valid
if (index >= controller.pengaduan.length) {
return const SizedBox.shrink();
}
final item = controller.pengaduan[index]; final item = controller.pengaduan[index];
print(
'DEBUG: Membangun item pengaduan $index dengan id: ${item.id}');
// Tentukan status dan warna berdasarkan status pengaduan // Tentukan status dan warna berdasarkan status pengaduan
Color statusColor; Color statusColor;
@ -89,12 +118,19 @@ class WargaPengaduanView extends GetView<WargaDashboardController> {
statusText = item.status ?? 'Tidak Diketahui'; statusText = item.status ?? 'Tidak Diketahui';
} }
return Card( // Menggunakan SizedBox untuk memberikan batas lebar yang jelas
return SizedBox(
width: MediaQuery.of(context).size.width,
child: Card(
margin: const EdgeInsets.only(bottom: 16), margin: const EdgeInsets.only(bottom: 16),
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
side: BorderSide(
color: statusColor.withOpacity(0.3),
width: 1,
), ),
elevation: 2, ),
elevation: 3,
child: InkWell( child: InkWell(
onTap: () { onTap: () {
// Navigasi ke detail pengaduan // Navigasi ke detail pengaduan
@ -102,38 +138,78 @@ class WargaPengaduanView extends GetView<WargaDashboardController> {
arguments: {'id': item.id}); arguments: {'id': item.id});
}, },
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
child: Padding(
padding: const EdgeInsets.all(16),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [ children: [
Row( // Header dengan warna sesuai status
Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(
horizontal: 16, vertical: 12),
decoration: BoxDecoration(
color: statusColor.withOpacity(0.1),
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(12),
topRight: Radius.circular(12),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Expanded( Expanded(
child: Row(
children: [
Icon(
Icons.report_problem,
color: statusColor,
),
const SizedBox(width: 8),
Flexible(
child: Text( child: Text(
item.judul ?? 'Pengaduan #${index + 1}', item.judul ??
style: const TextStyle( 'Pengaduan #${index + 1}',
style: TextStyle(
fontSize: 18, fontSize: 18,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: statusColor,
), ),
maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),
), ),
],
),
),
Container( Container(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
horizontal: 12, horizontal: 12,
vertical: 6, vertical: 6,
), ),
decoration: BoxDecoration( decoration: BoxDecoration(
color: statusColor.withOpacity(0.1), color: Colors.white,
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
border: Border.all( border: Border.all(
color: statusColor, color: statusColor,
width: 1.0,
), ),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.05),
blurRadius: 3,
offset: const Offset(0, 1),
), ),
child: Text( ],
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
_getStatusIcon(item.status),
size: 14,
color: statusColor,
),
const SizedBox(width: 4),
Text(
statusText, statusText,
style: TextStyle( style: TextStyle(
color: statusColor, color: statusColor,
@ -141,69 +217,146 @@ class WargaPengaduanView extends GetView<WargaDashboardController> {
fontSize: 12, fontSize: 12,
), ),
), ),
],
),
), ),
], ],
), ),
const SizedBox(height: 12),
// Informasi penyaluran bantuan
if (item.penerimaPenyaluran != null)
Container(
padding: const EdgeInsets.all(8),
margin: const EdgeInsets.only(bottom: 12),
decoration: BoxDecoration(
color: Colors.blue.shade50,
borderRadius: BorderRadius.circular(8),
), ),
Padding(
padding: const EdgeInsets.all(16),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( // Informasi penyaluran bantuan jika ada
'Penyaluran: ${item.namaPenyaluran}', if (item.penerimaPenyaluran != null)
style: const TextStyle( Container(
fontWeight: FontWeight.bold, width: double.infinity,
padding: const EdgeInsets.all(12),
margin: const EdgeInsets.only(bottom: 16),
decoration: BoxDecoration(
color: Colors.blue.shade50,
borderRadius: BorderRadius.circular(10),
border: Border.all(
color: Colors.blue.shade200,
width: 1.0,
), ),
), ),
const SizedBox(height: 4), child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Row( Row(
children: [ children: [
Expanded( Icon(
child: Text( Icons.volunteer_activism,
'Jenis: ${item.jenisBantuan}', color: Colors.blue.shade700,
size: 18,
),
const SizedBox(width: 8),
Text(
'Bantuan Terkait',
style: TextStyle( style: TextStyle(
fontSize: 12, fontWeight: FontWeight.bold,
color: Colors.grey.shade700, color: Colors.blue.shade800,
),
),
),
Expanded(
child: Text(
'Jumlah: ${item.jumlahBantuan}',
style: TextStyle(
fontSize: 12,
color: Colors.grey.shade700,
),
), ),
), ),
], ],
), ),
const SizedBox(height: 8),
Container(
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: Colors.white,
borderRadius:
BorderRadius.circular(8),
),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
'Penyaluran: ${item.namaPenyaluran ?? "Tidak tersedia"}',
style: const TextStyle(
fontWeight: FontWeight.w500,
),
),
const SizedBox(height: 6),
Row(
children: [
Expanded(
child: _buildInfoItem(
'Jenis',
item.jenisBantuan ??
"Tidak tersedia",
),
),
Expanded(
child: _buildInfoItem(
'Jumlah',
item.jumlahBantuan ??
"Tidak tersedia",
),
),
],
),
],
),
),
], ],
), ),
), ),
if (item.deskripsi != null && item.deskripsi!.isNotEmpty) // Deskripsi pengaduan
Padding( if (item.deskripsi != null &&
padding: const EdgeInsets.only(bottom: 12), item.deskripsi!.isNotEmpty)
child: Text( Container(
width: double.infinity,
padding: const EdgeInsets.all(12),
margin: const EdgeInsets.only(bottom: 16),
decoration: BoxDecoration(
color: Colors.grey.shade50,
borderRadius: BorderRadius.circular(10),
border: Border.all(
color: Colors.grey.shade200,
width: 1.0,
),
),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
'Deskripsi Masalah:',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.grey.shade800,
),
),
const SizedBox(height: 6),
Text(
item.deskripsi!, item.deskripsi!,
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle( style: TextStyle(
color: Colors.grey.shade700, color: Colors.grey.shade700,
), ),
), ),
],
), ),
Row( ),
// Informasi tanggal
Container(
width: double.infinity,
padding: const EdgeInsets.all(10),
decoration: BoxDecoration(
color: Colors.grey.shade50,
borderRadius: BorderRadius.circular(8),
border: Border.all(
color: Colors.grey.shade200,
),
),
child: Row(
children: [ children: [
Icon( Icon(
Icons.calendar_today, Icons.calendar_today,
@ -212,23 +365,47 @@ class WargaPengaduanView extends GetView<WargaDashboardController> {
), ),
const SizedBox(width: 8), const SizedBox(width: 8),
Text( Text(
'Dilaporkan pada: ',
style: TextStyle(
fontWeight: FontWeight.w500,
color: Colors.grey.shade700,
),
),
Expanded(
child: Text(
item.tanggalPengaduan != null item.tanggalPengaduan != null
? DateTimeHelper.formatDateTime( ? DateTimeHelper.formatDateTime(
item.tanggalPengaduan!) item.tanggalPengaduan!)
: '-', : '-',
style: TextStyle( style: TextStyle(
color: Colors.grey.shade600, color: Colors.grey.shade800,
),
), ),
), ),
], ],
), ),
const SizedBox(height: 16), ),
const Divider(height: 1), ],
const SizedBox(height: 16), ),
Row( ),
// Footer dengan tombol aksi
Container(
width: double.infinity,
decoration: const BoxDecoration(
border: Border(
top: BorderSide(
color: Colors.black12,
width: 1,
),
),
),
padding: const EdgeInsets.symmetric(
horizontal: 16, vertical: 12),
child: Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
TextButton.icon( ElevatedButton.icon(
onPressed: () { onPressed: () {
// Navigasi ke detail pengaduan // Navigasi ke detail pengaduan
Get.toNamed('/warga/detail-pengaduan', Get.toNamed('/warga/detail-pengaduan',
@ -236,15 +413,70 @@ class WargaPengaduanView extends GetView<WargaDashboardController> {
}, },
icon: const Icon(Icons.visibility), icon: const Icon(Icons.visibility),
label: const Text('Lihat Detail'), label: const Text('Lihat Detail'),
style: ElevatedButton.styleFrom(
foregroundColor: Colors.white,
backgroundColor: statusColor,
padding: const EdgeInsets.symmetric(
horizontal: 16, vertical: 8),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
), ),
], ],
), ),
),
], ],
), ),
), ),
), ),
); );
}, },
childCount: controller.pengaduan.length,
),
),
),
],
);
}
// Helper method untuk mendapatkan icon berdasarkan status
IconData _getStatusIcon(String? status) {
switch (status?.toUpperCase()) {
case 'MENUNGGU':
return Icons.hourglass_empty;
case 'TINDAKAN':
return Icons.engineering;
case 'SELESAI':
return Icons.check_circle;
case 'DITOLAK':
return Icons.cancel;
default:
return Icons.help_outline;
}
}
// Widget untuk item informasi
Widget _buildInfoItem(String label, String value) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
label,
style: TextStyle(
fontSize: 12,
color: Colors.grey.shade600,
),
),
const SizedBox(height: 2),
Text(
value,
style: TextStyle(
fontWeight: FontWeight.w500,
color: Colors.grey.shade800,
),
),
],
); );
} }
} }

View File

@ -37,10 +37,18 @@ class BantuanCard extends StatelessWidget {
// Tampilan kompak untuk daftar ringkasan // Tampilan kompak untuk daftar ringkasan
if (isCompact) { if (isCompact) {
return Card( return ConstrainedBox(
elevation: 2, constraints: const BoxConstraints(minHeight: 100),
child: Card(
elevation: 3,
margin: const EdgeInsets.only(bottom: 12),
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
side: BorderSide(
color: (item.isUang == true ? Colors.green : Colors.blue)
.withOpacity(0.3),
width: 1,
),
), ),
child: InkWell( child: InkWell(
onTap: onTap, onTap: onTap,
@ -48,26 +56,36 @@ class BantuanCard extends StatelessWidget {
child: Padding( child: Padding(
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max, // Ensure max width for main Row
children: [ children: [
Container( Container(
padding: const EdgeInsets.all(10), padding: const EdgeInsets.all(12),
decoration: BoxDecoration( decoration: BoxDecoration(
color: (item.isUang == true ? Colors.green : Colors.blue) color: (item.isUang == true ? Colors.green : Colors.blue)
.withOpacity(0.1), .withOpacity(0.1),
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(12),
border: Border.all(
color:
(item.isUang == true ? Colors.green : Colors.blue)
.withOpacity(0.3),
width: 1,
),
), ),
child: Icon( child: Icon(
item.isUang == true item.isUang == true
? Icons.attach_money ? Icons.attach_money
: Icons.inventory_2, : Icons.inventory_2,
color: item.isUang == true ? Colors.green : Colors.blue, color: item.isUang == true ? Colors.green : Colors.blue,
size: 24, size: 28,
), ),
), ),
const SizedBox(width: 12), const SizedBox(width: 12),
Expanded( Expanded(
flex: 3, // Allocate more space to content
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [ children: [
Text( Text(
item.namaPenyaluran ?? item.keterangan ?? 'Bantuan', item.namaPenyaluran ?? item.keterangan ?? 'Bantuan',
@ -75,19 +93,32 @@ class BantuanCard extends StatelessWidget {
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
fontSize: 16, fontSize: 16,
), ),
maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
maxLines: 1,
), ),
const SizedBox(height: 4), const SizedBox(height: 6),
Text( Text(
item.kategoriNama ?? 'Bantuan', item.kategoriNama ?? 'Bantuan',
style: TextStyle( style: TextStyle(
color: Colors.grey.shade700, color: Colors.grey.shade700,
fontSize: 14, fontSize: 14,
fontWeight: FontWeight.w500,
), ),
overflow: TextOverflow.ellipsis,
maxLines: 1,
), ),
const SizedBox(height: 4), const SizedBox(height: 6),
Text( Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
Icons.calendar_today,
size: 14,
color: Colors.grey.shade600,
),
const SizedBox(width: 4),
Flexible(
child: Text(
item.tanggalPenerimaan != null item.tanggalPenerimaan != null
? DateFormat('dd MMMM yyyy', 'id_ID') ? DateFormat('dd MMMM yyyy', 'id_ID')
.format(item.tanggalPenerimaan!) .format(item.tanggalPenerimaan!)
@ -96,17 +127,24 @@ class BantuanCard extends StatelessWidget {
color: Colors.grey.shade600, color: Colors.grey.shade600,
fontSize: 12, fontSize: 12,
), ),
overflow: TextOverflow.ellipsis,
),
),
],
), ),
], ],
), ),
), ),
const SizedBox(width: 8), const SizedBox(width: 8),
Column( Expanded(
flex: 2, // Allocate less space to status/amount
child: Column(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: [ children: [
StatusBadge( StatusBadge(
status: item.statusPenerimaan ?? 'BELUMMENERIMA', status: item.statusPenerimaan ?? 'BELUMMENERIMA',
fontSize: 10, fontSize: 11,
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
horizontal: 8, horizontal: 8,
vertical: 4, vertical: 4,
@ -115,10 +153,10 @@ class BantuanCard extends StatelessWidget {
if (item.statusPenyaluran != null && if (item.statusPenyaluran != null &&
item.statusPenyaluran!.isNotEmpty) item.statusPenyaluran!.isNotEmpty)
Padding( Padding(
padding: const EdgeInsets.only(top: 4), padding: const EdgeInsets.only(top: 6),
child: _buildPenyaluranStatusBadge( child: StatusBadge(
item.statusPenyaluran!, status: item.statusPenyaluran!,
fontSize: 10, fontSize: 11,
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
horizontal: 8, horizontal: 8,
vertical: 4, vertical: 4,
@ -126,169 +164,251 @@ class BantuanCard extends StatelessWidget {
), ),
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Text( Container(
padding: const EdgeInsets.symmetric(
horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: (item.isUang == true
? Colors.green
: Colors.blue)
.withOpacity(0.1),
borderRadius: BorderRadius.circular(8),
border: Border.all(
color: (item.isUang == true
? Colors.green
: Colors.blue)
.withOpacity(0.3),
width: 1,
),
),
child: Text(
formattedJumlah, formattedJumlah,
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: item.isUang == true ? Colors.green : Colors.blue, color: item.isUang == true
? Colors.green.shade700
: Colors.blue.shade700,
fontSize: 14, fontSize: 14,
), ),
overflow: TextOverflow.ellipsis,
),
), ),
], ],
), ),
),
], ],
), ),
), ),
), ),
),
); );
} }
// Tampilan detail untuk halaman daftar lengkap // Tampilan detail untuk halaman daftar lengkap
return Card( return ConstrainedBox(
constraints: const BoxConstraints(minHeight: 200),
child: Card(
margin: const EdgeInsets.only(bottom: 16), margin: const EdgeInsets.only(bottom: 16),
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
side: BorderSide(
color: (item.isUang == true ? Colors.green : Colors.blue)
.withOpacity(0.3),
width: 1,
), ),
elevation: 2, ),
elevation: 3,
child: InkWell( child: InkWell(
onTap: onTap, onTap: onTap,
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
child: Padding(
padding: const EdgeInsets.all(16),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [ children: [
Row( Container(
width: double.infinity,
padding:
const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
decoration: BoxDecoration(
color: (item.isUang == true ? Colors.green : Colors.blue)
.withOpacity(0.1),
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(12),
topRight: Radius.circular(12),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Expanded( Expanded(
child: Text( child: Row(
item.namaPenyaluran ?? item.keterangan ?? 'Bantuan',
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
Wrap(
spacing: 8,
children: [
StatusBadge(status: item.statusPenyaluran ?? ""),
StatusBadge(
status: item.statusPenerimaan ?? 'BELUMMENERIMA',
),
],
),
],
),
if (item.deskripsiPenyaluran != null &&
item.deskripsiPenyaluran!.isNotEmpty)
Padding(
padding: const EdgeInsets.only(top: 8.0),
child: Text(
item.deskripsiPenyaluran!,
style: TextStyle(
color: Colors.grey.shade700,
fontSize: 14,
),
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
),
const SizedBox(height: 16),
Row(
children: [
Icon(
Icons.category,
size: 16,
color: Colors.grey.shade600,
),
const SizedBox(width: 8),
Text(
item.kategoriNama ?? 'Bantuan',
style: TextStyle(
color: Colors.grey.shade700,
fontWeight: FontWeight.w500,
),
),
],
),
const SizedBox(height: 8),
Row(
children: [
Icon(
Icons.calendar_today,
size: 16,
color: Colors.grey.shade600,
),
const SizedBox(width: 8),
Text(
item.tanggalPenerimaan != null
? DateFormat('dd MMMM yyyy', 'id_ID')
.format(item.tanggalPenerimaan!)
: '-',
style: TextStyle(
color: Colors.grey.shade600,
),
),
],
),
const SizedBox(height: 8),
Row(
children: [
Icon(
Icons.location_on,
size: 16,
color: Colors.grey.shade600,
),
const SizedBox(width: 8),
Expanded(
child: Text(
item.lokasiPenyaluranNama ?? 'Lokasi tidak tersedia',
style: TextStyle(
color: Colors.grey.shade600,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
],
),
const SizedBox(height: 8),
Row(
children: [ children: [
Icon( Icon(
item.isUang == true item.isUang == true
? Icons.attach_money ? Icons.attach_money
: Icons.inventory_2, : Icons.inventory_2,
size: 16, color: item.isUang == true
color: Colors.grey.shade600, ? Colors.green.shade700
: Colors.blue.shade700,
), ),
const SizedBox(width: 8), const SizedBox(width: 8),
Text( Flexible(
formattedJumlah, child: Text(
item.namaPenyaluran ??
item.keterangan ??
'Bantuan',
style: TextStyle( style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: item.isUang == true ? Colors.green : Colors.blue, color: item.isUang == true
? Colors.green.shade800
: Colors.blue.shade800,
),
overflow: TextOverflow.ellipsis,
), ),
), ),
], ],
), ),
),
Container(
padding: const EdgeInsets.symmetric(
horizontal: 10, vertical: 5),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(20),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.1),
blurRadius: 4,
offset: const Offset(0, 2),
),
],
),
child: Text(
formattedJumlah,
style: TextStyle(
fontWeight: FontWeight.bold,
color: item.isUang == true
? Colors.green.shade700
: Colors.blue.shade700,
fontSize: 14,
),
),
),
],
),
),
Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Wrap(
spacing: 8,
runSpacing: 8,
children: [
if (item.statusPenyaluran != null &&
item.statusPenyaluran!.isNotEmpty)
StatusBadge(
status: item.statusPenyaluran!,
),
StatusBadge(
status: item.statusPenerimaan ?? 'BELUMMENERIMA',
),
],
),
if (item.deskripsiPenyaluran != null &&
item.deskripsiPenyaluran!.isNotEmpty)
Container(
width: double.infinity,
margin: const EdgeInsets.only(top: 16, bottom: 8),
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: Colors.grey.shade50,
borderRadius: BorderRadius.circular(8),
border: Border.all(
color: Colors.grey.shade200,
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Deskripsi:',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.grey.shade700,
),
),
const SizedBox(height: 4),
Text(
item.deskripsiPenyaluran!,
style: TextStyle(
color: Colors.grey.shade700,
fontSize: 14,
),
),
],
),
),
const SizedBox(height: 16), const SizedBox(height: 16),
const Divider(height: 1), Container(
const SizedBox(height: 16), width: double.infinity,
Row( decoration: BoxDecoration(
color: Colors.grey.shade50,
borderRadius: BorderRadius.circular(12),
border: Border.all(color: Colors.grey.shade200),
),
padding: const EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildInfoRow(
Icons.category,
'Kategori:',
item.kategoriNama ?? 'Bantuan',
),
const Divider(height: 16),
_buildInfoRow(
Icons.calendar_today,
'Tanggal:',
item.tanggalPenerimaan != null
? DateFormat('dd MMMM yyyy', 'id_ID')
.format(item.tanggalPenerimaan!)
: '-',
),
const Divider(height: 16),
_buildInfoRow(
Icons.location_on,
'Lokasi:',
item.lokasiPenyaluranNama ??
'Lokasi tidak tersedia',
),
],
),
),
],
),
),
Container(
width: double.infinity,
padding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
child: Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
TextButton.icon( TextButton.icon(
onPressed: onTap, onPressed: onTap,
icon: const Icon(Icons.visibility), icon: const Icon(Icons.visibility),
label: const Text('Lihat Detail'), label: const Text('Lihat Detail'),
style: TextButton.styleFrom(
foregroundColor: item.isUang == true
? Colors.green.shade600
: Colors.blue.shade600,
),
), ),
], ],
), ),
),
], ],
), ),
), ),
@ -296,50 +416,33 @@ class BantuanCard extends StatelessWidget {
); );
} }
// Widget untuk menampilkan badge status penyaluran Widget _buildInfoRow(IconData icon, String label, String value) {
Widget _buildPenyaluranStatusBadge( return Row(
String status, { crossAxisAlignment: CrossAxisAlignment.start,
double fontSize = 12, mainAxisSize: MainAxisSize.min,
EdgeInsets padding = children: [
const EdgeInsets.symmetric(horizontal: 12, vertical: 6), Icon(
}) { icon,
Color statusColor; size: 18,
String statusText; color: Colors.grey.shade600,
switch (status.toUpperCase()) {
case 'DIJADWALKAN':
case 'DISETUJUI':
statusColor = Colors.blue;
statusText = 'Dijadwalkan';
break;
case 'TERLAKSANA':
statusColor = Colors.green;
statusText = 'Terlaksana';
break;
case 'BATALTERLAKSANA':
statusColor = Colors.red;
statusText = 'Dibatalkan';
break;
default:
statusColor = Colors.grey;
statusText = status;
}
return Container(
padding: padding,
decoration: BoxDecoration(
color: statusColor.withOpacity(0.1),
borderRadius: BorderRadius.circular(20),
border: Border.all(color: statusColor),
), ),
child: Text( const SizedBox(width: 12),
statusText, Text(
style: TextStyle( label,
color: statusColor, style: const TextStyle(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
fontSize: fontSize,
), ),
), ),
const SizedBox(width: 8),
Expanded(
child: Text(
value,
style: TextStyle(
color: Colors.grey.shade800,
),
),
),
],
); );
} }
} }