edit rule and delete fungction integrasi
This commit is contained in:
parent
692bfeeb50
commit
d22720c399
|
@ -0,0 +1,438 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:frontend/api_services/api_services.dart';
|
||||||
|
import 'package:http/http.dart' as http;
|
||||||
|
|
||||||
|
class EditRulePage extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_EditRulePageState createState() => _EditRulePageState();
|
||||||
|
|
||||||
|
final bool isEditing;
|
||||||
|
final bool isEditingHama;
|
||||||
|
final List<int> selectedRuleIds;
|
||||||
|
final List<int> selectedGejalaIds;
|
||||||
|
final List<double> nilaiPakarList;
|
||||||
|
final int? selectedHamaId;
|
||||||
|
final int? selectedPenyakitId;
|
||||||
|
|
||||||
|
const EditRulePage({
|
||||||
|
Key? key,
|
||||||
|
required this.isEditing,
|
||||||
|
required this.isEditingHama,
|
||||||
|
required this.selectedRuleIds,
|
||||||
|
required this.selectedGejalaIds,
|
||||||
|
required this.nilaiPakarList,
|
||||||
|
this.selectedHamaId,
|
||||||
|
this.selectedPenyakitId,
|
||||||
|
}) : super(key: key);
|
||||||
|
}
|
||||||
|
|
||||||
|
class _EditRulePageState extends State<EditRulePage> {
|
||||||
|
int? selectedHamaId;
|
||||||
|
int? selectedPenyakitId;
|
||||||
|
List<int?> selectedGejalaIds = [null];
|
||||||
|
List<double> nilaiPakarList = [0.5];
|
||||||
|
List<int?> selectedRuleIds = [];
|
||||||
|
|
||||||
|
bool isEditing = true; // atau false jika sedang edit penyakit
|
||||||
|
|
||||||
|
bool isLoading = true;
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
print('Fetched Rules: $fetchedRules');
|
||||||
|
|
||||||
|
// Filter data yang valid dan konversi dengan aman
|
||||||
|
final validRules =
|
||||||
|
fetchedRules.where((rule) {
|
||||||
|
if (rule is Map<String, dynamic>) {
|
||||||
|
// Pastikan semua key yang diperlukan ada dan nilainya tidak null
|
||||||
|
return rule.containsKey('id') &&
|
||||||
|
rule.containsKey('id_gejala') &&
|
||||||
|
rule.containsKey('nilai_pakar') &&
|
||||||
|
(rule.containsKey('id_penyakit') ||
|
||||||
|
rule.containsKey('id_hama')) &&
|
||||||
|
rule['id'] != null &&
|
||||||
|
rule['id_gejala'] != null &&
|
||||||
|
rule['nilai_pakar'] != null &&
|
||||||
|
(rule['id_penyakit'] != null || rule['id_hama'] != null);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}).toList();
|
||||||
|
|
||||||
|
// Pastikan konversi tipe data dilakukan dengan aman
|
||||||
|
setState(() {
|
||||||
|
selectedRuleIds =
|
||||||
|
validRules.map<int?>((rule) {
|
||||||
|
// Pastikan id bisa dikonversi ke int
|
||||||
|
final id = rule['id'];
|
||||||
|
return id is int ? id : (id is String ? int.tryParse(id) : null);
|
||||||
|
}).toList();
|
||||||
|
|
||||||
|
selectedGejalaIds =
|
||||||
|
validRules.map<int?>((rule) {
|
||||||
|
// Pastikan id_gejala bisa dikonversi ke int
|
||||||
|
final idGejala = rule['id_gejala'];
|
||||||
|
return idGejala is int
|
||||||
|
? idGejala
|
||||||
|
: (idGejala is String ? int.tryParse(idGejala) : null);
|
||||||
|
}).toList();
|
||||||
|
|
||||||
|
nilaiPakarList =
|
||||||
|
validRules.map<double>((rule) {
|
||||||
|
// Pastikan nilai_pakar bisa dikonversi ke double
|
||||||
|
final nilaiPakar = rule['nilai_pakar'];
|
||||||
|
if (nilaiPakar is double) return nilaiPakar;
|
||||||
|
if (nilaiPakar is int) return nilaiPakar.toDouble();
|
||||||
|
if (nilaiPakar is String)
|
||||||
|
return double.tryParse(nilaiPakar) ?? 0.5;
|
||||||
|
return 0.5; // Nilai default
|
||||||
|
}).toList();
|
||||||
|
|
||||||
|
print('Valid Rules: $validRules');
|
||||||
|
print('selectedRuleIds: $selectedRuleIds');
|
||||||
|
print('selectedGejalaIds: $selectedGejalaIds');
|
||||||
|
print('nilaiPakarList: $nilaiPakarList');
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
print("Gagal memuat data rule: $e");
|
||||||
|
ScaffoldMessenger.of(
|
||||||
|
context,
|
||||||
|
).showSnackBar(SnackBar(content: Text("Gagal memuat data rule: $e")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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();
|
||||||
|
fetchData(); // Panggil fetchData saat halaman dibuka pertama kali
|
||||||
|
|
||||||
|
// Inisialisasi dari widget parent
|
||||||
|
if (widget.isEditing) {
|
||||||
|
selectedHamaId = widget.selectedHamaId;
|
||||||
|
selectedPenyakitId = widget.selectedPenyakitId;
|
||||||
|
|
||||||
|
// Copy nilai dari widget ke state
|
||||||
|
if (widget.selectedRuleIds.isNotEmpty) {
|
||||||
|
selectedRuleIds = List<int?>.from(widget.selectedRuleIds);
|
||||||
|
}
|
||||||
|
if (widget.selectedGejalaIds.isNotEmpty) {
|
||||||
|
selectedGejalaIds = List<int?>.from(widget.selectedGejalaIds);
|
||||||
|
}
|
||||||
|
if (widget.nilaiPakarList.isNotEmpty) {
|
||||||
|
nilaiPakarList = List<double>.from(widget.nilaiPakarList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateRules() async {
|
||||||
|
if (selectedRuleIds.length != selectedGejalaIds.length ||
|
||||||
|
selectedRuleIds.length != nilaiPakarList.length) {
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
SnackBar(
|
||||||
|
content: Text("Data rule tidak sinkron. Silakan cek kembali."),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
for (int i = 0; i < selectedGejalaIds.length; i++) {
|
||||||
|
final idRule = selectedRuleIds[i];
|
||||||
|
final idGejala = selectedGejalaIds[i];
|
||||||
|
final nilai = nilaiPakarList[i];
|
||||||
|
|
||||||
|
if (idRule == null || idGejala == null) {
|
||||||
|
print("Lewat karena data null pada index ke-$i");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
http.Response response;
|
||||||
|
|
||||||
|
if (selectedPenyakitId != null) {
|
||||||
|
response = await ApiService.updateRulePenyakit(
|
||||||
|
id: idRule,
|
||||||
|
idGejala: idGejala,
|
||||||
|
idPenyakit: selectedPenyakitId!,
|
||||||
|
nilaiPakar: nilai,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
response = await ApiService.updateRuleHama(
|
||||||
|
id: idRule,
|
||||||
|
idGejala: idGejala,
|
||||||
|
idHama: selectedHamaId!,
|
||||||
|
nilaiPakar: nilai,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (response.statusCode != 200 && response.statusCode != 201) {
|
||||||
|
throw Exception("Gagal mengupdate rule");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ScaffoldMessenger.of(
|
||||||
|
context,
|
||||||
|
).showSnackBar(SnackBar(content: Text("Data berhasil diperbarui")));
|
||||||
|
Navigator.pop(context);
|
||||||
|
} catch (e) {
|
||||||
|
print('Gagal memperbarui data: $e');
|
||||||
|
ScaffoldMessenger.of(
|
||||||
|
context,
|
||||||
|
).showSnackBar(SnackBar(content: Text("Gagal memperbarui 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
|
||||||
|
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
|
||||||
|
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,
|
||||||
|
// Gunakan TextEditingController untuk menampilkan nilai awal
|
||||||
|
controller: TextEditingController(
|
||||||
|
text:
|
||||||
|
nilaiPakarList.length > index
|
||||||
|
? nilaiPakarList[index]
|
||||||
|
.toString()
|
||||||
|
: "0.5",
|
||||||
|
),
|
||||||
|
decoration: InputDecoration(
|
||||||
|
labelText: "Nilai Pakar",
|
||||||
|
border: OutlineInputBorder(),
|
||||||
|
),
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
if (value.isNotEmpty) {
|
||||||
|
// Pastikan index ada dalam range
|
||||||
|
if (nilaiPakarList.length <=
|
||||||
|
index) {
|
||||||
|
// Tambahkan nilai baru jika index belum ada
|
||||||
|
nilaiPakarList.add(
|
||||||
|
double.tryParse(value) ?? 0.5,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// Update nilai jika index sudah ada
|
||||||
|
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 edit rule
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
// Panggil fungsi saveRules untuk menyimpan data
|
||||||
|
updateRules();
|
||||||
|
},
|
||||||
|
child: Text('Perbarui Rule'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,9 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:frontend/admin/edit_rule_page.dart';
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
import 'package:frontend/api_services/api_services.dart';
|
import 'package:frontend/api_services/api_services.dart';
|
||||||
import 'tambah_rule_page.dart';
|
import 'tambah_rule_page.dart';
|
||||||
|
import 'edit_hama_page.dart';
|
||||||
|
|
||||||
class RulePage extends StatefulWidget {
|
class RulePage extends StatefulWidget {
|
||||||
const RulePage({Key? key}) : super(key: key);
|
const RulePage({Key? key}) : super(key: key);
|
||||||
|
@ -241,29 +243,49 @@ class _RulePageState extends State<RulePage> {
|
||||||
color: Colors.orange,
|
color: Colors.orange,
|
||||||
),
|
),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
if (rule != null && rule.id != null) {
|
if (rule != null &&
|
||||||
|
rule['id'] != null &&
|
||||||
|
rule['id_gejala'] != null &&
|
||||||
|
rule['nilai_pakar'] != null) {
|
||||||
Navigator.push(
|
Navigator.push(
|
||||||
context,
|
context,
|
||||||
MaterialPageRoute(
|
MaterialPageRoute(
|
||||||
builder:
|
builder:
|
||||||
(context) => TambahRulePage(
|
(context) => EditRulePage(
|
||||||
isEditing: true,
|
isEditing: true,
|
||||||
isEditingHama: true,
|
isEditingHama: true,
|
||||||
selectedRuleIds: [rule.id],
|
selectedRuleIds: [
|
||||||
|
rule['id'] as int,
|
||||||
|
],
|
||||||
selectedGejalaIds: [
|
selectedGejalaIds: [
|
||||||
rule.idGejala,
|
rule['id_gejala'] as int,
|
||||||
],
|
],
|
||||||
nilaiPakarList: [
|
nilaiPakarList: [
|
||||||
rule.nilaiPakar,
|
(rule['nilai_pakar'] as num)
|
||||||
|
.toDouble(),
|
||||||
],
|
],
|
||||||
selectedHamaId: rule.idHama,
|
selectedHamaId:
|
||||||
|
rule['id_hama']
|
||||||
|
as int?,
|
||||||
|
selectedPenyakitId: rule['id_penyakit'] as int?, // Tambahkan type cast ke int?
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
print(
|
// Tampilkan pesan error jika data rule tidak lengkap
|
||||||
'Data rule tidak lengkap atau null',
|
ScaffoldMessenger.of(
|
||||||
|
context,
|
||||||
|
).showSnackBar(
|
||||||
|
SnackBar(
|
||||||
|
content: Text(
|
||||||
|
"Data rule tidak lengkap atau tidak valid",
|
||||||
|
),
|
||||||
|
backgroundColor: Colors.red,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Debug info
|
||||||
|
print("Rule data: $rule");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
|
@ -27,7 +27,6 @@ class TambahRulePage extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class _TambahRulePageState extends State<TambahRulePage> {
|
class _TambahRulePageState extends State<TambahRulePage> {
|
||||||
|
|
||||||
int? selectedHamaId;
|
int? selectedHamaId;
|
||||||
int? selectedPenyakitId;
|
int? selectedPenyakitId;
|
||||||
List<int?> selectedGejalaIds = [null];
|
List<int?> selectedGejalaIds = [null];
|
||||||
|
@ -45,25 +44,37 @@ class _TambahRulePageState extends State<TambahRulePage> {
|
||||||
List<Map<String, dynamic>> penyakitList = [];
|
List<Map<String, dynamic>> penyakitList = [];
|
||||||
List<Map<String, dynamic>> gejalaList = [];
|
List<Map<String, dynamic>> gejalaList = [];
|
||||||
|
|
||||||
void loadRulesForEditing() async {
|
// void loadRulesForEditing() async {
|
||||||
try {
|
// try {
|
||||||
final fetchedRules = isEditing
|
// final fetchedRules =
|
||||||
? await api.getRulesHama()
|
// isEditing ? await api.getRulesHama() : await api.getRulesPenyakit();
|
||||||
: await api.getRulesPenyakit();
|
// setState(() {
|
||||||
|
// final validRules =
|
||||||
setState(() {
|
// fetchedRules
|
||||||
selectedRuleIds = fetchedRules.map<int>((rule) => rule['id']).toList();
|
// .where(
|
||||||
selectedGejalaIds = fetchedRules.map<int>((rule) => rule['id_gejala']).toList();
|
// (rule) =>
|
||||||
nilaiPakarList = fetchedRules.map<double>((rule) => (rule['nilai_pakar'] as num).toDouble()).toList();
|
// rule != null &&
|
||||||
});
|
// rule.containsKey('id') &&
|
||||||
} catch (e) {
|
// rule.containsKey('id_gejala') &&
|
||||||
print("Gagal memuat data rule: $e");
|
// rule.containsKey('nilai_pakar') &&
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
// rule['id'] != null &&
|
||||||
SnackBar(content: Text("Gagal memuat data rule")),
|
// 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
|
// Fungsi untuk fetch data dari API
|
||||||
Future<void> fetchData() async {
|
Future<void> fetchData() async {
|
||||||
|
@ -162,57 +173,56 @@ class _TambahRulePageState extends State<TambahRulePage> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateRules() async {
|
// void updateRules() async {
|
||||||
if (selectedPenyakitId == null && selectedHamaId == null) {
|
// if (selectedPenyakitId == null && selectedHamaId == null) {
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
// ScaffoldMessenger.of(context).showSnackBar(
|
||||||
SnackBar(content: Text("Pilih minimal satu: Penyakit atau Hama")),
|
// SnackBar(content: Text("Pilih minimal satu: Penyakit atau Hama")),
|
||||||
);
|
// );
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
|
|
||||||
try {
|
// try {
|
||||||
for (int i = 0; i < selectedGejalaIds.length; i++) {
|
// for (int i = 0; i < selectedGejalaIds.length; i++) {
|
||||||
final idRule = selectedRuleIds[i];
|
// final idRule = selectedRuleIds[i];
|
||||||
final idGejala = selectedGejalaIds[i];
|
// final idGejala = selectedGejalaIds[i];
|
||||||
final nilai = nilaiPakarList[i];
|
// final nilai = nilaiPakarList[i];
|
||||||
|
|
||||||
if (idRule != null && idGejala != null) {
|
// if (idRule != null && idGejala != null) {
|
||||||
http.Response response;
|
// http.Response response;
|
||||||
|
|
||||||
if (selectedPenyakitId != null) {
|
// if (selectedPenyakitId != null) {
|
||||||
response = await ApiService.updateRulePenyakit(
|
// response = await ApiService.updateRulePenyakit(
|
||||||
id: idRule,
|
// id: idRule,
|
||||||
idGejala: idGejala,
|
// idGejala: idGejala,
|
||||||
idPenyakit: selectedPenyakitId,
|
// idPenyakit: selectedPenyakitId,
|
||||||
nilaiPakar: nilai,
|
// nilaiPakar: nilai,
|
||||||
);
|
// );
|
||||||
} else {
|
// } else {
|
||||||
response = await ApiService.updateRuleHama(
|
// response = await ApiService.updateRuleHama(
|
||||||
id: idRule,
|
// id: idRule,
|
||||||
idGejala: idGejala,
|
// idGejala: idGejala,
|
||||||
idHama: selectedHamaId,
|
// idHama: selectedHamaId,
|
||||||
nilaiPakar: nilai,
|
// nilaiPakar: nilai,
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (response.statusCode != 200 && response.statusCode != 201) {
|
// if (response.statusCode != 200 && response.statusCode != 201) {
|
||||||
throw Exception("Gagal mengupdate rule");
|
// throw Exception("Gagal mengupdate rule");
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
|
||||||
SnackBar(content: Text("Data berhasil diperbarui")),
|
|
||||||
);
|
|
||||||
Navigator.pop(context);
|
|
||||||
} catch (e) {
|
|
||||||
print('Gagal memperbarui data: $e');
|
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
|
||||||
SnackBar(content: Text("Gagal memperbarui data")),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// ScaffoldMessenger.of(
|
||||||
|
// context,
|
||||||
|
// ).showSnackBar(SnackBar(content: Text("Data berhasil diperbarui")));
|
||||||
|
// Navigator.pop(context);
|
||||||
|
// } catch (e) {
|
||||||
|
// print('Gagal memperbarui data: $e');
|
||||||
|
// ScaffoldMessenger.of(
|
||||||
|
// context,
|
||||||
|
// ).showSnackBar(SnackBar(content: Text("Gagal memperbarui data")));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
|
|
@ -7,8 +7,7 @@ class ApiService {
|
||||||
static const String gejalaUrl = 'http://localhost:5000/api/gejala';
|
static const String gejalaUrl = 'http://localhost:5000/api/gejala';
|
||||||
static const String hamaUrl = 'http://localhost:5000/api/hama';
|
static const String hamaUrl = 'http://localhost:5000/api/hama';
|
||||||
static const String penyakitUrl = 'http://localhost:5000/api/penyakit';
|
static const String penyakitUrl = 'http://localhost:5000/api/penyakit';
|
||||||
static const String rulesPenyakitUrl =
|
static const String rulesPenyakitUrl ='http://localhost:5000/api/rules_penyakit';
|
||||||
'http://localhost:5000/api/rules_penyakit';
|
|
||||||
static const String rulesHamaUrl = 'http://localhost:5000/api/rules_hama';
|
static const String rulesHamaUrl = 'http://localhost:5000/api/rules_hama';
|
||||||
|
|
||||||
// Fungsi Login (dengan perbaikan)
|
// Fungsi Login (dengan perbaikan)
|
||||||
|
|
Loading…
Reference in New Issue