Perbarui tampilan di beberapa view untuk meningkatkan konsistensi dan pengalaman pengguna. Ganti penggunaan parameter key dengan super.key di beberapa widget. Tambahkan pengecekan null pada data pengaduan untuk mencegah kesalahan saat menampilkan informasi. Modifikasi beberapa metode untuk menyederhanakan kode dan meningkatkan keterbacaan.

This commit is contained in:
Khafidh Fuadi
2025-03-19 09:36:58 +07:00
parent 7ee56903ee
commit 984b8336f0
140 changed files with 19314 additions and 122 deletions

View File

@ -16,7 +16,7 @@ import 'package:penyaluran_app/app/widgets/inputs/dropdown_input.dart';
import 'package:penyaluran_app/app/widgets/inputs/text_input.dart';
class DetailPengaduanView extends GetView<PengaduanController> {
const DetailPengaduanView({Key? key}) : super(key: key);
const DetailPengaduanView({super.key});
// Definisi konstanta warna status untuk konsistensi
static const Color statusMenungguColor = Colors.orange;
@ -123,8 +123,9 @@ class DetailPengaduanView extends GetView<PengaduanController> {
if (!snapshot.hasData) return const SizedBox();
final data = snapshot.data;
if (data == null || data['pengaduan'] == null)
if (data == null || data['pengaduan'] == null) {
return const SizedBox();
}
final pengaduan = PengaduanModel.fromJson(data['pengaduan']);
@ -1511,7 +1512,7 @@ class DetailPengaduanView extends GetView<PengaduanController> {
} catch (e) {
// Tutup loading dialog jika terjadi error
Navigator.of(dialogContext, rootNavigator: true).pop();
throw e;
rethrow;
}
}
} catch (e) {

View File

@ -3,7 +3,6 @@ import 'package:get/get.dart';
import 'package:penyaluran_app/app/modules/petugas_desa/controllers/pengaduan_controller.dart';
import 'package:penyaluran_app/app/theme/app_theme.dart';
import 'package:penyaluran_app/app/utils/date_time_helper.dart';
import 'package:penyaluran_app/app/routes/app_pages.dart';
class PengaduanView extends GetView<PengaduanController> {
const PengaduanView({super.key});

View File

@ -111,78 +111,75 @@ class WargaDashboardController extends GetxController {
)
''').eq('warga_id', wargaId).order('created_at', ascending: false);
if (response != null) {
final List<PenerimaPenyaluranModel> penerima = [];
for (var item in response) {
Map<String, dynamic> sanitizedPenerimaData =
Map<String, dynamic>.from(item);
final List<PenerimaPenyaluranModel> penerima = [];
for (var item in response) {
Map<String, dynamic> sanitizedPenerimaData =
Map<String, dynamic>.from(item);
if (sanitizedPenerimaData['jumlah_bantuan'] is String) {
var jumlahBantuan = double.tryParse(
sanitizedPenerimaData['jumlah_bantuan'] as String);
sanitizedPenerimaData['jumlah_bantuan'] = jumlahBantuan;
}
// Tambahkan informasi apakah bantuan uang atau bukan dan satuan
if (sanitizedPenerimaData['stok_bantuan'] != null) {
// Cek apakah bantuan uang
final isUang =
sanitizedPenerimaData['stok_bantuan']['is_uang'] ?? false;
sanitizedPenerimaData['is_uang'] = isUang;
// Ambil satuan
final satuan =
sanitizedPenerimaData['stok_bantuan']['satuan'] ?? '';
sanitizedPenerimaData['satuan'] = satuan;
// Ambil nama kategori bantuan jika tersedia
if (sanitizedPenerimaData['stok_bantuan']['kategori_bantuan'] !=
null) {
final kategoriNama = sanitizedPenerimaData['stok_bantuan']
['kategori_bantuan']['nama'] ??
'';
sanitizedPenerimaData['kategori_nama'] = kategoriNama;
}
}
// Tambahkan informasi dari penyaluran bantuan
if (sanitizedPenerimaData['penyaluran_bantuan'] != null) {
// Ambil nama penyaluran
final namaPenyaluran =
sanitizedPenerimaData['penyaluran_bantuan']['nama'] ?? '';
sanitizedPenerimaData['nama_penyaluran'] = namaPenyaluran;
// Ambil deskripsi penyaluran
final deskripsiPenyaluran =
sanitizedPenerimaData['penyaluran_bantuan']['deskripsi'] ?? '';
sanitizedPenerimaData['deskripsi_penyaluran'] = deskripsiPenyaluran;
// Ambil lokasi penyaluran jika tersedia
if (sanitizedPenerimaData['penyaluran_bantuan']
['lokasi_penyaluran'] !=
null) {
final lokasiNama = sanitizedPenerimaData['penyaluran_bantuan']
['lokasi_penyaluran']['nama'] ??
'';
sanitizedPenerimaData['lokasi_penyaluran_nama'] = lokasiNama;
final lokasiAlamat = sanitizedPenerimaData['penyaluran_bantuan']
['lokasi_penyaluran']['alamat_lengkap'] ??
'';
sanitizedPenerimaData['lokasi_penyaluran_alamat'] = lokasiAlamat;
}
}
var model = PenerimaPenyaluranModel.fromJson(sanitizedPenerimaData);
penerima.add(model);
if (sanitizedPenerimaData['jumlah_bantuan'] is String) {
var jumlahBantuan = double.tryParse(
sanitizedPenerimaData['jumlah_bantuan'] as String);
sanitizedPenerimaData['jumlah_bantuan'] = jumlahBantuan;
}
penerimaPenyaluran.assignAll(penerima);
// Tambahkan informasi apakah bantuan uang atau bukan dan satuan
if (sanitizedPenerimaData['stok_bantuan'] != null) {
// Cek apakah bantuan uang
final isUang =
sanitizedPenerimaData['stok_bantuan']['is_uang'] ?? false;
sanitizedPenerimaData['is_uang'] = isUang;
var diterima =
penerima.where((p) => p.statusPenerimaan == 'DITERIMA').length;
totalPenyaluranDiterima.value = diterima;
// Ambil satuan
final satuan = sanitizedPenerimaData['stok_bantuan']['satuan'] ?? '';
sanitizedPenerimaData['satuan'] = satuan;
// Ambil nama kategori bantuan jika tersedia
if (sanitizedPenerimaData['stok_bantuan']['kategori_bantuan'] !=
null) {
final kategoriNama = sanitizedPenerimaData['stok_bantuan']
['kategori_bantuan']['nama'] ??
'';
sanitizedPenerimaData['kategori_nama'] = kategoriNama;
}
}
// Tambahkan informasi dari penyaluran bantuan
if (sanitizedPenerimaData['penyaluran_bantuan'] != null) {
// Ambil nama penyaluran
final namaPenyaluran =
sanitizedPenerimaData['penyaluran_bantuan']['nama'] ?? '';
sanitizedPenerimaData['nama_penyaluran'] = namaPenyaluran;
// Ambil deskripsi penyaluran
final deskripsiPenyaluran =
sanitizedPenerimaData['penyaluran_bantuan']['deskripsi'] ?? '';
sanitizedPenerimaData['deskripsi_penyaluran'] = deskripsiPenyaluran;
// Ambil lokasi penyaluran jika tersedia
if (sanitizedPenerimaData['penyaluran_bantuan']
['lokasi_penyaluran'] !=
null) {
final lokasiNama = sanitizedPenerimaData['penyaluran_bantuan']
['lokasi_penyaluran']['nama'] ??
'';
sanitizedPenerimaData['lokasi_penyaluran_nama'] = lokasiNama;
final lokasiAlamat = sanitizedPenerimaData['penyaluran_bantuan']
['lokasi_penyaluran']['alamat_lengkap'] ??
'';
sanitizedPenerimaData['lokasi_penyaluran_alamat'] = lokasiAlamat;
}
}
var model = PenerimaPenyaluranModel.fromJson(sanitizedPenerimaData);
penerima.add(model);
}
penerimaPenyaluran.assignAll(penerima);
var diterima =
penerima.where((p) => p.statusPenerimaan == 'DITERIMA').length;
totalPenyaluranDiterima.value = diterima;
} catch (e) {
print('Error fetchPenerimaPenyaluran: $e');
}
@ -198,10 +195,6 @@ class WargaDashboardController extends GetxController {
.eq('user_id', user!.id)
.single();
if (wargaResponse == null) {
return;
}
final wargaId = wargaResponse['id'];
final response = await _supabaseService.client
@ -210,28 +203,26 @@ class WargaDashboardController extends GetxController {
.eq('warga_id', wargaId)
.order('created_at', ascending: false);
if (response != null) {
final List<PengajuanKelayakanBantuanModel> pengajuan = [];
for (var item in response) {
// Konversi status ke enum
if (item['status'] != null) {
final statusStr = item['status'].toString();
item['status'] = statusStr; // Pastikan status dalam format string
}
pengajuan.add(PengajuanKelayakanBantuanModel.fromJson(item));
final List<PengajuanKelayakanBantuanModel> pengajuan = [];
for (var item in response) {
// Konversi status ke enum
if (item['status'] != null) {
final statusStr = item['status'].toString();
item['status'] = statusStr; // Pastikan status dalam format string
}
pengajuanKelayakan.assignAll(pengajuan);
// Hitung jumlah berdasarkan status
totalPengajuanMenunggu.value =
pengajuan.where((p) => p.status == StatusKelayakan.MENUNGGU).length;
totalPengajuanTerverifikasi.value = pengajuan
.where((p) => p.status == StatusKelayakan.TERVERIFIKASI)
.length;
totalPengajuanDitolak.value =
pengajuan.where((p) => p.status == StatusKelayakan.DITOLAK).length;
pengajuan.add(PengajuanKelayakanBantuanModel.fromJson(item));
}
pengajuanKelayakan.assignAll(pengajuan);
// Hitung jumlah berdasarkan status
totalPengajuanMenunggu.value =
pengajuan.where((p) => p.status == StatusKelayakan.MENUNGGU).length;
totalPengajuanTerverifikasi.value = pengajuan
.where((p) => p.status == StatusKelayakan.TERVERIFIKASI)
.length;
totalPengajuanDitolak.value =
pengajuan.where((p) => p.status == StatusKelayakan.DITOLAK).length;
} catch (e) {
print('Error fetching pengajuan kelayakan: $e');
}

View File

@ -13,7 +13,7 @@ import 'package:penyaluran_app/app/widgets/cards/info_card.dart';
import 'dart:io';
class WargaDetailPengaduanView extends GetView<WargaDashboardController> {
const WargaDetailPengaduanView({Key? key}) : super(key: key);
const WargaDetailPengaduanView({super.key});
@override
Widget build(BuildContext context) {
@ -71,8 +71,9 @@ class WargaDetailPengaduanView extends GetView<WargaDashboardController> {
if (!snapshot.hasData) return const SizedBox();
final data = snapshot.data;
if (data == null || data['pengaduan'] == null)
if (data == null || data['pengaduan'] == null) {
return const SizedBox();
}
final pengaduan = PengaduanModel.fromJson(data['pengaduan']);
@ -228,8 +229,7 @@ class WargaDetailPengaduanView extends GetView<WargaDashboardController> {
}
// Dialog untuk menambahkan atau mengedit feedback
void _showFeedbackDialog(BuildContext context, PengaduanModel pengaduan,
{bool isEdit = false}) {
void _showFeedbackDialog(BuildContext context, PengaduanModel pengaduan) {
final formKey = GlobalKey<FormState>();
final feedbackController =
TextEditingController(text: pengaduan.feedbackWarga);
@ -1084,8 +1084,7 @@ class WargaDetailPengaduanView extends GetView<WargaDashboardController> {
class TambahTindakanPengaduanView extends StatefulWidget {
final String pengaduanId;
const TambahTindakanPengaduanView({Key? key, required this.pengaduanId})
: super(key: key);
const TambahTindakanPengaduanView({super.key, required this.pengaduanId});
@override
State<TambahTindakanPengaduanView> createState() =>

View File

@ -7,7 +7,7 @@ import 'package:penyaluran_app/app/widgets/bantuan_card.dart';
import 'package:penyaluran_app/app/widgets/section_header.dart';
class WargaDashboardView extends GetView<WargaDashboardController> {
const WargaDashboardView({Key? key}) : super(key: key);
const WargaDashboardView({super.key});
@override
Widget build(BuildContext context) {

View File

@ -7,7 +7,7 @@ import 'package:penyaluran_app/app/theme/app_theme.dart';
import 'package:penyaluran_app/app/widgets/status_badge.dart';
class WargaDetailPenerimaanView extends GetView<WargaDashboardController> {
const WargaDetailPenerimaanView({Key? key}) : super(key: key);
const WargaDetailPenerimaanView({super.key});
@override
Widget build(BuildContext context) {

View File

@ -4,7 +4,7 @@ import 'package:penyaluran_app/app/modules/warga/controllers/warga_dashboard_con
import 'package:penyaluran_app/app/widgets/bantuan_card.dart';
class WargaPenerimaanView extends GetView<WargaDashboardController> {
const WargaPenerimaanView({Key? key}) : super(key: key);
const WargaPenerimaanView({super.key});
@override
Widget build(BuildContext context) {
@ -29,8 +29,8 @@ class WargaPenerimaanView extends GetView<WargaDashboardController> {
Get.toNamed('/riwayat-penyaluran');
},
backgroundColor: Colors.blue,
child: const Icon(Icons.history),
tooltip: 'Riwayat Penerimaan',
child: const Icon(Icons.history),
),
);
}

View File

@ -1,11 +1,10 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:penyaluran_app/app/modules/warga/controllers/warga_dashboard_controller.dart';
import 'package:penyaluran_app/app/utils/date_time_helper.dart';
class WargaPengaduanView extends GetView<WargaDashboardController> {
const WargaPengaduanView({Key? key}) : super(key: key);
const WargaPengaduanView({super.key});
@override
Widget build(BuildContext context) {

View File

@ -9,7 +9,7 @@ import 'package:penyaluran_app/app/widgets/app_bottom_navigation_bar.dart';
import 'package:penyaluran_app/app/theme/app_theme.dart';
class WargaView extends GetView<WargaDashboardController> {
const WargaView({Key? key}) : super(key: key);
const WargaView({super.key});
@override
Widget build(BuildContext context) {