Perbarui tampilan CalendarViewWidget dengan menambahkan padding dan memperbaiki pengaturan gaya untuk meningkatkan pengalaman pengguna. Sederhanakan struktur tampilan di PenyaluranView dengan menghapus elemen yang tidak perlu dan langsung menampilkan CalendarViewWidget.

This commit is contained in:
Khafidh Fuadi
2025-03-16 15:26:29 +07:00
parent cf43c472bd
commit 5814b19546
19 changed files with 265 additions and 440 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>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD> ?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  <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\arm64-v8a\additional_project_files.txt  <08>ۈ<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><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>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><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>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><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>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><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>2y pD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\build.ninja.txt  <08><EFBFBD><EFBFBD><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>2 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
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><EFBFBD><EFBFBD>2 ~ vD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\compile_commands.json  <08><><EFBFBD><EFBFBD><EFBFBD>2 ~
| |
zD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\compile_commands.json.bin  <08><><EFBFBD><EFBFBD><EFBFBD>2 zD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\compile_commands.json.bin  <08><><EFBFBD><EFBFBD><EFBFBD>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><EFBFBD><EFBFBD>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><EFBFBD><EFBFBD>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><EFBFBD><EFBFBD>2 sD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\arm64-v8a\prefab_config.json  <08><><EFBFBD><EFBFBD><EFBFBD>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>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD> ?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  <08><EFBFBD><EFBFBD><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>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><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>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><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>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><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>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><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>2{ rD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\build.ninja.txt  <08><EFBFBD><EFBFBD><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>2 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
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><EFBFBD><EFBFBD>2 <09> xD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\compile_commands.json  <08><><EFBFBD><EFBFBD><EFBFBD>2 <09>
~ ~
|D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\compile_commands.json.bin  <08><><EFBFBD><EFBFBD><EFBFBD>2 |D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\compile_commands.json.bin  <08><><EFBFBD><EFBFBD><EFBFBD>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><EFBFBD><EFBFBD>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><EFBFBD><EFBFBD>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><EFBFBD><EFBFBD>2 uD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\armeabi-v7a\prefab_config.json  <08><><EFBFBD><EFBFBD><EFBFBD>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>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2{ ?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  <08><EFBFBD><EFBFBD><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  <08>݈<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><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  <08>݈<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><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  <08>݈<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><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  <08>݈<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><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  <08>݈<EFBFBD><EFBFBD>2s jD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\build.ninja.txt  <08><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2s
q q
oD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\build_file_index.txt  <08>݈<EFBFBD><EFBFBD>2 oD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\build_file_index.txt  <08><EFBFBD><EFBFBD><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  ɀ<><C980><EFBFBD>2 x pD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\compile_commands.json  ɀ<><C980><EFBFBD>2 x
v v
tD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\compile_commands.json.bin  ɀ<><C980><EFBFBD>2 tD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\compile_commands.json.bin  ɀ<><C980><EFBFBD>2
~ ~
| |
zD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\metadata_generation_command.txt  ɀ<><C980><EFBFBD>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  ɀ<><C980><EFBFBD>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  ɀ<><C980><EFBFBD>2 mD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86\prefab_config.json  ɀ<><C980><EFBFBD>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>2<18> <20><><EFBFBD><EFBFBD><EFBFBD>2~ ?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  <08><EFBFBD><EFBFBD><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>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><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>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><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>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><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>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><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>2v mD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\build.ninja.txt  <08><EFBFBD><EFBFBD><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>2 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
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><EFBFBD><EFBFBD>2 { sD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\compile_commands.json  <08><><EFBFBD><EFBFBD><EFBFBD>2 {
y y
wD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\compile_commands.json.bin  <08><><EFBFBD><EFBFBD><EFBFBD>2 wD:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\compile_commands.json.bin  <08><><EFBFBD><EFBFBD><EFBFBD>2
<EFBFBD> <EFBFBD>
 
}D:\KULIAH\Matkul\SKRIPSI\penyaluran_app\penyaluran_app\android\app\.cxx\Debug\626b5o2n\x86_64\metadata_generation_command.txt  <08><><EFBFBD><EFBFBD><EFBFBD>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><EFBFBD><EFBFBD>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

@ -3,15 +3,12 @@ import 'package:get/get.dart';
import 'package:penyaluran_app/app/data/models/penerima_penyaluran_model.dart'; import 'package:penyaluran_app/app/data/models/penerima_penyaluran_model.dart';
import 'package:penyaluran_app/app/modules/penyaluran/detail_penyaluran_controller.dart'; import 'package:penyaluran_app/app/modules/penyaluran/detail_penyaluran_controller.dart';
import 'package:penyaluran_app/app/theme/app_theme.dart'; import 'package:penyaluran_app/app/theme/app_theme.dart';
import 'package:image_picker/image_picker.dart';
import 'package:penyaluran_app/app/modules/penyaluran/konfirmasi_penerima_page.dart'; import 'package:penyaluran_app/app/modules/penyaluran/konfirmasi_penerima_page.dart';
import 'package:penyaluran_app/app/utils/date_formatter.dart'; import 'package:penyaluran_app/app/utils/date_time_helper.dart';
import 'package:penyaluran_app/app/data/models/penyaluran_bantuan_model.dart';
import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart';
class DetailPenyaluranPage extends StatelessWidget { class DetailPenyaluranPage extends StatelessWidget {
final controller = Get.put(DetailPenyaluranController()); final controller = Get.put(DetailPenyaluranController());
final ImagePicker _picker = ImagePicker();
final searchController = TextEditingController(); final searchController = TextEditingController();
final RxString searchQuery = ''.obs; final RxString searchQuery = ''.obs;
final RxString statusFilter = 'SEMUA'.obs; final RxString statusFilter = 'SEMUA'.obs;
@ -65,16 +62,14 @@ class DetailPenyaluranPage extends StatelessWidget {
children: [ children: [
_buildInfoCard(context), _buildInfoCard(context),
const SizedBox(height: 16), const SizedBox(height: 16),
_buildPenerimaPenyaluranSection(context),
const SizedBox(height: 24),
// Menampilkan section alasan pembatalan jika status BATALTERLAKSANA
if (controller.penyaluran.value?.status?.toUpperCase() == if (controller.penyaluran.value?.status?.toUpperCase() ==
'BATALTERLAKSANA' && 'BATALTERLAKSANA' &&
controller.penyaluran.value?.alasanPembatalan != null && controller.penyaluran.value?.alasanPembatalan != null &&
controller.penyaluran.value!.alasanPembatalan!.isNotEmpty) controller.penyaluran.value!.alasanPembatalan!.isNotEmpty)
_buildPembatalanSection(context), _buildPembatalanSection(context),
const SizedBox(height: 16),
_buildPenerimaPenyaluranSection(context),
const SizedBox(height: 24), const SizedBox(height: 24),
// Tombol aksi akan ditampilkan di bottomNavigationBar
], ],
), ),
), ),
@ -161,7 +156,7 @@ class DetailPenyaluranPage extends StatelessWidget {
_buildInfoRow( _buildInfoRow(
'Tanggal', 'Tanggal',
penyaluran.tanggalPenyaluran != null penyaluran.tanggalPenyaluran != null
? DateFormatter.formatDateTime( ? DateTimeHelper.formatDateTime(
penyaluran.tanggalPenyaluran!) penyaluran.tanggalPenyaluran!)
: 'Belum dijadwalkan'), : 'Belum dijadwalkan'),
// Tampilkan tanggal selesai jika status TERLAKSANA atau BATALTERLAKSANA // Tampilkan tanggal selesai jika status TERLAKSANA atau BATALTERLAKSANA
@ -170,7 +165,8 @@ class DetailPenyaluranPage extends StatelessWidget {
_buildInfoRow( _buildInfoRow(
'Tanggal Selesai', 'Tanggal Selesai',
penyaluran.tanggalSelesai != null penyaluran.tanggalSelesai != null
? DateFormatter.formatDateTime(penyaluran.tanggalSelesai!) ? DateTimeHelper.formatDateTime(
penyaluran.tanggalSelesai!)
: '-'), : '-'),
_buildInfoRow( _buildInfoRow(
'Jumlah Penerima', '${penyaluran.jumlahPenerima ?? 0} orang'), 'Jumlah Penerima', '${penyaluran.jumlahPenerima ?? 0} orang'),
@ -201,72 +197,6 @@ class DetailPenyaluranPage extends StatelessWidget {
), ),
), ),
], ],
// Alasan penolakan jika ada
if (penyaluran.alasanPembatalan != null &&
penyaluran.alasanPembatalan!.isNotEmpty) ...[
const Divider(height: 24),
if (penyaluran.status?.toUpperCase() == 'BATALTERLAKSANA') ...[
Container(
width: double.infinity,
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: AppTheme.errorColor.withOpacity(0.1),
borderRadius: BorderRadius.circular(8),
border: Border.all(
color: AppTheme.errorColor.withOpacity(0.5),
width: 1,
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(
Icons.cancel_outlined,
color: AppTheme.errorColor,
size: 20,
),
const SizedBox(width: 8),
Text(
'Alasan Pembatalan:',
style: TextStyle(
fontWeight: FontWeight.bold,
color: AppTheme.errorColor,
fontSize: 16,
),
),
],
),
const SizedBox(height: 8),
Text(
penyaluran.alasanPembatalan!,
style: TextStyle(
color: Colors.red[700],
),
),
],
),
),
] else ...[
Text(
'Alasan Pembatalan:',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.red[700],
),
),
const SizedBox(height: 4),
Text(
penyaluran.alasanPembatalan!,
style: TextStyle(
color: Colors.red[700],
fontStyle: FontStyle.italic,
),
),
],
],
], ],
), ),
), ),
@ -1339,7 +1269,7 @@ class DetailPenyaluranPage extends StatelessWidget {
if (penerima.tanggalPenerimaan != null) if (penerima.tanggalPenerimaan != null)
_buildInfoRow( _buildInfoRow(
'Tanggal Penerimaan', 'Tanggal Penerimaan',
DateFormatter.formatDate( DateTimeHelper.formatDate(
penerima.tanggalPenerimaan!)), penerima.tanggalPenerimaan!)),
if (penerima.jumlahBantuan != null) if (penerima.jumlahBantuan != null)
_buildInfoRow('Jumlah Bantuan', _buildInfoRow('Jumlah Bantuan',
@ -1458,8 +1388,7 @@ class DetailPenyaluranPage extends StatelessWidget {
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
), ),
), )),
),
], ],
), ),
), ),
@ -1532,7 +1461,7 @@ class DetailPenyaluranPage extends StatelessWidget {
_buildInfoRow('Status', 'Batal Terlaksana'), _buildInfoRow('Status', 'Batal Terlaksana'),
if (penyaluran.tanggalSelesai != null) if (penyaluran.tanggalSelesai != null)
_buildInfoRow('Tanggal Pembatalan', _buildInfoRow('Tanggal Pembatalan',
DateFormatter.formatDateTime(penyaluran.tanggalSelesai!)), DateTimeHelper.formatDateTime(penyaluran.tanggalSelesai!)),
const SizedBox(height: 8), const SizedBox(height: 8),
const Text( const Text(
'Alasan Pembatalan:', 'Alasan Pembatalan:',

View File

@ -9,7 +9,7 @@ import 'package:signature/signature.dart';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'dart:ui' as ui; import 'dart:ui' as ui;
import 'package:penyaluran_app/app/utils/date_formatter.dart'; import 'package:penyaluran_app/app/utils/date_time_helper.dart';
class KonfirmasiPenerimaPage extends StatefulWidget { class KonfirmasiPenerimaPage extends StatefulWidget {
final PenerimaPenyaluranModel penerima; final PenerimaPenyaluranModel penerima;
@ -187,7 +187,7 @@ class _KonfirmasiPenerimaPageState extends State<KonfirmasiPenerimaPage> {
'Tempat, Tanggal Lahir', 'Tempat, Tanggal Lahir',
warga?['tempat_lahir'] != null && warga?['tempat_lahir'] != null &&
warga?['tanggal_lahir'] != null warga?['tanggal_lahir'] != null
? '${warga!['tempat_lahir']}, ${DateFormatter.formatDate(DateTime.parse(warga['tanggal_lahir']), format: 'd MMMM yyyy')}' ? '${warga!['tempat_lahir']}, ${DateTimeHelper.formatDate(DateTime.parse(warga['tanggal_lahir']), format: 'd MMMM yyyy')}'
: 'Bogor, 2 Juni 1990'), : 'Bogor, 2 Juni 1990'),
const Divider(), const Divider(),
@ -223,9 +223,9 @@ class _KonfirmasiPenerimaPageState extends State<KonfirmasiPenerimaPage> {
String tanggalWaktuPenyaluran = ''; String tanggalWaktuPenyaluran = '';
if (widget.tanggalPenyaluran != null) { if (widget.tanggalPenyaluran != null) {
final tanggal = DateFormatter.formatDate(widget.tanggalPenyaluran!); final tanggal = DateTimeHelper.formatDate(widget.tanggalPenyaluran!);
final waktuMulai = DateFormatter.formatTime(widget.tanggalPenyaluran!); final waktuMulai = DateTimeHelper.formatTime(widget.tanggalPenyaluran!);
final waktuSelesai = DateFormatter.formatTime( final waktuSelesai = DateTimeHelper.formatTime(
widget.tanggalPenyaluran!.add(const Duration(hours: 1))); widget.tanggalPenyaluran!.add(const Duration(hours: 1)));
tanggalWaktuPenyaluran = '$tanggal $waktuMulai-$waktuSelesai'; tanggalWaktuPenyaluran = '$tanggal $waktuMulai-$waktuSelesai';
} else { } else {

View File

@ -42,7 +42,9 @@ class CalendarViewWidget extends StatelessWidget {
), ),
), ),
), ),
SizedBox( Padding(
padding: const EdgeInsets.all(8.0),
child: SizedBox(
height: MediaQuery.of(context).size.height * 0.65, height: MediaQuery.of(context).size.height * 0.65,
child: Obx(() { child: Obx(() {
return SfCalendar( return SfCalendar(
@ -50,7 +52,8 @@ class CalendarViewWidget extends StatelessWidget {
dataSource: _getCalendarDataSource(), dataSource: _getCalendarDataSource(),
timeZone: 'Asia/Jakarta', timeZone: 'Asia/Jakarta',
monthViewSettings: MonthViewSettings( monthViewSettings: MonthViewSettings(
appointmentDisplayMode: MonthAppointmentDisplayMode.indicator, appointmentDisplayMode:
MonthAppointmentDisplayMode.indicator,
showAgenda: true, showAgenda: true,
agendaViewHeight: MediaQuery.of(context).size.height * 0.3, agendaViewHeight: MediaQuery.of(context).size.height * 0.3,
agendaItemHeight: 60, agendaItemHeight: 60,
@ -123,6 +126,7 @@ class CalendarViewWidget extends StatelessWidget {
); );
}), }),
), ),
),
], ],
), ),
); );

View File

@ -1,6 +1,6 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:penyaluran_app/app/utils/date_formatter.dart'; import 'package:penyaluran_app/app/utils/date_time_helper.dart';
class PenerimaController extends GetxController { class PenerimaController extends GetxController {
final RxList<Map<String, dynamic>> daftarPenerima = final RxList<Map<String, dynamic>> daftarPenerima =
@ -190,7 +190,7 @@ class PenerimaController extends GetxController {
); );
if (picked != null) { if (picked != null) {
tanggalPenyaluran.value = DateFormatter.formatDate(picked); tanggalPenyaluran.value = DateTimeHelper.formatDate(picked);
} }
} }

View File

@ -5,7 +5,7 @@ import 'package:penyaluran_app/app/theme/app_theme.dart';
import 'package:penyaluran_app/app/data/models/donatur_model.dart'; import 'package:penyaluran_app/app/data/models/donatur_model.dart';
import 'package:penyaluran_app/app/data/models/penitipan_bantuan_model.dart'; import 'package:penyaluran_app/app/data/models/penitipan_bantuan_model.dart';
import 'package:penyaluran_app/app/widgets/detail_penitipan_dialog.dart'; import 'package:penyaluran_app/app/widgets/detail_penitipan_dialog.dart';
import 'package:penyaluran_app/app/utils/date_formatter.dart'; import 'package:penyaluran_app/app/utils/date_time_helper.dart';
class DetailDonaturView extends GetView<DonaturController> { class DetailDonaturView extends GetView<DonaturController> {
const DetailDonaturView({super.key}); const DetailDonaturView({super.key});
@ -207,7 +207,7 @@ class DetailDonaturView extends GetView<DonaturController> {
Icons.calendar_today, Icons.calendar_today,
'Terdaftar Sejak', 'Terdaftar Sejak',
donatur.createdAt != null donatur.createdAt != null
? DateFormatter.formatDate(donatur.createdAt!) ? DateTimeHelper.formatDate(donatur.createdAt!)
: 'Tidak diketahui', : 'Tidak diketahui',
), ),
], ],
@ -433,7 +433,7 @@ class DetailDonaturView extends GetView<DonaturController> {
Widget _buildDonasiItem(PenitipanBantuanModel penitipan) { Widget _buildDonasiItem(PenitipanBantuanModel penitipan) {
final isUang = penitipan.isUang == true; final isUang = penitipan.isUang == true;
final tanggal = penitipan.createdAt != null final tanggal = penitipan.createdAt != null
? DateFormatter.formatDate(penitipan.createdAt!, format: 'dd MMM yyyy') ? DateTimeHelper.formatDate(penitipan.createdAt!, format: 'dd MMM yyyy')
: 'Tanggal tidak diketahui'; : 'Tanggal tidak diketahui';
String nilaiDonasi = ''; String nilaiDonasi = '';

View File

@ -55,7 +55,7 @@ class DetailPenerimaView extends GetView<PenerimaController> {
], ],
), ),
), ),
bottomNavigationBar: _buildBottomButtons(penerima), // bottomNavigationBar: _buildBottomButtons(penerima),
); );
}); });
} }
@ -345,84 +345,4 @@ class DetailPenerimaView extends GetView<PenerimaController> {
), ),
); );
} }
Widget _buildBottomButtons(Map<String, dynamic> penerima) {
// Jika status sudah selesai, tidak perlu menampilkan tombol
if (penerima['status'] == 'Selesai') {
return Container(
padding: const EdgeInsets.all(16),
child: ElevatedButton.icon(
onPressed: () {
// Implementasi lihat riwayat penyaluran
},
icon: const Icon(Icons.history),
label: const Text('Lihat Riwayat Penyaluran'),
style: ElevatedButton.styleFrom(
backgroundColor: AppTheme.primaryColor,
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 12),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
),
);
}
// Jika status belum disalurkan, tampilkan tombol jadwalkan
if (penerima['status'] == 'Belum disalurkan') {
return Container(
padding: const EdgeInsets.all(16),
child: Row(
children: [
Expanded(
child: ElevatedButton.icon(
onPressed: () {
// Implementasi jadwalkan penyaluran
},
icon: const Icon(Icons.event),
label: const Text('Jadwalkan Penyaluran'),
style: ElevatedButton.styleFrom(
backgroundColor: AppTheme.primaryColor,
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 12),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
),
),
],
),
);
}
// Jika status terjadwal, tampilkan tombol konfirmasi penyaluran
return Container(
padding: const EdgeInsets.all(16),
child: Row(
children: [
Expanded(
child: ElevatedButton.icon(
onPressed: () {
// Navigasi ke halaman konfirmasi penerima
Get.toNamed('/daftar-penerima/konfirmasi',
arguments: penerima['id']);
},
icon: const Icon(Icons.check_circle),
label: const Text('Konfirmasi Penyaluran'),
style: ElevatedButton.styleFrom(
backgroundColor: AppTheme.successColor,
foregroundColor: Colors.white,
padding: const EdgeInsets.symmetric(vertical: 12),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
),
),
],
),
);
}
} }

View File

@ -4,7 +4,7 @@ import 'package:penyaluran_app/app/data/models/donatur_model.dart';
import 'package:penyaluran_app/app/data/models/penitipan_bantuan_model.dart'; import 'package:penyaluran_app/app/data/models/penitipan_bantuan_model.dart';
import 'package:penyaluran_app/app/modules/petugas_desa/controllers/penitipan_bantuan_controller.dart'; import 'package:penyaluran_app/app/modules/petugas_desa/controllers/penitipan_bantuan_controller.dart';
import 'package:penyaluran_app/app/theme/app_theme.dart'; import 'package:penyaluran_app/app/theme/app_theme.dart';
import 'package:penyaluran_app/app/utils/date_formatter.dart'; import 'package:penyaluran_app/app/utils/date_time_helper.dart';
import 'package:penyaluran_app/app/widgets/detail_penitipan_dialog.dart'; import 'package:penyaluran_app/app/widgets/detail_penitipan_dialog.dart';
import 'dart:io'; import 'dart:io';
@ -78,7 +78,7 @@ class PenitipanView extends GetView<PenitipanBantuanController> {
context, context,
icon: Icons.pending_actions, icon: Icons.pending_actions,
title: 'Menunggu', title: 'Menunggu',
value: DateFormatter.formatNumber( value: DateTimeHelper.formatNumber(
controller.jumlahMenunggu.value), controller.jumlahMenunggu.value),
color: Colors.orange, color: Colors.orange,
), ),
@ -88,7 +88,7 @@ class PenitipanView extends GetView<PenitipanBantuanController> {
context, context,
icon: Icons.check_circle, icon: Icons.check_circle,
title: 'Terverifikasi', title: 'Terverifikasi',
value: DateFormatter.formatNumber( value: DateTimeHelper.formatNumber(
controller.jumlahTerverifikasi.value), controller.jumlahTerverifikasi.value),
color: Colors.green, color: Colors.green,
), ),
@ -98,7 +98,7 @@ class PenitipanView extends GetView<PenitipanBantuanController> {
context, context,
icon: Icons.cancel, icon: Icons.cancel,
title: 'Ditolak', title: 'Ditolak',
value: DateFormatter.formatNumber( value: DateTimeHelper.formatNumber(
controller.jumlahDitolak.value), controller.jumlahDitolak.value),
color: Colors.red, color: Colors.red,
), ),
@ -225,7 +225,7 @@ class PenitipanView extends GetView<PenitipanBantuanController> {
), ),
), ),
Text( Text(
'${DateFormatter.formatNumber(filteredList.length)} item', '${DateTimeHelper.formatNumber(filteredList.length)} item',
style: Theme.of(context).textTheme.bodyMedium?.copyWith( style: Theme.of(context).textTheme.bodyMedium?.copyWith(
color: Colors.grey, color: Colors.grey,
), ),
@ -385,8 +385,8 @@ class PenitipanView extends GetView<PenitipanBantuanController> {
isUang ? Icons.account_balance_wallet : Icons.inventory, isUang ? Icons.account_balance_wallet : Icons.inventory,
label: 'Jumlah', label: 'Jumlah',
value: isUang value: isUang
? 'Rp ${DateFormatter.formatNumber(item.jumlah)}' ? 'Rp ${DateTimeHelper.formatNumber(item.jumlah)}'
: '${DateFormatter.formatNumber(item.jumlah)} $kategoriSatuan', : '${DateTimeHelper.formatNumber(item.jumlah)} $kategoriSatuan',
), ),
), ),
], ],
@ -400,7 +400,7 @@ class PenitipanView extends GetView<PenitipanBantuanController> {
context, context,
icon: Icons.calendar_today, icon: Icons.calendar_today,
label: 'Tanggal Dibuat', label: 'Tanggal Dibuat',
value: DateFormatter.formatDateTime(item.createdAt, value: DateTimeHelper.formatDateTime(item.createdAt,
defaultValue: 'Tidak ada tanggal'), defaultValue: 'Tidak ada tanggal'),
), ),
), ),
@ -1523,7 +1523,7 @@ class PenitipanView extends GetView<PenitipanBantuanController> {
Widget _buildLastUpdateInfo(BuildContext context) { Widget _buildLastUpdateInfo(BuildContext context) {
return Obx(() { return Obx(() {
final lastUpdate = controller.lastUpdateTime.value; final lastUpdate = controller.lastUpdateTime.value;
final formattedDate = DateFormatter.formatDateTimeWithHour(lastUpdate); final formattedDate = DateTimeHelper.formatDateTimeWithHour(lastUpdate);
return Padding( return Padding(
padding: const EdgeInsets.only(top: 8.0), padding: const EdgeInsets.only(top: 8.0),

View File

@ -3,7 +3,6 @@ import 'package:get/get.dart';
import 'package:penyaluran_app/app/modules/petugas_desa/controllers/jadwal_penyaluran_controller.dart'; import 'package:penyaluran_app/app/modules/petugas_desa/controllers/jadwal_penyaluran_controller.dart';
import 'package:penyaluran_app/app/theme/app_theme.dart'; import 'package:penyaluran_app/app/theme/app_theme.dart';
import 'package:penyaluran_app/app/modules/petugas_desa/components/jadwal_section_widget.dart'; import 'package:penyaluran_app/app/modules/petugas_desa/components/jadwal_section_widget.dart';
import 'package:penyaluran_app/app/modules/petugas_desa/components/permintaan_penjadwalan_summary_widget.dart';
import 'package:penyaluran_app/app/modules/petugas_desa/components/calendar_view_widget.dart'; import 'package:penyaluran_app/app/modules/petugas_desa/components/calendar_view_widget.dart';
import 'package:penyaluran_app/app/modules/petugas_desa/views/tambah_penyaluran_view.dart'; import 'package:penyaluran_app/app/modules/petugas_desa/views/tambah_penyaluran_view.dart';
@ -117,18 +116,7 @@ class PenyaluranView extends GetView<JadwalPenyaluranController> {
); );
} }
return Column( return CalendarViewWidget(controller: controller);
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Ringkasan jadwal
_buildJadwalSummary(Get.context!),
const SizedBox(height: 20),
// Kalender Penyaluran Bulan Ini
CalendarViewWidget(controller: controller),
],
);
}), }),
), ),
), ),

View File

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:penyaluran_app/app/data/models/penitipan_bantuan_model.dart'; import 'package:penyaluran_app/app/data/models/penitipan_bantuan_model.dart';
import 'package:penyaluran_app/app/modules/petugas_desa/controllers/penitipan_bantuan_controller.dart'; import 'package:penyaluran_app/app/modules/petugas_desa/controllers/penitipan_bantuan_controller.dart';
import 'package:penyaluran_app/app/utils/date_formatter.dart'; import 'package:penyaluran_app/app/utils/date_time_helper.dart';
import 'package:penyaluran_app/app/theme/app_theme.dart'; import 'package:penyaluran_app/app/theme/app_theme.dart';
class RiwayatPenitipanView extends GetView<PenitipanBantuanController> { class RiwayatPenitipanView extends GetView<PenitipanBantuanController> {
@ -47,7 +47,7 @@ class RiwayatPenitipanView extends GetView<PenitipanBantuanController> {
final kategoriNama = item.kategoriBantuan?.nama?.toLowerCase() ?? ''; final kategoriNama = item.kategoriBantuan?.nama?.toLowerCase() ?? '';
final deskripsi = item.deskripsi?.toLowerCase() ?? ''; final deskripsi = item.deskripsi?.toLowerCase() ?? '';
final tanggal = final tanggal =
DateFormatter.formatDateTime(item.tanggalPenitipan).toLowerCase(); DateTimeHelper.formatDateTime(item.tanggalPenitipan).toLowerCase();
return donaturNama.contains(searchText) || return donaturNama.contains(searchText) ||
kategoriNama.contains(searchText) || kategoriNama.contains(searchText) ||
@ -99,7 +99,7 @@ class RiwayatPenitipanView extends GetView<PenitipanBantuanController> {
), ),
), ),
Text( Text(
'${DateFormatter.formatNumber(filteredList.length)} item', '${DateTimeHelper.formatNumber(filteredList.length)} item',
style: style:
Theme.of(context).textTheme.bodyMedium?.copyWith( Theme.of(context).textTheme.bodyMedium?.copyWith(
color: Colors.grey, color: Colors.grey,
@ -113,7 +113,7 @@ class RiwayatPenitipanView extends GetView<PenitipanBantuanController> {
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'Total: ${DateFormatter.formatNumber(filteredList.length)} item', 'Total: ${DateTimeHelper.formatNumber(filteredList.length)} item',
style: style:
Theme.of(context).textTheme.bodyMedium?.copyWith( Theme.of(context).textTheme.bodyMedium?.copyWith(
color: Colors.grey, color: Colors.grey,
@ -126,7 +126,7 @@ class RiwayatPenitipanView extends GetView<PenitipanBantuanController> {
size: 16, color: Colors.grey[600]), size: 16, color: Colors.grey[600]),
const SizedBox(width: 4), const SizedBox(width: 4),
Text( Text(
'Update: ${DateFormatter.formatDateTimeWithHour(controller.lastUpdateTime.value)}', 'Update: ${DateTimeHelper.formatDateTimeWithHour(controller.lastUpdateTime.value)}',
style: TextStyle( style: TextStyle(
fontSize: 12, fontSize: 12,
color: Colors.grey[600], color: Colors.grey[600],
@ -284,8 +284,8 @@ class RiwayatPenitipanView extends GetView<PenitipanBantuanController> {
isUang ? Icons.account_balance_wallet : Icons.inventory, isUang ? Icons.account_balance_wallet : Icons.inventory,
label: 'Jumlah', label: 'Jumlah',
value: isUang value: isUang
? 'Rp ${DateFormatter.formatNumber(item.jumlah)}' ? 'Rp ${DateTimeHelper.formatNumber(item.jumlah)}'
: '${DateFormatter.formatNumber(item.jumlah)} $kategoriSatuan', : '${DateTimeHelper.formatNumber(item.jumlah)} $kategoriSatuan',
), ),
), ),
], ],
@ -300,7 +300,7 @@ class RiwayatPenitipanView extends GetView<PenitipanBantuanController> {
label: item.status == 'TERVERIFIKASI' label: item.status == 'TERVERIFIKASI'
? 'Tanggal Verifikasi' ? 'Tanggal Verifikasi'
: 'Tanggal Penolakan', : 'Tanggal Penolakan',
value: DateFormatter.formatDateTime( value: DateTimeHelper.formatDateTime(
item.status == 'TERVERIFIKASI' item.status == 'TERVERIFIKASI'
? item.tanggalVerifikasi ? item.tanggalVerifikasi
: item.updatedAt, : item.updatedAt,
@ -414,20 +414,20 @@ class RiwayatPenitipanView extends GetView<PenitipanBantuanController> {
_buildDetailItem( _buildDetailItem(
'Jumlah', 'Jumlah',
isUang isUang
? 'Rp ${DateFormatter.formatNumber(item.jumlah)}' ? 'Rp ${DateTimeHelper.formatNumber(item.jumlah)}'
: '${DateFormatter.formatNumber(item.jumlah)} $kategoriSatuan'), : '${DateTimeHelper.formatNumber(item.jumlah)} $kategoriSatuan'),
if (isUang) _buildDetailItem('Jenis Bantuan', 'Uang (Rupiah)'), if (isUang) _buildDetailItem('Jenis Bantuan', 'Uang (Rupiah)'),
_buildDetailItem( _buildDetailItem(
'Deskripsi', item.deskripsi ?? 'Tidak ada deskripsi'), 'Deskripsi', item.deskripsi ?? 'Tidak ada deskripsi'),
_buildDetailItem( _buildDetailItem(
'Tanggal Penitipan', 'Tanggal Penitipan',
DateFormatter.formatDateTime(item.tanggalPenitipan, DateTimeHelper.formatDateTime(item.tanggalPenitipan,
defaultValue: 'Tidak ada tanggal'), defaultValue: 'Tidak ada tanggal'),
), ),
if (item.tanggalVerifikasi != null) if (item.tanggalVerifikasi != null)
_buildDetailItem( _buildDetailItem(
'Tanggal Verifikasi', 'Tanggal Verifikasi',
DateFormatter.formatDateTime(item.tanggalVerifikasi), DateTimeHelper.formatDateTime(item.tanggalVerifikasi),
), ),
if (item.status == 'TERVERIFIKASI' && item.petugasDesaId != null) if (item.status == 'TERVERIFIKASI' && item.petugasDesaId != null)
_buildDetailItem( _buildDetailItem(
@ -435,7 +435,7 @@ class RiwayatPenitipanView extends GetView<PenitipanBantuanController> {
controller.getPetugasDesaNama(item.petugasDesaId), controller.getPetugasDesaNama(item.petugasDesaId),
), ),
_buildDetailItem('Tanggal Dibuat', _buildDetailItem('Tanggal Dibuat',
DateFormatter.formatDateTime(item.createdAt)), DateTimeHelper.formatDateTime(item.createdAt)),
if (item.alasanPenolakan != null && if (item.alasanPenolakan != null &&
item.alasanPenolakan!.isNotEmpty) item.alasanPenolakan!.isNotEmpty)
_buildDetailItem('Alasan Penolakan', item.alasanPenolakan!), _buildDetailItem('Alasan Penolakan', item.alasanPenolakan!),

View File

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:penyaluran_app/app/data/models/penyaluran_bantuan_model.dart'; import 'package:penyaluran_app/app/data/models/penyaluran_bantuan_model.dart';
import 'package:penyaluran_app/app/modules/petugas_desa/controllers/jadwal_penyaluran_controller.dart'; import 'package:penyaluran_app/app/modules/petugas_desa/controllers/jadwal_penyaluran_controller.dart';
import 'package:penyaluran_app/app/utils/date_formatter.dart'; import 'package:penyaluran_app/app/utils/date_time_helper.dart';
import 'package:penyaluran_app/app/theme/app_theme.dart'; import 'package:penyaluran_app/app/theme/app_theme.dart';
class RiwayatPenyaluranView extends GetView<JadwalPenyaluranController> { class RiwayatPenyaluranView extends GetView<JadwalPenyaluranController> {
@ -52,7 +52,7 @@ class RiwayatPenyaluranView extends GetView<JadwalPenyaluranController> {
.getKategoriBantuanName(item.kategoriBantuanId) .getKategoriBantuanName(item.kategoriBantuanId)
.toLowerCase(); .toLowerCase();
final tanggal = final tanggal =
DateFormatter.formatDateTime(item.tanggalPenyaluran).toLowerCase(); DateTimeHelper.formatDateTime(item.tanggalPenyaluran).toLowerCase();
return nama.contains(searchText) || return nama.contains(searchText) ||
deskripsi.contains(searchText) || deskripsi.contains(searchText) ||
@ -105,7 +105,7 @@ class RiwayatPenyaluranView extends GetView<JadwalPenyaluranController> {
), ),
), ),
Text( Text(
'${DateFormatter.formatNumber(filteredList.length)} item', '${DateTimeHelper.formatNumber(filteredList.length)} item',
style: style:
Theme.of(context).textTheme.bodyMedium?.copyWith( Theme.of(context).textTheme.bodyMedium?.copyWith(
color: Colors.grey, color: Colors.grey,
@ -119,7 +119,7 @@ class RiwayatPenyaluranView extends GetView<JadwalPenyaluranController> {
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
'Total: ${DateFormatter.formatNumber(filteredList.length)} item', 'Total: ${DateTimeHelper.formatNumber(filteredList.length)} item',
style: style:
Theme.of(context).textTheme.bodyMedium?.copyWith( Theme.of(context).textTheme.bodyMedium?.copyWith(
color: Colors.grey, color: Colors.grey,
@ -132,7 +132,7 @@ class RiwayatPenyaluranView extends GetView<JadwalPenyaluranController> {
size: 16, color: Colors.grey[600]), size: 16, color: Colors.grey[600]),
const SizedBox(width: 4), const SizedBox(width: 4),
Text( Text(
'Update: ${DateFormatter.formatDateTimeWithHour(DateTime.now())}', 'Update: ${DateTimeHelper.formatDateTimeWithHour(DateTime.now())}',
style: TextStyle( style: TextStyle(
fontSize: 12, fontSize: 12,
color: Colors.grey[600], color: Colors.grey[600],
@ -305,8 +305,8 @@ class RiwayatPenyaluranView extends GetView<JadwalPenyaluranController> {
child: _buildInfoItem( child: _buildInfoItem(
Icons.event, Icons.event,
'Tanggal', 'Tanggal',
DateFormatter.formatDateTime(item.tanggalPenyaluran, DateTimeHelper.formatDateTime(item.tanggalPenyaluran,
defaultValue: 'Tidak ada tanggal'), format: 'dd MMM yyyy HH:mm'),
Theme.of(context).textTheme, Theme.of(context).textTheme,
), ),
), ),
@ -316,7 +316,7 @@ class RiwayatPenyaluranView extends GetView<JadwalPenyaluranController> {
_buildInfoItem( _buildInfoItem(
Icons.people_outline, Icons.people_outline,
'Jumlah Penerima', 'Jumlah Penerima',
'${DateFormatter.formatNumber(item.jumlahPenerima ?? 0)} orang', '${DateTimeHelper.formatNumber(item.jumlahPenerima ?? 0)} orang',
Theme.of(context).textTheme, Theme.of(context).textTheme,
), ),
if (item.alasanPembatalan != null && if (item.alasanPembatalan != null &&

View File

@ -3,7 +3,7 @@ import 'package:get/get.dart';
import 'package:penyaluran_app/app/data/models/stok_bantuan_model.dart'; import 'package:penyaluran_app/app/data/models/stok_bantuan_model.dart';
import 'package:penyaluran_app/app/modules/petugas_desa/controllers/stok_bantuan_controller.dart'; import 'package:penyaluran_app/app/modules/petugas_desa/controllers/stok_bantuan_controller.dart';
import 'package:penyaluran_app/app/theme/app_theme.dart'; import 'package:penyaluran_app/app/theme/app_theme.dart';
import 'package:penyaluran_app/app/utils/date_formatter.dart'; import 'package:penyaluran_app/app/utils/date_time_helper.dart';
class StokBantuanView extends GetView<StokBantuanController> { class StokBantuanView extends GetView<StokBantuanController> {
const StokBantuanView({super.key}); const StokBantuanView({super.key});
@ -154,7 +154,7 @@ class StokBantuanView extends GetView<StokBantuanController> {
), ),
), ),
Text( Text(
'Rp ${DateFormatter.formatNumber(controller.totalDanaBantuan.value)}', 'Rp ${DateTimeHelper.formatNumber(controller.totalDanaBantuan.value)}',
style: style:
Theme.of(context).textTheme.titleLarge?.copyWith( Theme.of(context).textTheme.titleLarge?.copyWith(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
@ -417,8 +417,8 @@ class StokBantuanView extends GetView<StokBantuanController> {
: Icons.inventory, : Icons.inventory,
label: item.isUang == true ? 'Total Dana' : 'Total Stok', label: item.isUang == true ? 'Total Dana' : 'Total Stok',
value: item.isUang == true value: item.isUang == true
? 'Rp ${DateFormatter.formatNumber(item.totalStok)}' ? 'Rp ${DateTimeHelper.formatNumber(item.totalStok)}'
: '${DateFormatter.formatNumber(item.totalStok)} ${item.satuan ?? ''}', : '${DateTimeHelper.formatNumber(item.totalStok)} ${item.satuan ?? ''}',
), ),
), ),
Expanded( Expanded(
@ -426,7 +426,7 @@ class StokBantuanView extends GetView<StokBantuanController> {
context, context,
icon: Icons.access_time, icon: Icons.access_time,
label: 'Terakhir Diperbarui', label: 'Terakhir Diperbarui',
value: DateFormatter.formatDateTime(item.updatedAt), value: DateTimeHelper.formatDateTime(item.updatedAt),
), ),
), ),
], ],
@ -873,8 +873,8 @@ class StokBantuanView extends GetView<StokBantuanController> {
const SizedBox(width: 8), const SizedBox(width: 8),
Text( Text(
isUang isUang
? 'Rp ${DateFormatter.formatNumber(stok.totalStok)}' ? 'Rp ${DateTimeHelper.formatNumber(stok.totalStok)}'
: '${DateFormatter.formatNumber(stok.totalStok)} ${stok.satuan ?? ''}', : '${DateTimeHelper.formatNumber(stok.totalStok)} ${stok.satuan ?? ''}',
style: TextStyle(fontWeight: FontWeight.bold), style: TextStyle(fontWeight: FontWeight.bold),
), ),
], ],
@ -1064,8 +1064,8 @@ class StokBantuanView extends GetView<StokBantuanController> {
SizedBox(width: 4), SizedBox(width: 4),
Text( Text(
stok.isUang == true stok.isUang == true
? 'Rp ${DateFormatter.formatNumber(stok.totalStok)}' ? 'Rp ${DateTimeHelper.formatNumber(stok.totalStok)}'
: '${DateFormatter.formatNumber(stok.totalStok)} ${stok.satuan ?? ''}', : '${DateTimeHelper.formatNumber(stok.totalStok)} ${stok.satuan ?? ''}',
style: TextStyle(fontWeight: FontWeight.bold), style: TextStyle(fontWeight: FontWeight.bold),
), ),
], ],
@ -1129,7 +1129,7 @@ class StokBantuanView extends GetView<StokBantuanController> {
Widget _buildLastUpdateInfo(BuildContext context) { Widget _buildLastUpdateInfo(BuildContext context) {
return Obx(() { return Obx(() {
final lastUpdate = controller.lastUpdateTime.value; final lastUpdate = controller.lastUpdateTime.value;
final formattedDate = DateFormatter.formatDateTimeWithHour(lastUpdate); final formattedDate = DateTimeHelper.formatDateTimeWithHour(lastUpdate);
return Padding( return Padding(
padding: const EdgeInsets.only(top: 8.0), padding: const EdgeInsets.only(top: 8.0),

View File

@ -3,7 +3,7 @@ import 'package:get/get.dart';
import 'package:penyaluran_app/app/modules/petugas_desa/controllers/jadwal_penyaluran_controller.dart'; import 'package:penyaluran_app/app/modules/petugas_desa/controllers/jadwal_penyaluran_controller.dart';
import 'package:penyaluran_app/app/theme/app_theme.dart'; import 'package:penyaluran_app/app/theme/app_theme.dart';
import 'package:penyaluran_app/app/data/models/skema_bantuan_model.dart'; import 'package:penyaluran_app/app/data/models/skema_bantuan_model.dart';
import 'package:penyaluran_app/app/utils/date_formatter.dart'; import 'package:penyaluran_app/app/utils/date_time_helper.dart';
class TambahPenyaluranView extends GetView<JadwalPenyaluranController> { class TambahPenyaluranView extends GetView<JadwalPenyaluranController> {
const TambahPenyaluranView({super.key}); const TambahPenyaluranView({super.key});
@ -327,7 +327,7 @@ class TambahPenyaluranView extends GetView<JadwalPenyaluranController> {
if (pickedDate != null) { if (pickedDate != null) {
selectedDate.value = pickedDate; selectedDate.value = pickedDate;
tanggalPenyaluranController.text = tanggalPenyaluranController.text =
DateFormatter.formatDate(pickedDate); DateTimeHelper.formatDate(pickedDate);
} }
}, },
validator: (value) { validator: (value) {

View File

@ -1,60 +0,0 @@
import 'package:intl/intl.dart';
class DateFormatter {
static String formatDate(DateTime? date,
{String format = 'dd MMMM yyyy',
String locale = 'id_ID',
String defaultValue = '-'}) {
if (date == null) return defaultValue;
try {
return DateFormat(format, locale).format(date);
} catch (e) {
print('Error formatting date: $e');
return date.toString().split(' ')[0]; // Fallback to basic format
}
}
static String formatTime(DateTime? time,
{String format = 'HH:mm',
String locale = 'id_ID',
String defaultValue = '-'}) {
if (time == null) return defaultValue;
try {
return DateFormat(format, locale).format(time);
} catch (e) {
print('Error formatting time: $e');
return time
.toString()
.split(' ')[1]
.substring(0, 5); // Fallback to basic format
}
}
static String formatDateTime(DateTime? dateTime,
{String format = 'dd MMMM yyyy HH:mm',
String locale = 'id_ID',
String defaultValue = '-'}) {
if (dateTime == null) return defaultValue;
try {
return DateFormat(format, locale).format(dateTime);
} catch (e) {
print('Error formatting date time: $e');
return dateTime.toString().split('.')[0]; // Fallback to basic format
}
}
static String formatNumber(num? number,
{String locale = 'id_ID', String defaultValue = '0'}) {
if (number == null) return defaultValue;
try {
return NumberFormat("#,##0.##", locale).format(number);
} catch (e) {
print('Error formatting number: $e');
return number.toString(); // Fallback to basic format
}
}
static String formatDateTimeWithHour(DateTime dateTime) {
return DateFormat('dd MMMM yyyy HH:mm', 'id_ID').format(dateTime);
}
}

View File

@ -1,5 +1,4 @@
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:penyaluran_app/app/utils/date_formatter.dart';
class DateTimeHelper { class DateTimeHelper {
/// Mengkonversi DateTime dari UTC ke timezone lokal /// Mengkonversi DateTime dari UTC ke timezone lokal
@ -8,31 +7,57 @@ class DateTimeHelper {
} }
/// Format tanggal ke format Indonesia (dd MMM yyyy) /// Format tanggal ke format Indonesia (dd MMM yyyy)
static String formatDate(DateTime? dateTime) { static String formatDate(DateTime? dateTime,
if (dateTime == null) return 'Belum ditentukan'; {String format = 'dd MMM yyyy',
String locale = 'id_ID',
String defaultValue = 'Belum ditentukan'}) {
if (dateTime == null) return defaultValue;
// Pastikan tanggal dalam timezone lokal // Pastikan tanggal dalam timezone lokal
final localDateTime = toLocalDateTime(dateTime); final localDateTime = toLocalDateTime(dateTime);
return DateFormatter.formatDate(localDateTime, format: 'dd MMM yyyy'); try {
return DateFormat(format, locale).format(localDateTime);
} catch (e) {
print('Error formatting date: $e');
return localDateTime.toString().split(' ')[0]; // Fallback to basic format
}
} }
/// Format waktu ke format 24 jam (HH:mm) /// Format waktu ke format 24 jam (HH:mm)
static String formatTime(DateTime? dateTime) { static String formatTime(DateTime? dateTime,
if (dateTime == null) return 'Belum ditentukan'; {String format = 'HH:mm',
String locale = 'id_ID',
String defaultValue = 'Belum ditentukan'}) {
if (dateTime == null) return defaultValue;
// Pastikan waktu dalam timezone lokal // Pastikan waktu dalam timezone lokal
final localDateTime = toLocalDateTime(dateTime); final localDateTime = toLocalDateTime(dateTime);
return DateFormatter.formatTime(localDateTime); try {
return DateFormat(format, locale).format(localDateTime);
} catch (e) {
print('Error formatting time: $e');
return localDateTime
.toString()
.split(' ')[1]
.substring(0, 5); // Fallback to basic format
}
} }
/// Format tanggal dan waktu (dd MMM yyyy HH:mm) /// Format tanggal dan waktu (dd MMM yyyy HH:mm)
static String formatDateTime(DateTime? dateTime) { static String formatDateTime(DateTime? dateTime,
if (dateTime == null) return 'Belum ditentukan'; {String format = 'dd MMM yyyy HH:mm',
String locale = 'id_ID',
String defaultValue = 'Belum ditentukan'}) {
if (dateTime == null) return defaultValue;
// Pastikan tanggal dan waktu dalam timezone lokal // Pastikan tanggal dan waktu dalam timezone lokal
final localDateTime = toLocalDateTime(dateTime); final localDateTime = toLocalDateTime(dateTime);
return DateFormatter.formatDateTime(localDateTime, try {
format: 'dd MMM yyyy HH:mm'); return DateFormat(format, locale).format(localDateTime);
} catch (e) {
print('Error formatting date time: $e');
return localDateTime.toString().split('.')[0]; // Fallback to basic format
}
} }
/// Format tanggal lengkap dalam bahasa Indonesia (Senin, 01 Januari 2023) /// Format tanggal lengkap dalam bahasa Indonesia (Senin, 01 Januari 2023)
@ -74,4 +99,23 @@ class DateTimeHelper {
return '$hari, $tanggal $bulan $tahun'; return '$hari, $tanggal $bulan $tahun';
} }
/// Format angka dengan pemisah ribuan
static String formatNumber(num? number,
{String locale = 'id_ID', String defaultValue = '0'}) {
if (number == null) return defaultValue;
try {
return NumberFormat("#,##0.##", locale).format(number);
} catch (e) {
print('Error formatting number: $e');
return number.toString(); // Fallback to basic format
}
}
/// Format tanggal dan waktu dengan jam (dd MMMM yyyy HH:mm)
static String formatDateTimeWithHour(DateTime? dateTime) {
if (dateTime == null) return 'Belum ditentukan';
final localDateTime = toLocalDateTime(dateTime);
return DateFormat('dd MMMM yyyy HH:mm', 'id_ID').format(localDateTime);
}
} }

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:penyaluran_app/app/data/models/penitipan_bantuan_model.dart'; import 'package:penyaluran_app/app/data/models/penitipan_bantuan_model.dart';
import 'package:penyaluran_app/app/utils/date_formatter.dart'; import 'package:penyaluran_app/app/utils/date_time_helper.dart';
/// Dialog untuk menampilkan detail penitipan bantuan /// Dialog untuk menampilkan detail penitipan bantuan
/// ///
@ -54,20 +54,20 @@ class DetailPenitipanDialog {
_buildDetailItem( _buildDetailItem(
'Jumlah', 'Jumlah',
isUang isUang
? 'Rp ${DateFormatter.formatNumber(item.jumlah)}' ? 'Rp ${DateTimeHelper.formatNumber(item.jumlah)}'
: '${DateFormatter.formatNumber(item.jumlah)} $kategoriSatuan'), : '${DateTimeHelper.formatNumber(item.jumlah)} $kategoriSatuan'),
if (isUang) _buildDetailItem('Jenis Bantuan', 'Uang (Rupiah)'), if (isUang) _buildDetailItem('Jenis Bantuan', 'Uang (Rupiah)'),
_buildDetailItem( _buildDetailItem(
'Deskripsi', item.deskripsi ?? 'Tidak ada deskripsi'), 'Deskripsi', item.deskripsi ?? 'Tidak ada deskripsi'),
_buildDetailItem( _buildDetailItem(
'Tanggal Penitipan', 'Tanggal Penitipan',
DateFormatter.formatDateTime(item.tanggalPenitipan, DateTimeHelper.formatDateTime(item.tanggalPenitipan,
defaultValue: 'Tidak ada tanggal'), defaultValue: 'Tidak ada tanggal'),
), ),
if (item.tanggalVerifikasi != null) if (item.tanggalVerifikasi != null)
_buildDetailItem( _buildDetailItem(
'Tanggal Verifikasi', 'Tanggal Verifikasi',
DateFormatter.formatDateTime(item.tanggalVerifikasi), DateTimeHelper.formatDateTime(item.tanggalVerifikasi),
), ),
if (item.status == 'TERVERIFIKASI' && item.petugasDesaId != null) if (item.status == 'TERVERIFIKASI' && item.petugasDesaId != null)
_buildDetailItem( _buildDetailItem(
@ -75,7 +75,7 @@ class DetailPenitipanDialog {
getPetugasDesaNama(item.petugasDesaId), getPetugasDesaNama(item.petugasDesaId),
), ),
_buildDetailItem('Tanggal Dibuat', _buildDetailItem('Tanggal Dibuat',
DateFormatter.formatDateTime(item.createdAt)), DateTimeHelper.formatDateTime(item.createdAt)),
if (item.alasanPenolakan != null && if (item.alasanPenolakan != null &&
item.alasanPenolakan!.isNotEmpty) item.alasanPenolakan!.isNotEmpty)
_buildDetailItem('Alasan Penolakan', item.alasanPenolakan!), _buildDetailItem('Alasan Penolakan', item.alasanPenolakan!),