ambil data stok bantuan
This commit is contained in:
@ -43,7 +43,9 @@ class GreetingHeader extends StatelessWidget {
|
||||
),
|
||||
const SizedBox(height: 5),
|
||||
Text(
|
||||
'Kamu Login Sebagai $role${desa != null ? ' $desa' : ''}.',
|
||||
desa != null && desa!.isNotEmpty
|
||||
? 'Kamu Login Sebagai $role $desa.'
|
||||
: 'Kamu Login Sebagai $role.',
|
||||
style: textTheme.bodyMedium?.copyWith(
|
||||
fontSize: 14,
|
||||
color: Colors.grey[600],
|
||||
|
@ -1,21 +1,21 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:penyaluran_app/app/modules/petugas_desa/controllers/petugas_desa_controller.dart';
|
||||
import 'package:penyaluran_app/app/modules/petugas_desa/controllers/jadwal_penyaluran_controller.dart';
|
||||
import 'package:penyaluran_app/app/routes/app_pages.dart';
|
||||
|
||||
class JadwalSectionWidget extends StatelessWidget {
|
||||
final PetugasDesaController controller;
|
||||
final JadwalPenyaluranController controller;
|
||||
final String title;
|
||||
final List<Map<String, dynamic>> jadwalList;
|
||||
final List<dynamic> jadwalList;
|
||||
final String status;
|
||||
|
||||
const JadwalSectionWidget({
|
||||
Key? key,
|
||||
super.key,
|
||||
required this.controller,
|
||||
required this.title,
|
||||
required this.jadwalList,
|
||||
required this.status,
|
||||
}) : super(key: key);
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@ -62,20 +62,24 @@ class JadwalSectionWidget extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
|
||||
List<Map<String, dynamic>> _getCurrentJadwalList() {
|
||||
List<dynamic> _getCurrentJadwalList() {
|
||||
switch (title) {
|
||||
case 'Hari Ini':
|
||||
return controller.jadwalHariIni;
|
||||
return controller.jadwalHariIni.toList();
|
||||
case 'Mendatang':
|
||||
return controller.jadwalMendatang;
|
||||
return controller.jadwalMendatang.toList();
|
||||
case 'Selesai':
|
||||
return controller.jadwalSelesai;
|
||||
return controller.jadwalSelesai.toList();
|
||||
default:
|
||||
return jadwalList;
|
||||
}
|
||||
}
|
||||
|
||||
Widget _buildJadwalItem(TextTheme textTheme, Map<String, dynamic> jadwal) {
|
||||
Widget _buildJadwalItem(TextTheme textTheme, dynamic jadwal) {
|
||||
// Konversi jadwal ke Map jika itu adalah PenyaluranBantuanModel
|
||||
final Map<String, dynamic> jadwalData =
|
||||
jadwal is Map<String, dynamic> ? jadwal : jadwal.toJson();
|
||||
|
||||
Color statusColor;
|
||||
switch (status) {
|
||||
case 'Aktif':
|
||||
@ -94,7 +98,7 @@ class JadwalSectionWidget extends StatelessWidget {
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
// Navigasi ke halaman pelaksanaan penyaluran dengan data jadwal
|
||||
Get.toNamed(Routes.pelaksanaanPenyaluran, arguments: jadwal);
|
||||
Get.toNamed(Routes.pelaksanaanPenyaluran, arguments: jadwalData);
|
||||
},
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
@ -120,7 +124,7 @@ class JadwalSectionWidget extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
jadwal['lokasi'] ?? '',
|
||||
jadwalData['lokasi'] ?? '',
|
||||
style: textTheme.titleMedium?.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
@ -144,23 +148,23 @@ class JadwalSectionWidget extends StatelessWidget {
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Text(
|
||||
'Jenis Bantuan: ${jadwal['jenis_bantuan'] ?? ''}',
|
||||
'Jenis Bantuan: ${jadwalData['jenis_bantuan'] ?? ''}',
|
||||
style: textTheme.bodyMedium,
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
'Tanggal: ${jadwal['tanggal'] ?? ''}',
|
||||
'Tanggal: ${jadwalData['tanggal'] ?? ''}',
|
||||
style: textTheme.bodyMedium,
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
'Waktu: ${jadwal['waktu'] ?? ''}',
|
||||
'Waktu: ${jadwalData['waktu'] ?? ''}',
|
||||
style: textTheme.bodyMedium,
|
||||
),
|
||||
if (jadwal['jumlah_penerima'] != null) ...[
|
||||
if (jadwalData['jumlah_penerima'] != null) ...[
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
'Jumlah Penerima: ${jadwal['jumlah_penerima']}',
|
||||
'Jumlah Penerima: ${jadwalData['jumlah_penerima']}',
|
||||
style: textTheme.bodyMedium,
|
||||
),
|
||||
],
|
||||
|
@ -1,16 +1,16 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:penyaluran_app/app/modules/petugas_desa/controllers/petugas_desa_controller.dart';
|
||||
import 'package:penyaluran_app/app/modules/petugas_desa/controllers/jadwal_penyaluran_controller.dart';
|
||||
import 'package:penyaluran_app/app/routes/app_pages.dart';
|
||||
import 'package:penyaluran_app/app/theme/app_theme.dart';
|
||||
|
||||
class PermintaanPenjadwalanSummaryWidget extends StatelessWidget {
|
||||
final PetugasDesaController controller;
|
||||
final JadwalPenyaluranController controller;
|
||||
|
||||
const PermintaanPenjadwalanSummaryWidget({
|
||||
Key? key,
|
||||
super.key,
|
||||
required this.controller,
|
||||
}) : super(key: key);
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@ -134,8 +134,11 @@ class PermintaanPenjadwalanSummaryWidget extends StatelessWidget {
|
||||
});
|
||||
}
|
||||
|
||||
Widget _buildPermintaanPreview(
|
||||
TextTheme textTheme, Map<String, dynamic> permintaan) {
|
||||
Widget _buildPermintaanPreview(TextTheme textTheme, dynamic permintaan) {
|
||||
// Konversi permintaan ke Map jika itu adalah PenyaluranBantuanModel
|
||||
final Map<String, dynamic> permintaanData =
|
||||
permintaan is Map<String, dynamic> ? permintaan : permintaan.toJson();
|
||||
|
||||
return Container(
|
||||
width: double.infinity,
|
||||
margin: const EdgeInsets.only(bottom: 8),
|
||||
@ -152,7 +155,7 @@ class PermintaanPenjadwalanSummaryWidget extends StatelessWidget {
|
||||
children: [
|
||||
Expanded(
|
||||
child: Text(
|
||||
permintaan['nama'] ?? '',
|
||||
permintaanData['nama'] ?? '',
|
||||
style: textTheme.titleSmall?.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
@ -178,12 +181,12 @@ class PermintaanPenjadwalanSummaryWidget extends StatelessWidget {
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
'Jenis: ${permintaan['jenis_bantuan'] ?? ''}',
|
||||
'Jenis: ${permintaanData['jenis_bantuan'] ?? ''}',
|
||||
style: textTheme.bodySmall,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
Text(
|
||||
'Tanggal: ${permintaan['tanggal_permintaan'] ?? ''}',
|
||||
'Tanggal: ${permintaanData['tanggal_permintaan'] ?? ''}',
|
||||
style: textTheme.bodySmall,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
|
@ -1,15 +1,16 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:penyaluran_app/app/modules/petugas_desa/controllers/petugas_desa_controller.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/theme/app_theme.dart';
|
||||
|
||||
class PermintaanPenjadwalanWidget extends StatelessWidget {
|
||||
final PetugasDesaController controller;
|
||||
final JadwalPenyaluranController controller;
|
||||
|
||||
const PermintaanPenjadwalanWidget({
|
||||
Key? key,
|
||||
super.key,
|
||||
required this.controller,
|
||||
}) : super(key: key);
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@ -90,7 +91,7 @@ class PermintaanPenjadwalanWidget extends StatelessWidget {
|
||||
|
||||
// Widget untuk menampilkan item permintaan penjadwalan
|
||||
Widget _buildPermintaanItem(
|
||||
TextTheme textTheme, Map<String, dynamic> permintaan) {
|
||||
TextTheme textTheme, PenyaluranBantuanModel permintaan) {
|
||||
return Container(
|
||||
width: double.infinity,
|
||||
margin: const EdgeInsets.only(bottom: 10),
|
||||
@ -119,7 +120,7 @@ class PermintaanPenjadwalanWidget extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
permintaan['nama'] ?? '',
|
||||
permintaan.judul ?? '',
|
||||
style: textTheme.titleMedium?.copyWith(
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
@ -143,22 +144,22 @@ class PermintaanPenjadwalanWidget extends StatelessWidget {
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Text(
|
||||
'NIK: ${permintaan['nik'] ?? ''}',
|
||||
'ID: ${permintaan.id ?? ''}',
|
||||
style: textTheme.bodyMedium,
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
'Jenis Bantuan: ${permintaan['jenis_bantuan'] ?? ''}',
|
||||
'Jenis Bantuan: ${permintaan.judul ?? ''}',
|
||||
style: textTheme.bodyMedium,
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
'Tanggal Permintaan: ${permintaan['tanggal_permintaan'] ?? ''}',
|
||||
'Tanggal Permintaan: ${permintaan.createdAt?.toString().substring(0, 10) ?? ''}',
|
||||
style: textTheme.bodyMedium,
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
'Alamat: ${permintaan['alamat'] ?? ''}',
|
||||
'Deskripsi: ${permintaan.deskripsi ?? ''}',
|
||||
style: textTheme.bodyMedium,
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
@ -191,15 +192,15 @@ class PermintaanPenjadwalanWidget extends StatelessWidget {
|
||||
}
|
||||
|
||||
// Dialog untuk konfirmasi permintaan
|
||||
void _showKonfirmasiDialog(Map<String, dynamic> permintaan) {
|
||||
void _showKonfirmasiDialog(PenyaluranBantuanModel permintaan) {
|
||||
String? selectedJadwalId;
|
||||
|
||||
// Data jadwal yang tersedia dari controller
|
||||
final jadwalOptions = controller.jadwalMendatang.map((jadwal) {
|
||||
return DropdownMenuItem<String>(
|
||||
value: jadwal['id'],
|
||||
value: jadwal.id,
|
||||
child: Text(
|
||||
'${jadwal['tanggal']} - ${jadwal['lokasi']} (${jadwal['jenis_bantuan']})'),
|
||||
'${jadwal.tanggalPenjadwalan?.toString().substring(0, 10) ?? ''} - ${jadwal.lokasiPenyaluranId ?? ''} (${jadwal.judul ?? ''})'),
|
||||
);
|
||||
}).toList();
|
||||
|
||||
@ -219,7 +220,7 @@ class PermintaanPenjadwalanWidget extends StatelessWidget {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'Anda akan mengkonfirmasi permintaan penjadwalan dari ${permintaan['nama']}.'),
|
||||
'Anda akan mengkonfirmasi permintaan penjadwalan dari ${permintaan.judul}.'),
|
||||
const SizedBox(height: 16),
|
||||
const Text('Pilih jadwal penyaluran:'),
|
||||
const SizedBox(height: 8),
|
||||
@ -245,9 +246,8 @@ class PermintaanPenjadwalanWidget extends StatelessWidget {
|
||||
onPressed: () {
|
||||
if (selectedJadwalId != null) {
|
||||
// Panggil metode konfirmasi di controller
|
||||
controller.konfirmasiPermintaanPenjadwalan(
|
||||
permintaan['id'],
|
||||
selectedJadwalId!,
|
||||
controller.approveJadwal(
|
||||
permintaan.id ?? '',
|
||||
);
|
||||
|
||||
Get.back();
|
||||
@ -279,7 +279,7 @@ class PermintaanPenjadwalanWidget extends StatelessWidget {
|
||||
}
|
||||
|
||||
// Dialog untuk menolak permintaan
|
||||
void _showTolakDialog(Map<String, dynamic> permintaan) {
|
||||
void _showTolakDialog(PenyaluranBantuanModel permintaan) {
|
||||
final TextEditingController alasanController = TextEditingController();
|
||||
|
||||
Get.dialog(
|
||||
@ -290,7 +290,7 @@ class PermintaanPenjadwalanWidget extends StatelessWidget {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'Anda akan menolak permintaan penjadwalan dari ${permintaan['nama']}.'),
|
||||
'Anda akan menolak permintaan penjadwalan dari ${permintaan.judul}.'),
|
||||
const SizedBox(height: 16),
|
||||
const Text('Alasan penolakan:'),
|
||||
const SizedBox(height: 8),
|
||||
@ -313,8 +313,8 @@ class PermintaanPenjadwalanWidget extends StatelessWidget {
|
||||
onPressed: () {
|
||||
if (alasanController.text.trim().isNotEmpty) {
|
||||
// Panggil metode tolak di controller
|
||||
controller.tolakPermintaanPenjadwalan(
|
||||
permintaan['id'],
|
||||
controller.rejectJadwal(
|
||||
permintaan.id ?? '',
|
||||
alasanController.text.trim(),
|
||||
);
|
||||
|
||||
|
Reference in New Issue
Block a user