Sistem-Pakar-Diagnosa-Penya.../frontend/lib/admin/tambah_rule_page.dart

405 lines
16 KiB
Dart

import 'package:flutter/material.dart';
import 'package:SIBAYAM/api_services/api_services.dart';
import 'package:http/http.dart' as http;
class TambahRulePage extends StatefulWidget {
@override
_TambahRulePageState createState() => _TambahRulePageState();
final bool isEditing;
final bool isEditingHama;
final List<int> selectedRuleIds;
final List<int> selectedGejalaIds;
final List<double> nilaiPakarList;
final int? selectedHamaId;
final int? selectedPenyakitId;
final bool showHamaOnly; // Tambahkan ini
final bool showPenyakitOnly;
const TambahRulePage({
Key? key,
required this.isEditing,
required this.isEditingHama,
required this.selectedRuleIds,
required this.selectedGejalaIds,
required this.nilaiPakarList,
this.selectedHamaId,
this.selectedPenyakitId,
this.showHamaOnly = false, // Tambahkan default value
this.showPenyakitOnly = false,
}) : super(key: key);
}
class _TambahRulePageState extends State<TambahRulePage> {
int? selectedHamaId;
int? selectedPenyakitId;
List<int?> selectedGejalaIds = [null];
List<double> nilaiPakarList = [0.5];
List<int?> selectedRuleIds =
[]; // List paralel dengan selectedGejalaIds dan nilaiPakarList
bool isEditing = true; // atau false jika sedang edit penyakit
bool isLoading = true;
bool showHamaOnly = false;
bool showPenyakitOnly = false;
final api = ApiService();
// Deklarasi variabel untuk menampung data dari API
List<Map<String, dynamic>> hamaList = [];
List<Map<String, dynamic>> penyakitList = [];
List<Map<String, dynamic>> gejalaList = [];
// void loadRulesForEditing() async {
// try {
// final fetchedRules =
// isEditing ? await api.getRulesHama() : await api.getRulesPenyakit();
// setState(() {
// final validRules =
// fetchedRules
// .where(
// (rule) =>
// rule != null &&
// rule.containsKey('id') &&
// rule.containsKey('id_gejala') &&
// rule.containsKey('nilai_pakar') &&
// rule['id'] != null &&
// rule['id_gejala'] != null &&
// rule['nilai_pakar'] != null,
// )
// .toList();
// selectedRuleIds = fetchedRules.map<int>((rule) => rule['id'] ?? 0).toList();
// selectedGejalaIds = validRules.map<int>((rule) => rule['id_gejala']).toList();
// nilaiPakarList = validRules.map<double>((rule) => (rule['nilai_pakar'] as num).toDouble()).toList();
// });
// print('Fetched Rules: $fetchedRules');
// print('First Rule: ${fetchedRules.first}');
// } catch (e) {
// print("Gagal memuat data rule: $e");
// ScaffoldMessenger.of(
// context,
// ).showSnackBar(SnackBar(content: Text("Gagal memuat data rule")));
// }
// }
// Fungsi untuk fetch data dari API
Future<void> fetchData() async {
setState(() {
isLoading = true; // Mengatur status loading saat mulai ambil data
});
try {
// Ambil data dari API
final hamaData = await api.getHama();
final penyakitData = await api.getPenyakit();
final gejalaData = await api.getGejala();
// Debugging: Cek apakah data yang diterima dari API
print("Hama Data: $hamaData");
print("Penyakit Data: $penyakitData");
print("Gejala Data: $gejalaData");
// Pengecekan jika data kosong
if (hamaData.isEmpty || penyakitData.isEmpty || gejalaData.isEmpty) {
print("Data kosong, periksa API atau koneksi.");
}
// Update data dan status loading
setState(() {
hamaList = hamaData;
penyakitList = penyakitData;
gejalaList = gejalaData;
isLoading = false; // Mengubah status loading setelah data diterima
});
} catch (e) {
// Menangani error jika fetch gagal
print("Error fetching data: $e");
setState(() {
isLoading =
false; // Mengubah status loading selesai meskipun terjadi error
});
}
}
@override
void initState() {
super.initState();
showHamaOnly = widget.showHamaOnly;
showPenyakitOnly = widget.showPenyakitOnly;
fetchData(); // Panggil fetchData saat halaman dibuka pertama kali
}
void saveRules() async {
if (selectedPenyakitId == null && selectedHamaId == null) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("Pilih minimal satu: Penyakit atau Hama")),
);
return;
}
try {
for (int i = 0; i < selectedGejalaIds.length; i++) {
final idGejala = selectedGejalaIds[i];
final nilai = nilaiPakarList[i];
if (idGejala != null) {
if (selectedPenyakitId != null) {
final response = await ApiService.createRulePenyakit(
idGejala: idGejala,
idPenyakit: selectedPenyakitId,
nilaiPakar: nilai,
);
if (response.statusCode != 200 && response.statusCode != 201) {
throw Exception("Gagal menyimpan rule penyakit");
}
} else if (selectedHamaId != null) {
final response = await ApiService.createRuleHama(
idGejala: idGejala,
idHama: selectedHamaId,
nilaiPakar: nilai,
);
if (response.statusCode != 200 && response.statusCode != 201) {
throw Exception("Gagal menyimpan rule hama");
}
}
}
}
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text("Data berhasil disimpan")));
Navigator.pop(context);
} catch (e) {
print('Gagal menyimpan data: $e');
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text("Gagal menyimpan data")));
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Tambah Rule")),
body: Padding(
padding: const EdgeInsets.all(16.0),
child:
isLoading
? Center(child: CircularProgressIndicator())
: Card(
elevation: 5,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: ListView(
children: [
// Pilih Hama
if (!showPenyakitOnly) ...[
Text("Pilih Hama"),
DropdownButton<int>(
isExpanded: true,
value: selectedHamaId,
hint: Text('Pilih Hama'),
items:
hamaList.isNotEmpty
? hamaList.map<DropdownMenuItem<int>>((
hama,
) {
return DropdownMenuItem<int>(
value: hama['id'],
child: Text(hama['nama']),
);
}).toList()
: [
DropdownMenuItem<int>(
value: null,
child: Text("Data tidak tersedia"),
),
],
onChanged: (value) {
setState(() {
selectedHamaId = value;
});
},
),
SizedBox(height: 16),
],
// Pilih Penyakit
if (!showHamaOnly) ...[
Text("Pilih Penyakit"),
DropdownButton<int>(
isExpanded: true,
value: selectedPenyakitId,
hint: Text('Pilih Penyakit'),
items:
penyakitList.isNotEmpty
? penyakitList.map<DropdownMenuItem<int>>((
penyakit,
) {
return DropdownMenuItem<int>(
value: penyakit['id'],
child: Text(penyakit['nama']),
);
}).toList()
: [
DropdownMenuItem<int>(
value: null,
child: Text("Data tidak tersedia"),
),
],
onChanged: (value) {
setState(() {
selectedPenyakitId = value;
});
},
),
SizedBox(height: 16),
],
// Pilih Gejala dan Nilai Pakar
Text("Pilih Gejala"),
...List.generate(
selectedGejalaIds.length,
(index) => Card(
elevation: 3,
margin: EdgeInsets.only(bottom: 16),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
// Dropdown untuk gejala
Expanded(
child: DropdownButton<int>(
isExpanded: true,
value: selectedGejalaIds[index],
hint: Text('Pilih Gejala'),
items:
gejalaList.isNotEmpty
? gejalaList.map<
DropdownMenuItem<int>
>((gejala) {
return DropdownMenuItem<int>(
value: gejala['id'],
child: Text(gejala['nama']),
);
}).toList()
: [
DropdownMenuItem<int>(
value: null,
child: Text(
"Data tidak tersedia",
),
),
],
onChanged: (value) {
setState(() {
selectedGejalaIds[index] = value;
});
},
),
),
// Input nilai pakar
SizedBox(width: 16),
SizedBox(
width: 80,
child: TextField(
keyboardType: TextInputType.number,
decoration: InputDecoration(
labelText: "Nilai Pakar",
border: OutlineInputBorder(),
),
onChanged: (value) {
setState(() {
if (value.isNotEmpty) {
nilaiPakarList[index] =
double.tryParse(value) ?? 0.5;
}
});
},
),
),
// Tombol untuk menghapus gejala
IconButton(
icon: Icon(Icons.remove_circle_outline),
onPressed: () {
setState(() {
selectedGejalaIds.removeAt(index);
nilaiPakarList.removeAt(index);
});
},
),
],
),
),
),
),
// Tombol untuk menambah gejala
ElevatedButton(
onPressed: () {
setState(() {
selectedGejalaIds.add(null);
nilaiPakarList.add(
0.5,
); // Menambahkan nilai pakar default
});
},
child: Text('Tambah Gejala'),
),
SizedBox(height: 20),
// Tombol untuk menambah rule
ElevatedButton(
onPressed: () {
// Cek duplikasi gejala
final uniqueGejala = selectedGejalaIds.toSet();
if (uniqueGejala.length !=
selectedGejalaIds.length) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
'Terdapat gejala yang sama, harap pilih gejala yang berbeda.',
),
),
);
return; // Gagal simpan
}
// Cek apakah semua nilai gejala sudah dipilih (tidak null)
if (selectedGejalaIds.contains(null)) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
'Harap lengkapi semua pilihan gejala.',
),
),
);
return;
}
// Panggil fungsi saveRules jika valid
saveRules();
},
child: Text('Tambah Rule'),
),
],
),
),
),
),
);
}
}