diff --git a/lib/app/app.dart b/lib/app/app.dart index fb6dba2..66fcb8f 100644 --- a/lib/app/app.dart +++ b/lib/app/app.dart @@ -1,11 +1,4 @@ -import 'package:panti_asuhan/ui/views/admin_index_tracking/dana_sosial_admin/dana_sosial_admin_view.dart'; -import 'package:panti_asuhan/ui/views/admin_index_tracking/data_siswa/data_siswa_view.dart'; -import 'package:panti_asuhan/ui/views/admin_index_tracking/edit_siswa/edit_siswa_view.dart'; -import 'package:panti_asuhan/ui/views/admin_index_tracking/profil/profil_view.dart'; -import 'package:panti_asuhan/ui/views/admin_index_tracking/struktur_organisasi/edit_strukrur_organisasi_dialog/edit_strukrur_organisasi_dialog_view.dart'; -import 'package:panti_asuhan/ui/views/detail_dana_sosial/detail_dana_sosial_view.dart'; -import 'package:panti_asuhan/ui/views/pimpinan_index_tracking/pimpinan_index_tracking/pimpinan_index_tracking_view.dart'; -import 'package:panti_asuhan/ui/views/tambah_dana_sosial/tambah_dana_sosial_view.dart'; +import 'package:panti_asuhan/ui/views/admin_index_tracking/edit_siswa/edit_dialog_siswa/edit_dialog_siswa_view.dart'; import 'package:stacked_services/stacked_services.dart'; import 'package:stacked/stacked_annotations.dart'; @@ -13,12 +6,20 @@ import '../services/http_services.dart'; import '../services/my_easyloading.dart'; import '../ui/views/admin_index_tracking/add_siswa_dialog/add_siswa_dialog/add_siswa_dialog_view.dart'; import '../ui/views/admin_index_tracking/admin_index_tracking_view.dart'; +import '../ui/views/admin_index_tracking/dana_sosial_admin/dana_sosial_admin_view.dart'; +import '../ui/views/admin_index_tracking/data_siswa/data_siswa_view.dart'; +import '../ui/views/admin_index_tracking/edit_siswa/edit_siswa_view.dart'; import '../ui/views/admin_index_tracking/filter_dialog/filter_dialog_view.dart'; +import '../ui/views/admin_index_tracking/profil/profil_view.dart'; import '../ui/views/admin_index_tracking/sejarah/sejarah_view.dart'; +import '../ui/views/admin_index_tracking/struktur_organisasi/edit_strukrur_organisasi_dialog/edit_strukrur_organisasi_dialog_view.dart'; import '../ui/views/admin_index_tracking/struktur_organisasi/struktur_organisasi_view.dart'; import '../ui/views/admin_index_tracking/visi_misi/visi_misi_view.dart'; +import '../ui/views/detail_dana_sosial/detail_dana_sosial_view.dart'; import '../ui/views/login_screen/login_screen_view.dart'; +import '../ui/views/pimpinan_index_tracking/pimpinan_index_tracking/pimpinan_index_tracking_view.dart'; import '../ui/views/splash_screen/splash_screen_view.dart'; +import '../ui/views/tambah_dana_sosial/tambah_dana_sosial_view.dart'; import '../ui/views/user_index_tracking/user_index_tracking_view.dart'; @StackedApp( @@ -66,6 +67,7 @@ import '../ui/views/user_index_tracking/user_index_tracking_view.dart'; StackedDialog(classType: AddSiswaDialogView), StackedDialog(classType: FilterDialogView), StackedDialog(classType: EditStrukrurOrganisasiDialogView), + StackedDialog(classType: EditDialogSiswaView) ], dependencies: [ LazySingleton(classType: NavigationService), diff --git a/lib/app/app.dialogs.dart b/lib/app/app.dialogs.dart index 3d2debf..b40740a 100644 --- a/lib/app/app.dialogs.dart +++ b/lib/app/app.dialogs.dart @@ -8,6 +8,7 @@ import 'package:stacked_services/stacked_services.dart'; import 'app.locator.dart'; import '../ui/views/admin_index_tracking/add_siswa_dialog/add_siswa_dialog/add_siswa_dialog_view.dart'; +import '../ui/views/admin_index_tracking/edit_siswa/edit_dialog_siswa/edit_dialog_siswa_view.dart'; import '../ui/views/admin_index_tracking/filter_dialog/filter_dialog_view.dart'; import '../ui/views/admin_index_tracking/struktur_organisasi/edit_strukrur_organisasi_dialog/edit_strukrur_organisasi_dialog_view.dart'; @@ -15,6 +16,7 @@ enum DialogType { addSiswaDialogView, filterDialogView, editStrukrurOrganisasiDialogView, + editDialogSiswaView, } void setupDialogUi() { @@ -28,6 +30,8 @@ void setupDialogUi() { DialogType.editStrukrurOrganisasiDialogView: (context, request, completer) => EditStrukrurOrganisasiDialogView( request: request, completer: completer), + DialogType.editDialogSiswaView: (context, request, completer) => + EditDialogSiswaView(request: request, completer: completer), }; dialogService.registerCustomDialogBuilders(builders); diff --git a/lib/model/dana_sosial_model.dart b/lib/model/dana_sosial_model.dart index 4313bc6..0d9a604 100644 --- a/lib/model/dana_sosial_model.dart +++ b/lib/model/dana_sosial_model.dart @@ -1,5 +1,6 @@ class DanaSosialModel { String? idDanaSosial; + String? bentuk; String? nama; String? jumlah; String? tanggal; @@ -12,6 +13,7 @@ class DanaSosialModel { DanaSosialModel( {this.idDanaSosial, + this.bentuk, this.nama, this.jumlah, this.tanggal, @@ -23,6 +25,7 @@ class DanaSosialModel { DanaSosialModel.fromJson(Map json) { idDanaSosial = json['id_dana_sosial']; + bentuk = json['bentuk']; nama = json['nama']; jumlah = json['jumlah']; tanggal = json['tanggal']; @@ -37,6 +40,7 @@ class DanaSosialModel { Map toJson() { final Map data = {}; data['id_dana_sosial'] = idDanaSosial; + data['bentuk'] = bentuk; data['nama'] = nama; data['jumlah'] = jumlah; data['tanggal'] = tanggal; diff --git a/lib/services/http_services.dart b/lib/services/http_services.dart index 372c30e..b925102 100644 --- a/lib/services/http_services.dart +++ b/lib/services/http_services.dart @@ -20,7 +20,9 @@ class MyHttpServices { Future get(String path) async { try { return await _dio.get(path); - } on DioError { + } on DioError catch (e) { + log.e(e.message); + log.e(e.response); rethrow; } } @@ -28,8 +30,31 @@ class MyHttpServices { Future postWithFormData(String path, FormData formData) async { try { return await _dio.post(path, data: formData); - } on DioError { + } on DioError catch (e) { + log.e(e.message); + log.e(e.response); rethrow; } } + + // // delete + // Future delete(String path, FormData data) async { + // try { + // // log.i('path: $path'); + // return await _dio.delete( + // path, + // data: data, + // // encoding: Encoding.getByName('utf-8'), + // options: Options( + // headers: { + // 'Content-Type': 'application/x-www-form-urlencoded', + // }, + // ), + // ); + // } on DioError catch (e) { + // log.e(e.message); + // log.e(e.response); + // rethrow; + // } + // } } diff --git a/lib/ui/views/admin_index_tracking/dana_sosial_admin/dana_sosial_admin_view.dart b/lib/ui/views/admin_index_tracking/dana_sosial_admin/dana_sosial_admin_view.dart index 73c91b1..efbd19d 100644 --- a/lib/ui/views/admin_index_tracking/dana_sosial_admin/dana_sosial_admin_view.dart +++ b/lib/ui/views/admin_index_tracking/dana_sosial_admin/dana_sosial_admin_view.dart @@ -167,15 +167,52 @@ class TheData extends ViewModelWidget { subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(viewModel.danaSosialModelList[index].nama ?? '', - style: regularTextStyle.copyWith( - fontSize: 13, color: mainColor)), Text( - viewModel.danaSosialModelList[index].jenisDonasi == 'Uang' - ? (viewModel.isLogin == true ? 'Rp. $jumlahDonasi' : '-') - : 'Donasi Barang', - style: - regularTextStyle.copyWith(fontSize: 13, color: mainColor), + viewModel.danaSosialModelList[index].bentuk == 'Pemasukan' + ? 'Pemasukan' + : 'Pengeluaran', + style: boldTextStyle.copyWith( + fontSize: 14, + color: viewModel.danaSosialModelList[index].bentuk == + 'Pemasukan' + ? Colors.green + : Colors.red, + ), + ), + Text( + viewModel.danaSosialModelList[index].nama ?? '-', + style: regularTextStyle.copyWith( + fontSize: 13, + color: viewModel.danaSosialModelList[index].bentuk == + 'Pemasukan' + ? Colors.green + : Colors.red, + ), + ), + Text( + // viewModel.danaSosialModelList[index].jenisDonasi == 'Uang' + // ? (viewModel.isLogin == true ? 'Rp. $jumlahDonasi' : '-') + // : 'Donasi Barang', + viewModel.danaSosialModelList[index].bentuk == 'Pemasukan' + ? (viewModel.danaSosialModelList[index].jenisDonasi == + 'Uang' + ? (viewModel.isLogin == true + ? 'Rp. $jumlahDonasi' + : '-') + : 'Donasi Barang') + : (viewModel.danaSosialModelList[index].jenisDonasi == + 'Uang' + ? (viewModel.isLogin == true + ? 'Rp. $jumlahDonasi' + : '-') + : 'Pengeluaran Barang'), + style: regularTextStyle.copyWith( + fontSize: 13, + color: viewModel.danaSosialModelList[index].bentuk == + 'Pemasukan' + ? Colors.green + : Colors.red, + ), ), Text( viewModel.danaSosialModelList[index].status ?? '', diff --git a/lib/ui/views/admin_index_tracking/edit_siswa/edit_dialog_siswa/edit_dialog_siswa_view.dart b/lib/ui/views/admin_index_tracking/edit_siswa/edit_dialog_siswa/edit_dialog_siswa_view.dart new file mode 100644 index 0000000..bc1d097 --- /dev/null +++ b/lib/ui/views/admin_index_tracking/edit_siswa/edit_dialog_siswa/edit_dialog_siswa_view.dart @@ -0,0 +1,313 @@ +import 'package:flutter/material.dart'; +import 'package:panti_asuhan/app/themes/app_colors.dart'; +import 'package:panti_asuhan/app/themes/app_text.dart'; +import 'package:panti_asuhan/ui/widgets/my_textformfield.dart'; +import 'package:stacked/stacked.dart'; +import 'package:stacked_services/stacked_services.dart'; +import 'package:validatorless/validatorless.dart'; + +import './edit_dialog_siswa_view_model.dart'; + +class EditDialogSiswaView extends StatelessWidget { + final DialogRequest request; + final Function(DialogResponse) completer; + + const EditDialogSiswaView({ + Key? key, + required this.request, + required this.completer, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return ViewModelBuilder.reactive( + viewModelBuilder: () => EditDialogSiswaViewModel(), + onViewModelReady: (EditDialogSiswaViewModel model) async { + await model.init(request.data); + }, + builder: ( + BuildContext context, + EditDialogSiswaViewModel model, + Widget? child, + ) { + return Dialog( + child: Container( + padding: const EdgeInsets.all(20), + decoration: const BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10), + topRight: Radius.circular(10), + ), + ), + child: SingleChildScrollView( + child: Form( + key: model.formKey, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const Center( + child: Text( + 'Edit Data Siswa', + style: boldTextStyle, + ), + ), + const SizedBox(height: 10), + Text( + ' Nama', + style: regularTextStyle.copyWith( + fontSize: 12, + color: mainColor, + ), + ), + MyTextFormField( + hintText: 'Masukkan Nama', + controller: model.namaController, + validator: + Validatorless.required('Nama tidak boleh kosong'), + ), + const SizedBox(height: 10), + Text( + ' Tanggal Lahir', + style: regularTextStyle.copyWith( + fontSize: 12, + color: mainColor, + ), + ), + MyTextFormField( + controller: model.tanggalLahirController, + readOnly: true, + validator: Validatorless.required( + 'Tanggal lahir tidak boleh kosong'), + onTap: () { + model.changeDate(context); + }, + ), + const SizedBox(height: 10), + Text( + ' Tempat Lahir', + style: regularTextStyle.copyWith( + fontSize: 12, + color: mainColor, + ), + ), + MyTextFormField( + hintText: 'Masukkan Tempat Lahir', + controller: model.tempatLahirController, + validator: Validatorless.required( + 'Tempat lahir tidak boleh kosong'), + ), + const SizedBox(height: 10), + Text( + ' Jenis Kelamin', + style: regularTextStyle.copyWith( + fontSize: 12, + color: mainColor, + ), + ), + Container( + width: double.infinity, + height: 60, + padding: const EdgeInsets.symmetric(horizontal: 10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(25), + border: Border.all( + color: mainColor, + ), + ), + child: DropdownButtonHideUnderline( + child: DropdownButton( + value: model.jenisKelamin, + onChanged: (String? newValue) { + // model.setSelectedJenisKelamin(newValue!); + model.log.i(newValue); + model.jenisKelamin = newValue!; + model.notifyListeners(); + }, + items: model.jenisKelaminList.map((String value) { + return DropdownMenuItem( + value: value, + child: Text( + value, + style: regularTextStyle.copyWith( + fontSize: 16, + ), + ), + ); + }).toList(), + ), + ), + ), + const SizedBox(height: 10), + Text( + ' No. Telepon', + style: regularTextStyle.copyWith( + fontSize: 12, + color: mainColor, + ), + ), + MyTextFormField( + hintText: 'Masukkan No. Telepon', + controller: model.noTelponController, + validator: Validatorless.multiple( + [ + Validatorless.required( + 'No. telepon tidak boleh kosong'), + Validatorless.number( + 'No. telepon harus berupa angka'), + ], + ), + ), + const SizedBox(height: 10), + Text( + ' Agama', + style: regularTextStyle.copyWith( + fontSize: 12, + color: mainColor, + ), + ), + MyTextFormField( + controller: model.agamaController, + validator: + Validatorless.required('Agama tidak boleh kosong'), + ), + const SizedBox(height: 10), + Text( + ' Kewarganegaraan', + style: regularTextStyle.copyWith( + fontSize: 12, + color: mainColor, + ), + ), + MyTextFormField( + controller: model.kewarganegaraanController, + validator: Validatorless.required( + 'Kewarganegaraan tidak boleh kosong'), + ), + const SizedBox(height: 10), + Text( + ' Alamat', + style: regularTextStyle.copyWith( + fontSize: 12, + color: mainColor, + ), + ), + MyTextFormField( + controller: model.alamatController, + maxLines: 2, + validator: + Validatorless.required('Alamat tidak boleh kosong'), + ), + const SizedBox(height: 10), + Text( + ' Pendidikan SD', + style: regularTextStyle.copyWith( + fontSize: 12, + color: mainColor, + ), + ), + MyTextFormField( + controller: model.pendidikanSDController, + validator: Validatorless.required( + 'Pendidikan SD tidak boleh kosong'), + ), + const SizedBox(height: 10), + Text( + ' Pendidikan SMP', + style: regularTextStyle.copyWith( + fontSize: 12, + color: mainColor, + ), + ), + MyTextFormField( + controller: model.pendidikanSMPController, + validator: Validatorless.required( + 'Pendidikan SMP tidak boleh kosong'), + ), + const SizedBox(height: 10), + Text( + ' Pendidikan SMA', + style: regularTextStyle.copyWith( + fontSize: 12, + color: mainColor, + ), + ), + MyTextFormField( + controller: model.pendidikanSMAController, + validator: Validatorless.required( + 'Pendidikan SMA tidak boleh kosong'), + ), + const SizedBox(height: 10), + Text( + ' Kemampuan', + style: regularTextStyle.copyWith( + fontSize: 12, + color: mainColor, + ), + ), + MyTextFormField( + controller: model.kemampuanController, + maxLines: 4, + validator: Validatorless.required( + 'Kemampuan tidak boleh kosong'), + ), + const SizedBox(height: 10), + Text( + ' Hobi', + style: regularTextStyle.copyWith( + fontSize: 12, + color: mainColor, + ), + ), + MyTextFormField( + controller: model.hobiController, + maxLines: 4, + validator: + Validatorless.required('Hobi tidak boleh kosong'), + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () {}, + child: const Text( + 'Batal', + style: TextStyle( + color: dangerColor, + ), + ), + ), + TextButton( + onPressed: () async { + if (model.formKey.currentState!.validate()) { + // bool res = await model.postData(); + // model.log.i("res: $res"); + // if (res) { + // completer( + // DialogResponse( + // confirmed: true, + // ), + // ); + // } + } + }, + child: const Text( + 'Update', + style: TextStyle( + color: blueColor, + ), + ), + ), + ], + ), + ], + ), + ), + ), + ), + ); + }, + ); + } +} diff --git a/lib/ui/views/admin_index_tracking/edit_siswa/edit_dialog_siswa/edit_dialog_siswa_view_model.dart b/lib/ui/views/admin_index_tracking/edit_siswa/edit_dialog_siswa/edit_dialog_siswa_view_model.dart new file mode 100644 index 0000000..1dc1aaa --- /dev/null +++ b/lib/ui/views/admin_index_tracking/edit_siswa/edit_dialog_siswa/edit_dialog_siswa_view_model.dart @@ -0,0 +1,69 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter_holo_date_picker/flutter_holo_date_picker.dart'; + +import '../../../../../app/app.logger.dart'; +import '../../../../../app/core/custom_base_view_model.dart'; +import '../../../../../model/siswa_model.dart'; + +class EditDialogSiswaViewModel extends CustomBaseViewModel { + final log = getLogger('EditDialogSiswaViewModel'); + SiswaModel? siswaModel; + String jenisKelamin = 'Laki-laki'; + List jenisKelaminList = ['Laki-laki', 'Perempuan']; + + TextEditingController namaController = TextEditingController(); + TextEditingController tanggalLahirController = TextEditingController(); + TextEditingController tempatLahirController = TextEditingController(); + TextEditingController alamatController = TextEditingController(); + TextEditingController noTelponController = TextEditingController(); + TextEditingController agamaController = TextEditingController(); + TextEditingController kewarganegaraanController = TextEditingController(); + TextEditingController pendidikanSDController = TextEditingController(); + TextEditingController pendidikanSMPController = TextEditingController(); + TextEditingController pendidikanSMAController = TextEditingController(); + TextEditingController kemampuanController = TextEditingController(); + TextEditingController hobiController = TextEditingController(); + final formKey = GlobalKey(); + + Future init(data) async { + log.i('data: $data'); + setBusy(true); + siswaModel = data; + notifyListeners(); + setBusy(false); + namaController.text = siswaModel!.nama!; + tanggalLahirController.text = siswaModel!.tanggalLahir!; + tempatLahirController.text = siswaModel!.tempatLahir!; + alamatController.text = siswaModel!.alamat!; + noTelponController.text = siswaModel!.noTelpon!; + agamaController.text = siswaModel!.agama!; + kewarganegaraanController.text = siswaModel!.kewarganegaraan!; + pendidikanSDController.text = siswaModel!.pendidikanSd!; + pendidikanSMPController.text = siswaModel!.pendidikanSmp!; + pendidikanSMAController.text = siswaModel!.pendidikanSma!; + kemampuanController.text = siswaModel!.kemampuan!; + hobiController.text = siswaModel!.hobi!; + + jenisKelamin = siswaModel!.jenisKelamin!; + + notifyListeners(); + } + + void changeDate(BuildContext context) async { + // get today's date + var datePicked = await DatePicker.showSimpleDatePicker( + context, + initialDate: DateTime(2010), + firstDate: DateTime(2000), + lastDate: DateTime(2015), + dateFormat: "dd-MMMM-yyyy", + locale: DateTimePickerLocale.id, + looping: true, + ); + + if (datePicked != null) { + String date = datePicked.toString().split(' ')[0]; + tanggalLahirController.text = date; + } + } +} diff --git a/lib/ui/views/admin_index_tracking/edit_siswa/edit_siswa_view.dart b/lib/ui/views/admin_index_tracking/edit_siswa/edit_siswa_view.dart index 73ab76d..fa3ecfb 100644 --- a/lib/ui/views/admin_index_tracking/edit_siswa/edit_siswa_view.dart +++ b/lib/ui/views/admin_index_tracking/edit_siswa/edit_siswa_view.dart @@ -43,15 +43,15 @@ class EditSiswaView extends StatelessWidget { body: Padding( padding: const EdgeInsets.all(20.0), child: SingleChildScrollView( - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + child: Stack( children: [ - Center( - child: Stack( - children: [ - CircleAvatar( + Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Center( + child: CircleAvatar( radius: 50, backgroundColor: fontParagraphColor, backgroundImage: model.siswaModel != null @@ -67,164 +67,235 @@ class EditSiswaView extends StatelessWidget { ) : null, ), - ], + ), + const SizedBox(height: 10), + MyTextFormField( + labelText: 'Nama', + controller: model.namaController, + validator: + Validatorless.required('Nama tidak boleh kosong'), + enabled: false, + ), + const SizedBox(height: 10), + MyTextFormField( + labelText: 'Tanggal Lahir', + controller: model.tanggalLahirController, + readOnly: true, + validator: Validatorless.required( + 'Tanggal lahir tidak boleh kosong'), + enabled: false, + onTap: () { + // model.changeDate(context); + }, + ), + const SizedBox(height: 10), + MyTextFormField( + labelText: 'Tempat Lahir', + controller: model.tempatLahirController, + enabled: false, + validator: Validatorless.required( + 'Tempat lahir tidak boleh kosong'), + ), + const SizedBox(height: 10), + // create dropdown button + MyTextFormField( + labelText: 'Jenis Kelamin', + controller: model.jkController, + enabled: false, + validator: Validatorless.required( + 'Pendidikan SMP tidak boleh kosong'), + ), + const SizedBox(height: 10), + MyTextFormField( + labelText: 'No. Telepon', + controller: model.noTelponController, + enabled: false, + keyboardType: TextInputType.number, + validator: Validatorless.multiple( + [ + Validatorless.required( + 'No. telepon tidak boleh kosong'), + Validatorless.number( + 'No. telepon harus berupa angka'), + ], + ), + ), + const SizedBox(height: 10), + MyTextFormField( + labelText: 'Agama', + controller: model.agamaController, + enabled: false, + keyboardType: TextInputType.emailAddress, + validator: + Validatorless.required('Agama tidak boleh kosong'), + ), + const SizedBox(height: 10), + MyTextFormField( + labelText: 'Kewarganegaraan', + controller: model.kewarganegaraanController, + enabled: false, + keyboardType: TextInputType.emailAddress, + validator: Validatorless.required( + 'Kewarganegaraan tidak boleh kosong'), + ), + const SizedBox(height: 10), + MyTextFormField( + labelText: 'Alamat', + controller: model.alamatController, + enabled: false, + maxLines: 2, + validator: + Validatorless.required('Alamat tidak boleh kosong'), + ), + const SizedBox(height: 10), + MyTextFormField( + labelText: 'Pendidikan SD', + controller: model.pendidikanSDController, + enabled: false, + validator: Validatorless.required( + 'Pendidikan SD tidak boleh kosong'), + ), + const SizedBox(height: 10), + MyTextFormField( + labelText: 'Pendidikan SMP', + controller: model.pendidikanSMPController, + enabled: false, + validator: Validatorless.required( + 'Pendidikan SMP tidak boleh kosong'), + ), + const SizedBox(height: 10), + MyTextFormField( + labelText: 'Pendidikan SMA', + controller: model.pendidikanSMAController, + enabled: false, + validator: Validatorless.required( + 'Pendidikan SMA tidak boleh kosong'), + ), + const SizedBox(height: 10), + MyTextFormField( + labelText: 'Kemampuan', + controller: model.kemampuanController, + enabled: false, + maxLines: 4, + validator: Validatorless.required( + 'Kemampuan tidak boleh kosong'), + ), + const SizedBox(height: 10), + MyTextFormField( + labelText: "Hobi", + controller: model.hobiController, + enabled: false, + maxLines: 4, + validator: + Validatorless.required('Hobi tidak boleh kosong'), + ), + // Row( + // mainAxisAlignment: MainAxisAlignment.end, + // children: [ + // TextButton( + // onPressed: () {}, + // child: const Text( + // 'Batal', + // style: TextStyle( + // color: dangerColor, + // ), + // ), + // ), + // TextButton( + // onPressed: () async { + // // if (model.formKey.currentState!.validate()) { + // // bool res = await model.postData(); + // // model.log.i("res: $res"); + // // if (res) { + // // completer( + // // DialogResponse( + // // confirmed: true, + // // ), + // // ); + // // } + // // } + // }, + // child: const Text( + // 'Simpan', + // style: TextStyle( + // color: blueColor, + // ), + // ), + // ), + // ], + // ), + ], + ), + Positioned( + top: 0, + right: 45, + // create a edit rounded button + child: Container( + alignment: Alignment.center, + height: 30, + width: 30, + decoration: BoxDecoration( + color: blueColor, + borderRadius: BorderRadius.circular(20), + ), + child: IconButton( + onPressed: () { + // model.changeEdit(); + model.editData(); + }, + icon: const Icon( + Icons.edit, + color: Colors.white, + size: 13, + ), + ), ), ), - const SizedBox(height: 10), - MyTextFormField( - labelText: 'Nama', - controller: model.namaController, - validator: - Validatorless.required('Nama tidak boleh kosong'), - enabled: false, - ), - const SizedBox(height: 10), - MyTextFormField( - labelText: 'Tanggal Lahir', - controller: model.tanggalLahirController, - readOnly: true, - validator: Validatorless.required( - 'Tanggal lahir tidak boleh kosong'), - enabled: false, - onTap: () { - // model.changeDate(context); - }, - ), - const SizedBox(height: 10), - MyTextFormField( - labelText: 'Tempat Lahir', - controller: model.tempatLahirController, - enabled: false, - validator: Validatorless.required( - 'Tempat lahir tidak boleh kosong'), - ), - const SizedBox(height: 10), - // create dropdown button - MyTextFormField( - labelText: 'Jenis Kelamin', - controller: model.jkController, - enabled: false, - validator: Validatorless.required( - 'Pendidikan SMP tidak boleh kosong'), - ), - const SizedBox(height: 10), - MyTextFormField( - labelText: 'No. Telepon', - controller: model.noTelponController, - enabled: false, - keyboardType: TextInputType.number, - validator: Validatorless.multiple( - [ - Validatorless.required( - 'No. telepon tidak boleh kosong'), - Validatorless.number('No. telepon harus berupa angka'), - ], + Positioned( + top: 0, + right: 0, + // create a close rounded button + child: Container( + alignment: Alignment.center, + height: 30, + width: 30, + decoration: BoxDecoration( + color: dangerColor, + borderRadius: BorderRadius.circular(20), + ), + child: IconButton( + onPressed: () { + // model.changeEdit(); + model.dialogService + .showDialog( + title: 'Hapus Data', + description: + 'Apakah anda yakin ingin menghapus data ini?', + buttonTitle: 'Hapus', + cancelTitle: 'Batal', + buttonTitleColor: dangerColor, + cancelTitleColor: mainColor, + ) + .then((value) { + if (value!.confirmed) { + model.deleteData(); + // close dialog + Navigator.pop(context); + // model.navigationService.clearTillFirstAndShow( + // Routes.splashScreenView); + } + }); + + // model.deleteData(); + }, + icon: const Icon( + Icons.delete_forever, + color: Colors.white, + size: 15, + ), + ), ), ), - const SizedBox(height: 10), - MyTextFormField( - labelText: 'Agama', - controller: model.agamaController, - enabled: false, - keyboardType: TextInputType.emailAddress, - validator: - Validatorless.required('Agama tidak boleh kosong'), - ), - const SizedBox(height: 10), - MyTextFormField( - labelText: 'Kewarganegaraan', - controller: model.kewarganegaraanController, - enabled: false, - keyboardType: TextInputType.emailAddress, - validator: Validatorless.required( - 'Kewarganegaraan tidak boleh kosong'), - ), - const SizedBox(height: 10), - MyTextFormField( - labelText: 'Alamat', - controller: model.alamatController, - enabled: false, - maxLines: 2, - validator: - Validatorless.required('Alamat tidak boleh kosong'), - ), - const SizedBox(height: 10), - MyTextFormField( - labelText: 'Pendidikan SD', - controller: model.pendidikanSDController, - enabled: false, - validator: Validatorless.required( - 'Pendidikan SD tidak boleh kosong'), - ), - const SizedBox(height: 10), - MyTextFormField( - labelText: 'Pendidikan SMP', - controller: model.pendidikanSMPController, - enabled: false, - validator: Validatorless.required( - 'Pendidikan SMP tidak boleh kosong'), - ), - const SizedBox(height: 10), - MyTextFormField( - labelText: 'Pendidikan SMA', - controller: model.pendidikanSMAController, - enabled: false, - validator: Validatorless.required( - 'Pendidikan SMA tidak boleh kosong'), - ), - const SizedBox(height: 10), - MyTextFormField( - labelText: 'Kemampuan', - controller: model.kemampuanController, - enabled: false, - maxLines: 4, - validator: - Validatorless.required('Kemampuan tidak boleh kosong'), - ), - const SizedBox(height: 10), - MyTextFormField( - labelText: "Hobi", - controller: model.hobiController, - enabled: false, - maxLines: 4, - validator: - Validatorless.required('Hobi tidak boleh kosong'), - ), - // Row( - // mainAxisAlignment: MainAxisAlignment.end, - // children: [ - // TextButton( - // onPressed: () {}, - // child: const Text( - // 'Batal', - // style: TextStyle( - // color: dangerColor, - // ), - // ), - // ), - // TextButton( - // onPressed: () async { - // // if (model.formKey.currentState!.validate()) { - // // bool res = await model.postData(); - // // model.log.i("res: $res"); - // // if (res) { - // // completer( - // // DialogResponse( - // // confirmed: true, - // // ), - // // ); - // // } - // // } - // }, - // child: const Text( - // 'Simpan', - // style: TextStyle( - // color: blueColor, - // ), - // ), - // ), - // ], - // ), ], ), ), diff --git a/lib/ui/views/admin_index_tracking/edit_siswa/edit_siswa_view_model.dart b/lib/ui/views/admin_index_tracking/edit_siswa/edit_siswa_view_model.dart index 4ed7f11..aa9461d 100644 --- a/lib/ui/views/admin_index_tracking/edit_siswa/edit_siswa_view_model.dart +++ b/lib/ui/views/admin_index_tracking/edit_siswa/edit_siswa_view_model.dart @@ -1,5 +1,7 @@ +import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; +import '../../../../app/app.dialogs.dart'; import '../../../../app/app.locator.dart'; import '../../../../app/app.logger.dart'; import '../../../../app/core/custom_base_view_model.dart'; @@ -64,4 +66,46 @@ class EditSiswaViewModel extends CustomBaseViewModel { easyLoading.dismissLoading(); } } + + void deleteData() async { + setBusy(true); + easyLoading.showLoading(); + try { + var response = await _httpService.postWithFormData( + 'siswa_delete', + FormData.fromMap( + { + 'id': siswaModel!.idSiswa, + }, + ), + ); + log.i(response.data); + + snackbarService.showSnackbar( + message: 'Data berhasil dihapus', + title: 'Berhasil', + duration: const Duration(seconds: 2), + ); + // navigationService.back(); + } catch (e) { + snackbarService.showSnackbar( + message: 'Data gagal dihapus', + title: 'Gagal', + duration: const Duration(seconds: 2), + ); + log.e(e); + } finally { + setBusy(false); + easyLoading.dismissLoading(); + } + } + + editData() async { + var res = dialogService.showCustomDialog( + variant: DialogType.editDialogSiswaView, + data: siswaModel, + ); + + res; + } } diff --git a/lib/ui/views/admin_index_tracking/struktur_organisasi/edit_strukrur_organisasi_dialog/edit_strukrur_organisasi_dialog_view.dart b/lib/ui/views/admin_index_tracking/struktur_organisasi/edit_strukrur_organisasi_dialog/edit_strukrur_organisasi_dialog_view.dart index 1a6f151..d89f297 100644 --- a/lib/ui/views/admin_index_tracking/struktur_organisasi/edit_strukrur_organisasi_dialog/edit_strukrur_organisasi_dialog_view.dart +++ b/lib/ui/views/admin_index_tracking/struktur_organisasi/edit_strukrur_organisasi_dialog/edit_strukrur_organisasi_dialog_view.dart @@ -55,30 +55,29 @@ class EditStrukrurOrganisasiDialogView extends StatelessWidget { ), ), // top right rounded add button - // request?.data['tambahan'] == false - // ? const SizedBox() - // : - Positioned( - top: 0, - right: 0, - child: GestureDetector( - onTap: () { - model.addWidget(); - // model.check(); - }, - child: Container( - padding: const EdgeInsets.all(5), - decoration: BoxDecoration( - color: Colors.green, - borderRadius: BorderRadius.circular(20), + request?.data['tambahan'] == false + ? const SizedBox() + : Positioned( + top: 0, + right: 0, + child: GestureDetector( + onTap: () { + model.addWidget(); + // model.check(); + }, + child: Container( + padding: const EdgeInsets.all(5), + decoration: BoxDecoration( + color: Colors.green, + borderRadius: BorderRadius.circular(20), + ), + child: const Icon( + Icons.add, + color: Colors.white, + ), + ), + ), ), - child: const Icon( - Icons.add, - color: Colors.white, - ), - ), - ), - ), ], ), const SizedBox( @@ -90,7 +89,7 @@ class EditStrukrurOrganisasiDialogView extends StatelessWidget { text: 'Simpan', onPressed: () { // model.check(); - model.uploadJabatan(); + model.uploadJabatan(completer!); }, ), ), @@ -108,6 +107,7 @@ class TheWidget extends ViewModelWidget { final TextEditingController controller; final int index; @override + // ignore: overridden_fields final Key key; const TheWidget({ @@ -151,7 +151,7 @@ class TheWidget extends ViewModelWidget { ], ), // top right rounded add button - index == 0 + index == 1 ? const SizedBox() : Positioned( top: 0, diff --git a/lib/ui/views/admin_index_tracking/struktur_organisasi/edit_strukrur_organisasi_dialog/edit_strukrur_organisasi_dialog_view_model.dart b/lib/ui/views/admin_index_tracking/struktur_organisasi/edit_strukrur_organisasi_dialog/edit_strukrur_organisasi_dialog_view_model.dart index 18f0a64..6101fe0 100644 --- a/lib/ui/views/admin_index_tracking/struktur_organisasi/edit_strukrur_organisasi_dialog/edit_strukrur_organisasi_dialog_view_model.dart +++ b/lib/ui/views/admin_index_tracking/struktur_organisasi/edit_strukrur_organisasi_dialog/edit_strukrur_organisasi_dialog_view_model.dart @@ -4,6 +4,7 @@ import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:http_parser/http_parser.dart'; import 'package:image_picker/image_picker.dart'; +import 'package:stacked_services/stacked_services.dart'; import '../../../../../app/app.locator.dart'; import '../../../../../app/app.logger.dart'; @@ -89,7 +90,35 @@ class EditStrukrurOrganisasiDialogViewModel extends CustomBaseViewModel { } } - uploadJabatan() async { + uploadJabatan(Function(DialogResponse p1) completer) async { + // check if the controller is empty + for (var i = 1; i <= controllers.length; i++) { + String key = controllers.keys.elementAt(i - 1); + if (controllers[key]!.text.isEmpty) { + snackbarService.showSnackbar( + message: 'Nama tidak boleh kosong', + title: 'Error', + duration: const Duration(seconds: 2), + ); + return; + } + } + + // check if the image is empty + for (var i = 1; i <= controllers.length; i++) { + // String key = controllers.keys.elementAt(i - 1); + if (!imagePaths.containsKey('image$i')) { + snackbarService.showSnackbar( + message: 'Gambar tidak boleh kosong', + title: 'Error', + duration: const Duration(seconds: 2), + ); + return; + } + } + + setBusy(true); + easyloading.customLoading('Edit Detail Jabatan $name'); Map array = { 'jabatan': name, 'jumlah': controllers.length.toString(), @@ -108,20 +137,25 @@ class EditStrukrurOrganisasiDialogViewModel extends CustomBaseViewModel { contentType: MediaType.parse('image/jpeg'), ); } - FormData formData = FormData.fromMap(array); + // log.i(array); + try { + // // // log.i(formData.fields); + await _httpService.postWithFormData('edit_jabatan', formData); - // // // log.i(formData.fields); - var response = - await _httpService.postWithFormData('edit_jabatan', formData); - - log.i(response.data); - - setBusy(true); - easyloading.customLoading('Edit Detail Jabatan $name'); - await Future.delayed(const Duration(seconds: 1)); - easyloading.dismissLoading(); - setBusy(false); + // log.i(response.data); + completer( + DialogResponse(confirmed: true), + ); + } catch (e) { + log.e(e); + completer( + DialogResponse(confirmed: false), + ); + } finally { + easyloading.dismissLoading(); + setBusy(false); + } } void removeWidget(int index, Key containerKey) { diff --git a/lib/ui/views/admin_index_tracking/struktur_organisasi/struktur_organisasi_view.dart b/lib/ui/views/admin_index_tracking/struktur_organisasi/struktur_organisasi_view.dart index 6259704..c678fc5 100644 --- a/lib/ui/views/admin_index_tracking/struktur_organisasi/struktur_organisasi_view.dart +++ b/lib/ui/views/admin_index_tracking/struktur_organisasi/struktur_organisasi_view.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:stacked/stacked.dart'; import './struktur_organisasi_view_model.dart'; @@ -34,237 +35,130 @@ class StrukturOrganisasiView extends StatelessWidget { const SizedBox( height: 20, ), - const KetuaWidget(), - const SizedBox( - height: 20, - ), - const SekretarisWidget(), - const SizedBox( - height: 20, - ), - const BendaharaWidget(), - const SizedBox( - height: 20, - ), - const Text( - "Seksi Pengasuh", - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox( - height: 2, - ), - Text( - '${model.seksiPengasuh1}\n${model.seksiPengasuh2}\n${model.seksiPengasuh3}\n${model.seksiPengasuh4}', - style: const TextStyle( - fontSize: 20, - ), + FirstWidget( + title: "Ketua", + data: model.dataKetua, ), const SizedBox( height: 20, ), - const Text( - "Seksi Ibadah", - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox( - height: 2, - ), - Text( - '${model.seksiIbadah1}\n${model.seksiIbadah2}\n${model.seksiIbadah3}\n${model.seksiIbadah4}', - style: const TextStyle( - fontSize: 20, - ), + FirstWidget( + title: 'Sekretaris', + data: model.dataSekretaris, ), const SizedBox( height: 20, ), - const Text( - "Seksi Pendidikan", - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox( - height: 2, - ), - Text( - '${model.seksiPendidikan1}\n${model.seksiPendidikan2}', - style: const TextStyle( - fontSize: 20, - ), + FirstWidget( + title: 'Bendahara', + data: model.dataBendahara, ), const SizedBox( height: 20, ), - const Text( - "Seksi Kesehatan", - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox( - height: 2, - ), - Text( - model.seksiKesehatan, - style: const TextStyle( - fontSize: 20, - ), + SecondWidget( + title: 'Seksi Pengasuh', + data: model.dataPengasuh, + length: model.dataPengasuhLength, ), const SizedBox( height: 20, ), - const Text( - "Seksi Kebersihan", - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox( - height: 2, - ), - Text( - model.seksiKebersihan, - style: const TextStyle( - fontSize: 20, - ), + SecondWidget( + title: 'Seksi Ibadah', + data: model.dataIbadah, + length: model.dataIbadahLength, ), const SizedBox( height: 20, ), - const Text( - "Seksi Keterampilan", - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - Text( - model.seksiKeterampilan1, - style: const TextStyle( - fontSize: 20, - ), + SecondWidget( + title: 'Seksi Pendidikan', + data: model.dataPendidikan, + length: model.dataPendidikanLength, ), const SizedBox( height: 20, ), - const Text( - "Seksi Sarana Prasarana", - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - Text( - model.seksiSaranaPrasarana1, - style: const TextStyle( - fontSize: 20, - ), + SecondWidget( + title: 'Seksi Kesehatan', + data: model.dataKesehatan, + length: model.dataKesehatanLength, ), const SizedBox( height: 20, ), - const Text( - "Seksi Konsumsi", - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - Text( - '${model.seksiKonsumsi1}\n${model.seksiKonsumsi2}', - style: const TextStyle( - fontSize: 20, - ), + SecondWidget( + title: 'Seksi Kebersihan', + data: model.dataKebersihan, + length: model.dataKebersihanLength, ), const SizedBox( height: 20, ), - const Text( - "Seksi Keamanan", - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - Text( - '${model.seksiKeamanan1}\n${model.seksiKeamanan2}', - style: const TextStyle( - fontSize: 20, - ), + SecondWidget( + title: 'Seksi Keterampilan', + data: model.dataKeterampilan, + length: model.dataKeterampilanLength, ), const SizedBox( height: 20, ), - const Text( - "Seksi Gedung", - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - Text( - '${model.seksiGedung1}\n${model.seksiGedung2}\n${model.seksiGedung3}\n${model.seksiGedung4}', - style: const TextStyle( - fontSize: 20, - ), + SecondWidget( + title: 'Sarana dan Prasarana', + data: model.dataSaranaDanPrasarana, + length: model.dataSaranaDanPrasaranaLength, ), const SizedBox( height: 20, ), - const Text( - "Seksi Wisma", - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - Text( - '${model.seksiWisma1}\n${model.seksiWisma2}\n${model.seksiWisma3}\n${model.seksiWisma4}\n${model.seksiWisma5}', - style: const TextStyle( - fontSize: 20, - ), + SecondWidget( + title: 'Seksi Konsumsi', + data: model.dataKonsumsi, + length: model.dataKonsumsiLength, ), const SizedBox( height: 20, ), - const Text( - "Kelompok Putri", - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - Text( - '${model.kelompokPutri1}\n${model.kelompokPutri2}\n${model.kelompokPutri3}', - style: const TextStyle( - fontSize: 20, - ), + SecondWidget( + title: 'Seksi Keamanan', + data: model.dataKeamanan, + length: model.dataKeamananLength, ), const SizedBox( height: 20, ), - const Text( - "Kelompok Putra", - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), + SecondWidget( + title: 'Seksi Gedung', + data: model.dataGedung, + length: model.dataGedungLength, ), - Text( - '${model.kelompokPutra1}\n${model.kelompokPutra2}\n${model.kelompokPutra3}', - style: const TextStyle( - fontSize: 20, - ), + const SizedBox( + height: 20, + ), + SecondWidget( + title: 'Seksi Wisma', + data: model.dataWisma, + length: model.dataWismaLength, + ), + const SizedBox( + height: 20, + ), + SecondWidget( + title: 'Kelompok Putra', + data: model.dataKelompokPutra, + length: model.dataKelompokPutraLength, + ), + const SizedBox( + height: 20, + ), + SecondWidget( + title: 'Kelompok Putri', + data: model.dataKelompokPutri, + length: model.dataKelompokPutriLength, + ), + const SizedBox( + height: 20, ), ], ), @@ -276,9 +170,16 @@ class StrukturOrganisasiView extends StatelessWidget { } } -class BendaharaWidget extends ViewModelWidget { - const BendaharaWidget({ +class SecondWidget extends ViewModelWidget { + final String title; + final Map data; + final int length; + + const SecondWidget({ super.key, + required this.title, + required this.data, + required this.length, }); @override @@ -292,55 +193,9 @@ class BendaharaWidget extends ViewModelWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - const Text( - "Bendahara", - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - IconButton( - onPressed: () { - // model.editSekretaris(); - }, - icon: const Icon(Icons.edit), - ) - ], - ), - const SizedBox( - height: 2, - ), - Text( - viewModel.bendahara, - style: const TextStyle( - fontSize: 20, - ), - ), - ], - ), - ); - } -} - -class SekretarisWidget extends ViewModelWidget { - const SekretarisWidget({ - super.key, - }); - - @override - Widget build(BuildContext context, StrukturOrganisasiViewModel viewModel) { - return Card( - elevation: 4, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const Text( - "Sekretaris", - style: TextStyle( + Text( + title, + style: const TextStyle( fontSize: 20, fontWeight: FontWeight.bold, ), @@ -350,30 +205,65 @@ class SekretarisWidget extends ViewModelWidget { ), IconButton( onPressed: () { - // model.editSekretaris(); + viewModel.editData(title, true); }, icon: const Icon(Icons.edit), ) ], ), - const SizedBox( - height: 2, - ), - Text( - viewModel.sekretaris, - style: const TextStyle( - fontSize: 20, + for (var i = 0; i < length; i++) + Column( + children: [ + Center( + child: data.isEmpty + ? null + : ClipRRect( + borderRadius: BorderRadius.circular(50), + child: Image.network( + '${dotenv.env['url']}${data['img_url$i']}', + width: 100, + height: 100, + fit: BoxFit.cover, + ), + ), + ), + const SizedBox( + height: 2, + ), + Text( + data['nama$i'] ?? '...', + style: const TextStyle( + fontSize: 20, + ), + ), + const SizedBox( + height: 5, + ), + // create a line + const Divider( + color: Colors.black, + height: 20, + thickness: 1, + indent: 20, + endIndent: 20, + ), + const SizedBox(height: 5), + ], ), - ), ], ), ); } } -class KetuaWidget extends ViewModelWidget { - const KetuaWidget({ +class FirstWidget extends ViewModelWidget { + final String title; + final Map data; + + const FirstWidget({ super.key, + required this.title, + required this.data, }); @override @@ -387,9 +277,9 @@ class KetuaWidget extends ViewModelWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - const Text( - "Ketua", - style: TextStyle( + Text( + title, + style: const TextStyle( fontSize: 20, fontWeight: FontWeight.bold, ), @@ -399,17 +289,30 @@ class KetuaWidget extends ViewModelWidget { ), IconButton( onPressed: () { - viewModel.editData('ketua', false); + viewModel.editData(title, false); }, icon: const Icon(Icons.edit), ) ], ), + Center( + child: data.isEmpty + ? null + : ClipRRect( + borderRadius: BorderRadius.circular(50), + child: Image.network( + '${dotenv.env['url']}${data['img_url']}', + width: 100, + height: 100, + fit: BoxFit.cover, + ), + ), + ), const SizedBox( height: 2, ), Text( - viewModel.ketua, + data['nama'] ?? '...', style: const TextStyle( fontSize: 20, ), diff --git a/lib/ui/views/admin_index_tracking/struktur_organisasi/struktur_organisasi_view_model.dart b/lib/ui/views/admin_index_tracking/struktur_organisasi/struktur_organisasi_view_model.dart index ea20f8c..1faf485 100644 --- a/lib/ui/views/admin_index_tracking/struktur_organisasi/struktur_organisasi_view_model.dart +++ b/lib/ui/views/admin_index_tracking/struktur_organisasi/struktur_organisasi_view_model.dart @@ -1,61 +1,155 @@ -import 'package:panti_asuhan/app/core/custom_base_view_model.dart'; - import '../../../../app/app.dialogs.dart'; +import '../../../../app/app.locator.dart'; import '../../../../app/app.logger.dart'; +import '../../../../app/core/custom_base_view_model.dart'; +import '../../../../services/http_services.dart'; +import '../../../../services/my_easyloading.dart'; class StrukturOrganisasiViewModel extends CustomBaseViewModel { final log = getLogger('StrukturOrganisasiViewModel'); + final _httpService = locator(); + final easyLoading = locator(); - String ketua = "Dr. Andi Fitriani D, S.Ag, M.Pd"; - String sekretaris = "Fitriana Buyanus, S.Si ., M.Kes"; - String bendahara = "Hj. Djaliah, A.Ma"; + Map dataKetua = {}; + Map dataSekretaris = {}; + Map dataBendahara = {}; - String seksiPengasuh1 = "Dra Hj, CIA"; - String seksiPengasuh2 = "Dahang, S.Ag"; - String seksiPengasuh3 = "Sumadin, S.Pd.I"; - String seksiPengasuh4 = "Darwan"; + Map dataPengasuh = {}; + int dataPengasuhLength = 0; - String seksiIbadah1 = "Drs. Najib La'ady"; - String seksiIbadah2 = "Sumadin, S.Pd.I"; - String seksiIbadah3 = "Ahmad"; - String seksiIbadah4 = "Darwan"; + Map dataIbadah = {}; + int dataIbadahLength = 0; - String seksiPendidikan1 = "Dra. Hj. CIA"; - String seksiPendidikan2 = "Hj. Djaliah, A.Ma"; + Map dataPendidikan = {}; + int dataPendidikanLength = 0; - String seksiKesehatan = "Haerul, SKM"; - String seksiKebersihan = "Bd. Lina Sutomo"; + Map dataKebersihan = {}; + int dataKebersihanLength = 0; - String seksiKeterampilan1 = "Yuslihudriani, S.Pd"; + Map dataKesehatan = {}; + int dataKesehatanLength = 0; - String seksiSaranaPrasarana1 = "Muh.Adham, ST"; + Map dataKeterampilan = {}; + int dataKeterampilanLength = 0; - String seksiKonsumsi1 = "Fatmawati"; - String seksiKonsumsi2 = "Rasnaya"; + Map dataSaranaDanPrasarana = {}; + int dataSaranaDanPrasaranaLength = 0; - String seksiKeamanan1 = "Firdaus"; - String seksiKeamanan2 = "Ahmad"; + Map dataKonsumsi = {}; + int dataKonsumsiLength = 0; - String seksiGedung1 = "Dra. Bangsuari"; - String seksiGedung2 = "Hidayani"; - String seksiGedung3 = "Dahang. S,Ag"; - String seksiGedung4 = "Saharia"; + Map dataKeamanan = {}; + int dataKeamananLength = 0; - String seksiWisma1 = "Drs. Muh, Yasmin"; - String seksiWisma2 = "Hj. Hadilah"; - String seksiWisma3 = "Muh.Adham, ST"; - String seksiWisma4 = "Ahmad"; - String seksiWisma5 = "Dahang, S.Ag"; + Map dataGedung = {}; + int dataGedungLength = 0; - String kelompokPutri1 = "St. Khadijah"; - String kelompokPutri2 = "St. Aisyah"; - String kelompokPutri3 = "St. Fatimah"; + Map dataWisma = {}; + int dataWismaLength = 0; - String kelompokPutra1 = "Ahmad Dahlan"; - String kelompokPutra2 = "Ar. Fahruddin"; - String kelompokPutra3 = "Amin Rais"; + Map dataKelompokPutra = {}; + int dataKelompokPutraLength = 0; - Future init() async {} + Map dataKelompokPutri = {}; + int dataKelompokPutriLength = 0; + + Future init() async { + getData('Ketua', false, null); + getData('Sekretaris', false, null); + getData('Bendahara', false, null); + getData('Seksi Pengasuh', true, dataPengasuhLength); + getData('Seksi Ibadah', true, dataIbadahLength); + getData('Seksi Pendidikan', true, dataPendidikanLength); + getData('Seksi Kebersihan', true, dataKebersihanLength); + getData('Seksi Kesehatan', true, dataKesehatanLength); + getData('Seksi Keterampilan', true, dataKeterampilanLength); + getData('Sarana dan Prasarana', true, dataSaranaDanPrasaranaLength); + getData('Seksi Konsumsi', true, dataKonsumsiLength); + getData('Seksi Keamanan', true, dataKeamananLength); + getData('Seksi Gedung', true, dataGedungLength); + getData('Seksi Wisma', true, dataWismaLength); + getData('Kelompok Putra', true, dataKelompokPutraLength); + getData('Kelompok Putri', true, dataKelompokPutriLength); + } + + getData(String jabatan, bool stat, int? length) async { + easyLoading.customLoading('Loading Data'); + setBusy(true); + + try { + var response = await _httpService.get('jabatan?jabatan=$jabatan'); + // log.i(response.data); + if (response.data['data'].length == 0) return; + Map data = {}; + if (!stat) { + var datanya = response.data['data'][0]; + data['nama'] = datanya['nama']; + data['img_url'] = datanya['img_url']; + // log.i(data); + // return; + } else { + var datanya = response.data['data']; + length = datanya.length; + for (var i = 0; i < datanya.length; i++) { + data['nama$i'] = datanya[i]['nama']; + data['img_url$i'] = datanya[i]['img_url']; + } + } + + if (jabatan == 'Ketua') { + dataKetua = data; + } else if (jabatan == 'Sekretaris') { + dataSekretaris = data; + } else if (jabatan == 'Bendahara') { + dataBendahara = data; + } else if (jabatan == 'Seksi Pengasuh') { + dataPengasuh = data; + dataPengasuhLength = length!; + } else if (jabatan == 'Seksi Ibadah') { + dataIbadah = data; + dataIbadahLength = length!; + } else if (jabatan == 'Seksi Pendidikan') { + dataPendidikan = data; + dataPendidikanLength = length!; + } else if (jabatan == 'Seksi Kebersihan') { + dataKebersihan = data; + dataKebersihanLength = length!; + } else if (jabatan == 'Seksi Kesehatan') { + dataKesehatan = data; + dataKesehatanLength = length!; + } else if (jabatan == 'Seksi Keterampilan') { + dataKeterampilan = data; + dataKeterampilanLength = length!; + } else if (jabatan == 'Sarana dan Prasarana') { + dataSaranaDanPrasarana = data; + dataSaranaDanPrasaranaLength = length!; + } else if (jabatan == 'Seksi Konsumsi') { + dataKonsumsi = data; + dataKonsumsiLength = length!; + } else if (jabatan == 'Seksi Keamanan') { + dataKeamanan = data; + dataKeamananLength = length!; + } else if (jabatan == 'Seksi Gedung') { + dataGedung = data; + dataGedungLength = length!; + } else if (jabatan == 'Seksi Wisma') { + dataWisma = data; + dataWismaLength = length!; + } else if (jabatan == 'Kelompok Putra') { + dataKelompokPutra = data; + dataKelompokPutraLength = length!; + } else if (jabatan == 'Kelompok Putri') { + dataKelompokPutri = data; + dataKelompokPutriLength = length!; + } + } catch (e) { + log.e(e); + } finally { + notifyListeners(); + setBusy(false); + easyLoading.dismissLoading(); + } + } void editData(String jabatan, bool bool) { var res = dialogService.showCustomDialog( @@ -66,6 +160,9 @@ class StrukturOrganisasiViewModel extends CustomBaseViewModel { }, ); - res; + res.whenComplete(() async => { + // await Future.delayed(Duration(seconds: 1)), + init(), + }); } } diff --git a/lib/ui/views/tambah_dana_sosial/tambah_dana_sosial_view.dart b/lib/ui/views/tambah_dana_sosial/tambah_dana_sosial_view.dart index 3c3987f..7946892 100644 --- a/lib/ui/views/tambah_dana_sosial/tambah_dana_sosial_view.dart +++ b/lib/ui/views/tambah_dana_sosial/tambah_dana_sosial_view.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:panti_asuhan/app/themes/app_colors.dart'; -import 'package:panti_asuhan/app/themes/app_text.dart'; -import 'package:panti_asuhan/ui/widgets/my_button.dart'; -import 'package:panti_asuhan/ui/widgets/my_textformfield.dart'; import 'package:stacked/stacked.dart'; import 'package:validatorless/validatorless.dart'; +import '../../../app/themes/app_colors.dart'; +import '../../../app/themes/app_text.dart'; +import '../../widgets/my_button.dart'; +import '../../widgets/my_textformfield.dart'; import './tambah_dana_sosial_view_model.dart'; class TambahDanaSosialView extends StatelessWidget { @@ -46,19 +46,66 @@ class TambahDanaSosialView extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - "Nama Donator", + "Bentuk Donasi", style: regularTextStyle.copyWith(color: mainColor), ), - MyTextFormField( - hintText: "Nama Donatur", - controller: model.namaController, - maxLines: 1, - validator: Validatorless.required( - 'Nama Donatur tidak boleh kosong'), + Container( + width: double.infinity, + height: 60, + padding: const EdgeInsets.symmetric(horizontal: 10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(25), + border: Border.all( + color: mainColor, + ), + ), + child: DropdownButtonHideUnderline( + child: DropdownButton( + value: model.bentukDonasi, + onChanged: (String? newValue) { + // model.setSelectedbentukDonasi(newValue!); + model.log.i(newValue); + model.bentukDonasi = newValue!; + model.notifyListeners(); + }, + items: model.bentukDonasiList.map((String value) { + return DropdownMenuItem( + value: value, + child: Text( + value, + style: regularTextStyle.copyWith( + fontSize: 16, + ), + ), + ); + }).toList(), + ), + ), ), const SizedBox(height: 20), + Visibility( + visible: model.bentukDonasi == 'Pemasukan', + child: Text( + "Nama Donator", + style: regularTextStyle.copyWith(color: mainColor), + ), + ), + Visibility( + visible: model.bentukDonasi == 'Pemasukan', + child: MyTextFormField( + hintText: "Nama Donatur", + controller: model.namaController, + maxLines: 1, + // validator: Validatorless.required( + // 'Nama Donatur tidak boleh kosong'), + ), + ), + Visibility( + visible: model.bentukDonasi == 'Pemasukan', + child: const SizedBox(height: 20), + ), Text( - "Jenis Donasi", + "Jenis Donasi / Pengeluaran", style: regularTextStyle.copyWith(color: mainColor), ), Container( diff --git a/lib/ui/views/tambah_dana_sosial/tambah_dana_sosial_view_model.dart b/lib/ui/views/tambah_dana_sosial/tambah_dana_sosial_view_model.dart index d8707b5..a8bca20 100644 --- a/lib/ui/views/tambah_dana_sosial/tambah_dana_sosial_view_model.dart +++ b/lib/ui/views/tambah_dana_sosial/tambah_dana_sosial_view_model.dart @@ -13,6 +13,9 @@ class TambahDanaSosialViewModel extends CustomBaseViewModel { final _httpService = locator(); final easyLoading = locator(); + String bentukDonasi = 'Pemasukan'; + List bentukDonasiList = ['Pemasukan', 'Pengeluaran']; + String jenisDonasi = 'Uang'; List jenisDonasiList = ['Uang', 'Barang']; @@ -45,6 +48,7 @@ class TambahDanaSosialViewModel extends CustomBaseViewModel { easyLoading.customLoading('Menambahkan data...'); try { var formData = FormData.fromMap({ + 'bentuk': bentukDonasi, 'nama': namaController.text, 'jumlah': jumlahController.text, 'tanggal': tanggalController.text,