Tambahkan fitur jenis bantuan pada modul stok bantuan
- Perbarui model StokBantuanModel untuk mendukung jenis bantuan - Tambahkan metode loadJenisBantuanData() di StokBantuanController - Integrasikan dropdown pemilihan jenis bantuan di form tambah/edit stok - Perbarui SupabaseService untuk mengambil data jenis bantuan - Tampilkan nama jenis bantuan di daftar stok bantuan
This commit is contained in:
@ -1,7 +1,6 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:penyaluran_app/app/utils/date_formatter.dart';
|
||||
|
||||
class PenerimaController extends GetxController {
|
||||
final RxList<Map<String, dynamic>> daftarPenerima =
|
||||
|
@ -17,6 +17,10 @@ class StokBantuanController extends GetxController {
|
||||
final RxDouble stokMasuk = 0.0.obs;
|
||||
final RxDouble stokKeluar = 0.0.obs;
|
||||
|
||||
// Data untuk jenis bantuan
|
||||
final RxList<Map<String, dynamic>> daftarJenisBantuan =
|
||||
<Map<String, dynamic>>[].obs;
|
||||
|
||||
// Controller untuk pencarian
|
||||
final TextEditingController searchController = TextEditingController();
|
||||
final RxString searchQuery = ''.obs;
|
||||
@ -27,6 +31,7 @@ class StokBantuanController extends GetxController {
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
loadStokBantuanData();
|
||||
loadJenisBantuanData();
|
||||
|
||||
// Listener untuk pencarian
|
||||
searchController.addListener(() {
|
||||
@ -69,6 +74,17 @@ class StokBantuanController extends GetxController {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> loadJenisBantuanData() async {
|
||||
try {
|
||||
final jenisBantuanData = await _supabaseService.getJenisBantuan();
|
||||
if (jenisBantuanData != null) {
|
||||
daftarJenisBantuan.value = jenisBantuanData;
|
||||
}
|
||||
} catch (e) {
|
||||
print('Error loading jenis bantuan data: $e');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> addStok(StokBantuanModel stok) async {
|
||||
isLoading.value = true;
|
||||
try {
|
||||
@ -151,6 +167,7 @@ class StokBantuanController extends GetxController {
|
||||
isLoading.value = true;
|
||||
try {
|
||||
await loadStokBantuanData();
|
||||
await loadJenisBantuanData();
|
||||
} finally {
|
||||
isLoading.value = false;
|
||||
}
|
||||
|
@ -124,34 +124,7 @@ class PetugasDesaView extends GetView<PetugasDesaController> {
|
||||
],
|
||||
);
|
||||
} else if (activeTab == 4) {
|
||||
return Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
IconButton(
|
||||
icon: const Icon(Icons.add),
|
||||
tooltip: 'Tambah Pengaduan',
|
||||
onPressed: () {
|
||||
// Implementasi untuk menambah pengaduan baru
|
||||
},
|
||||
),
|
||||
IconButton(
|
||||
icon: const Icon(Icons.filter_list),
|
||||
tooltip: 'Filter Pengaduan',
|
||||
onPressed: () {
|
||||
// Implementasi untuk filter pengaduan
|
||||
},
|
||||
),
|
||||
IconButton(
|
||||
icon: const Icon(Icons.refresh),
|
||||
tooltip: 'Perbarui Counter',
|
||||
onPressed: () {
|
||||
// Perbarui counter pengaduan secara manual
|
||||
controller.updatePengaduanCounter();
|
||||
},
|
||||
),
|
||||
notificationButton,
|
||||
],
|
||||
);
|
||||
return notificationButton;
|
||||
} else {
|
||||
return notificationButton;
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:intl/intl.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/theme/app_theme.dart';
|
||||
@ -277,7 +276,9 @@ class StokBantuanView extends GetView<StokBantuanController> {
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
child: Text(
|
||||
item.status ?? 'TERSEDIA',
|
||||
item.jenisBantuan != null
|
||||
? (item.jenisBantuan!['nama'] ?? 'Tidak Ada Jenis')
|
||||
: 'Tidak Ada Jenis',
|
||||
style: Theme.of(context).textTheme.bodySmall?.copyWith(
|
||||
color: AppTheme.primaryColor,
|
||||
fontWeight: FontWeight.bold,
|
||||
@ -417,6 +418,7 @@ class StokBantuanView extends GetView<StokBantuanController> {
|
||||
final jumlahController = TextEditingController();
|
||||
final satuanController = TextEditingController();
|
||||
final deskripsiController = TextEditingController();
|
||||
String? selectedJenisBantuanId;
|
||||
DateTime? tanggalMasuk = DateTime.now();
|
||||
DateTime? tanggalKadaluarsa;
|
||||
|
||||
@ -444,6 +446,30 @@ class StokBantuanView extends GetView<StokBantuanController> {
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
DropdownButtonFormField<String>(
|
||||
decoration: const InputDecoration(
|
||||
labelText: 'Jenis Bantuan',
|
||||
border: OutlineInputBorder(),
|
||||
),
|
||||
value: selectedJenisBantuanId,
|
||||
hint: const Text('Pilih Jenis Bantuan'),
|
||||
items: controller.daftarJenisBantuan
|
||||
.map((jenis) => DropdownMenuItem<String>(
|
||||
value: jenis['id'],
|
||||
child: Text(jenis['nama'] ?? ''),
|
||||
))
|
||||
.toList(),
|
||||
onChanged: (value) {
|
||||
selectedJenisBantuanId = value;
|
||||
},
|
||||
validator: (value) {
|
||||
if (value == null || value.isEmpty) {
|
||||
return 'Jenis bantuan harus dipilih';
|
||||
}
|
||||
return null;
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
@ -558,6 +584,7 @@ class StokBantuanView extends GetView<StokBantuanController> {
|
||||
jumlah: double.parse(jumlahController.text),
|
||||
satuan: satuanController.text,
|
||||
deskripsi: deskripsiController.text,
|
||||
jenisBantuanId: selectedJenisBantuanId,
|
||||
tanggalMasuk: tanggalMasuk,
|
||||
tanggalKadaluarsa: tanggalKadaluarsa,
|
||||
status: 'TERSEDIA',
|
||||
@ -582,6 +609,7 @@ class StokBantuanView extends GetView<StokBantuanController> {
|
||||
TextEditingController(text: stok.jumlah?.toString());
|
||||
final satuanController = TextEditingController(text: stok.satuan);
|
||||
final deskripsiController = TextEditingController(text: stok.deskripsi);
|
||||
String? selectedJenisBantuanId = stok.jenisBantuanId;
|
||||
DateTime? tanggalMasuk = stok.tanggalMasuk;
|
||||
DateTime? tanggalKadaluarsa = stok.tanggalKadaluarsa;
|
||||
|
||||
@ -609,6 +637,30 @@ class StokBantuanView extends GetView<StokBantuanController> {
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
DropdownButtonFormField<String>(
|
||||
decoration: const InputDecoration(
|
||||
labelText: 'Jenis Bantuan',
|
||||
border: OutlineInputBorder(),
|
||||
),
|
||||
value: selectedJenisBantuanId,
|
||||
hint: const Text('Pilih Jenis Bantuan'),
|
||||
items: controller.daftarJenisBantuan
|
||||
.map((jenis) => DropdownMenuItem<String>(
|
||||
value: jenis['id'],
|
||||
child: Text(jenis['nama'] ?? ''),
|
||||
))
|
||||
.toList(),
|
||||
onChanged: (value) {
|
||||
selectedJenisBantuanId = value;
|
||||
},
|
||||
validator: (value) {
|
||||
if (value == null || value.isEmpty) {
|
||||
return 'Jenis bantuan harus dipilih';
|
||||
}
|
||||
return null;
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
@ -724,6 +776,7 @@ class StokBantuanView extends GetView<StokBantuanController> {
|
||||
jumlah: double.parse(jumlahController.text),
|
||||
satuan: satuanController.text,
|
||||
deskripsi: deskripsiController.text,
|
||||
jenisBantuanId: selectedJenisBantuanId,
|
||||
tanggalMasuk: tanggalMasuk,
|
||||
tanggalKadaluarsa: tanggalKadaluarsa,
|
||||
status: stok.status,
|
||||
|
Reference in New Issue
Block a user