diff --git a/lib/model/area_model.dart b/lib/model/area_model.dart index 94c5f76..ba3731c 100644 --- a/lib/model/area_model.dart +++ b/lib/model/area_model.dart @@ -1,14 +1,14 @@ -class AreaListModel { - List? area; +class KecamatanDetail { + List? kecamatan; int? jumlah; - AreaListModel({this.area, this.jumlah}); + KecamatanDetail({this.kecamatan, this.jumlah}); - AreaListModel.fromJson(Map json) { - if (json['area'] != null) { - area = []; - json['area'].forEach((v) { - area!.add(AreaModel.fromJson(v)); + KecamatanDetail.fromJson(Map json) { + if (json['kecamatan'] != null) { + kecamatan = []; + json['kecamatan'].forEach((v) { + kecamatan!.add(KecamatanModel.fromJson(v)); }); } jumlah = json['jumlah']; @@ -16,29 +16,77 @@ class AreaListModel { Map toJson() { final Map data = {}; - if (area != null) { - data['area'] = area!.map((v) => v.toJson()).toList(); + if (kecamatan != null) { + data['kecamatan'] = kecamatan!.map((v) => v.toJson()).toList(); } data['jumlah'] = jumlah; return data; } } -class AreaModel { - int? idArea; - String? namaArea; +class KecamatanModel { + String? kecamatanId; + String? name; - AreaModel({this.idArea, this.namaArea}); + KecamatanModel({this.kecamatanId, this.name}); - AreaModel.fromJson(Map json) { - idArea = json['id_area']; - namaArea = json['nama_area']; + KecamatanModel.fromJson(Map json) { + kecamatanId = json['kecamatan_id']; + name = json['name']; } Map toJson() { final Map data = {}; - data['id_area'] = idArea; - data['nama_area'] = namaArea; + data['kecamatan_id'] = kecamatanId; + data['name'] = name; + return data; + } +} + +class KelurahanDetail { + List? kelurahan; + int? jumlah; + + KelurahanDetail({this.kelurahan, this.jumlah}); + + KelurahanDetail.fromJson(Map json) { + if (json['kelurahan'] != null) { + kelurahan = []; + json['kelurahan'].forEach((v) { + kelurahan!.add(KelurahanModel.fromJson(v)); + }); + } + jumlah = json['jumlah']; + } + + Map toJson() { + final Map data = {}; + if (kelurahan != null) { + data['kelurahan'] = kelurahan!.map((v) => v.toJson()).toList(); + } + data['jumlah'] = jumlah; + return data; + } +} + +class KelurahanModel { + String? kelurahanId; + String? kecamatanId; + String? name; + + KelurahanModel({this.kelurahanId, this.kecamatanId, this.name}); + + KelurahanModel.fromJson(Map json) { + kelurahanId = json['kelurahan_id']; + kecamatanId = json['kecamatan_id']; + name = json['name']; + } + + Map toJson() { + final Map data = {}; + data['kelurahan_id'] = kelurahanId; + data['kecamatan_id'] = kecamatanId; + data['name'] = name; return data; } } diff --git a/lib/model/pemilih_model.dart b/lib/model/pemilih_model.dart index 25644a5..b06cbfe 100644 --- a/lib/model/pemilih_model.dart +++ b/lib/model/pemilih_model.dart @@ -1,13 +1,13 @@ import '../app/app.locator.dart'; import '../services/other_function.dart'; -class PemilihDetailModel { +class PemilihDetail { List? pemilihModel; int? jumlah; - PemilihDetailModel({this.pemilihModel, this.jumlah}); + PemilihDetail({this.pemilihModel, this.jumlah}); - PemilihDetailModel.fromJson(Map json) { + PemilihDetail.fromJson(Map json) { if (json['data'] != null) { pemilihModel = []; json['data'].forEach((v) { @@ -36,7 +36,9 @@ class PemilihModel { String? nikTimSurvei; String? namaTimSurvei; String? namaCaleg; - String? namaArea; + String? kecamatan; + String? kelurahan; + int? tps; String? createdAt; PemilihModel( @@ -46,7 +48,9 @@ class PemilihModel { this.nikTimSurvei, this.namaTimSurvei, this.namaCaleg, - this.namaArea, + this.kecamatan, + this.kelurahan, + this.tps, this.createdAt}); PemilihModel.fromJson(Map json) { @@ -56,7 +60,9 @@ class PemilihModel { nikTimSurvei = json['nik_tim_survei']; namaTimSurvei = json['nama_tim_survei']; namaCaleg = json['nama_caleg']; - namaArea = json['nama_area']; + kecamatan = json['kecamatan']; + kelurahan = json['kelurahan']; + tps = json['tps']; createdAt = myFunction.convertDateTime(json['created_at']); } @@ -68,7 +74,9 @@ class PemilihModel { data['nik_tim_survei'] = nikTimSurvei; data['nama_tim_survei'] = namaTimSurvei; data['nama_caleg'] = namaCaleg; - data['nama_area'] = namaArea; + data['kecamatan'] = kecamatan; + data['kelurahan'] = kelurahan; + data['tps'] = tps; data['created_at'] = createdAt; return data; } diff --git a/lib/ui/views/caleg_index_tracking/area_tps/area_tps_view.dart b/lib/ui/views/caleg_index_tracking/area_tps/area_tps_view.dart index 20d4353..0539a60 100644 --- a/lib/ui/views/caleg_index_tracking/area_tps/area_tps_view.dart +++ b/lib/ui/views/caleg_index_tracking/area_tps/area_tps_view.dart @@ -47,7 +47,7 @@ class AreaTpsView extends StatelessWidget { child: Row( children: [ Text( - "Jumlah Area TPS : ", + "Jumlah Kecamatan : ", style: italicTextStyle.copyWith( fontSize: 16, fontWeight: FontWeight.bold, @@ -56,7 +56,7 @@ class AreaTpsView extends StatelessWidget { const SizedBox(width: 10), Expanded( child: Text( - '${model.jumlahArea} TPS', + '${model.jumlahArea} Kecamatan', style: boldTextStyle.copyWith( fontSize: 16, fontWeight: FontWeight.bold, @@ -110,7 +110,7 @@ class AreaTpsView extends StatelessWidget { child: ListTile( leading: Text('${i + 1}'), title: Text( - '${model.listAreaModel[i].namaArea}'), + '${model.listKecamatanModel[i].name}'), trailing: IconButton( // trash bin icon icon: const Icon( @@ -118,8 +118,8 @@ class AreaTpsView extends StatelessWidget { color: mainColor, ), onPressed: () { - model.cekSuara( - model.listAreaModel[i]); + model.cekSuara(model + .listKecamatanModel[i]); }, ), ), diff --git a/lib/ui/views/caleg_index_tracking/area_tps/area_tps_view_model.dart b/lib/ui/views/caleg_index_tracking/area_tps/area_tps_view_model.dart index cd7974d..0bc1b99 100644 --- a/lib/ui/views/caleg_index_tracking/area_tps/area_tps_view_model.dart +++ b/lib/ui/views/caleg_index_tracking/area_tps/area_tps_view_model.dart @@ -7,7 +7,7 @@ import '../../../../model/my_response.model.dart'; class AreaTpsViewModel extends CustomBaseViewModel { final log = getLogger('AreaTpsViewModel'); - List listAreaModel = []; + List listKecamatanModel = []; int jumlahArea = 0; bool status = false; @@ -23,12 +23,14 @@ class AreaTpsViewModel extends CustomBaseViewModel { try { var response = await httpService.get('/area/cek_area_caleg/$idCaleg'); MyResponseModel myResponseModel = MyResponseModel.fromJson(response.data); - AreaListModel areaListModel = - AreaListModel.fromJson(myResponseModel.data); - listAreaModel = areaListModel.area ?? []; - log.i('listAreaModel: $listAreaModel'); - jumlahArea = listAreaModel.length; - log.i('jumlahArea: $jumlahArea'); + // log.i('myResponseModel: ${myResponseModel.data}'); + KecamatanDetail kecamatanDetail = + KecamatanDetail.fromJson(myResponseModel.data); + // log.i('kecamatanDetail: ${kecamatanDetail.kecamatan}'); + listKecamatanModel = kecamatanDetail.kecamatan ?? []; + + jumlahArea = kecamatanDetail.jumlah!; + // log.i('jumlahArea: $jumlahArea'); status = true; } catch (e) { log.e(e.toString()); @@ -38,13 +40,13 @@ class AreaTpsViewModel extends CustomBaseViewModel { } } - cekSuara(AreaModel areaModel) async { + cekSuara(KecamatanModel kecamatanModel) async { await bottomSheetService.showCustomSheet( - data: areaModel.idArea, + data: kecamatanModel.kecamatanId, barrierDismissible: true, isScrollControlled: true, - title: 'Detail Suara Area ${areaModel.namaArea}', - description: 'Tim Survei', + title: 'Detail Suara Kecamatan ${kecamatanModel.name}', + description: 'Kecamatan', ignoreSafeArea: false, variant: BottomSheetType.detailSuaraBottomSheetView, ); diff --git a/lib/ui/views/caleg_index_tracking/log_suara/log_suara_view.dart b/lib/ui/views/caleg_index_tracking/log_suara/log_suara_view.dart index 97e9b8f..0b50eb8 100644 --- a/lib/ui/views/caleg_index_tracking/log_suara/log_suara_view.dart +++ b/lib/ui/views/caleg_index_tracking/log_suara/log_suara_view.dart @@ -111,8 +111,27 @@ class LogSuaraView extends StatelessWidget { model.listPemilih[i].namaPemilih!, style: boldTextStyle, ), - subtitle: Text( - model.listPemilih[i].namaArea!, + subtitle: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + CardWidget( + title: 'Tim', + value: model.listPemilih[i] + .namaTimSurvei!), + CardWidget( + title: 'Kec', + value: model + .listPemilih[i].kecamatan!), + CardWidget( + title: 'Kel / Desa', + value: model + .listPemilih[i].kelurahan!), + CardWidget( + title: 'TPS', + value: model.listPemilih[i].tps! + .toString()), + ], ), trailing: IconButton( icon: const Icon( @@ -159,3 +178,48 @@ class LogSuaraView extends StatelessWidget { ); } } + +class CardWidget extends StatelessWidget { + const CardWidget({ + super.key, + required this.title, + required this.value, + }); + + final String title; + final String value; + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + flex: 3, + child: Text( + title, + style: italicTextStyle.copyWith( + fontSize: 12, + ), + overflow: TextOverflow.ellipsis, + ), + ), + const Expanded( + flex: 1, + child: Text( + ' : ', + ), + ), + Expanded( + flex: 6, + child: Text( + value, + style: boldTextStyle.copyWith( + fontSize: 12, + ), + overflow: TextOverflow.ellipsis, + ), + ), + ], + ); + } +} diff --git a/lib/ui/views/caleg_index_tracking/log_suara/log_suara_view_model.dart b/lib/ui/views/caleg_index_tracking/log_suara/log_suara_view_model.dart index ce2f1e9..9fdc9b6 100644 --- a/lib/ui/views/caleg_index_tracking/log_suara/log_suara_view_model.dart +++ b/lib/ui/views/caleg_index_tracking/log_suara/log_suara_view_model.dart @@ -22,9 +22,9 @@ class LogSuaraViewModel extends CustomBaseViewModel { try { var response = await httpService.get('caleg/suara/$idCaleg'); MyResponseModel myResponseModel = MyResponseModel.fromJson(response.data); - PemilihDetailModel pemilihDetailModel = - PemilihDetailModel.fromJson(myResponseModel.data); - listPemilih = pemilihDetailModel.pemilihModel!; + PemilihDetail pemilihDetail = + PemilihDetail.fromJson(myResponseModel.data); + listPemilih = pemilihDetail.pemilihModel!; counter = listPemilih.length; status = true; diff --git a/lib/ui/views/caleg_index_tracking/pengaturan_caleg/pengaturan_caleg_view.dart b/lib/ui/views/caleg_index_tracking/pengaturan_caleg/pengaturan_caleg_view.dart index acedf68..920409e 100644 --- a/lib/ui/views/caleg_index_tracking/pengaturan_caleg/pengaturan_caleg_view.dart +++ b/lib/ui/views/caleg_index_tracking/pengaturan_caleg/pengaturan_caleg_view.dart @@ -46,12 +46,12 @@ class PengaturanCalegView extends StatelessWidget { background: warningColor, ), const SizedBox(height: 10), - TopContainer( - title: 'Area\nTPS', - value: '${model.suaraCounter} TPS', - icon: Icons.location_on_outlined, - background: orangeColor, - ), + // TopContainer( + // title: 'Area\nTPS', + // value: '${model.suaraCounter} TPS', + // icon: Icons.location_on_outlined, + // background: orangeColor, + // ), const SizedBox(height: 10), TopContainer( title: 'Jumlah Tim Survei', diff --git a/lib/ui/views/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view.dart b/lib/ui/views/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view.dart index 55fca0d..9f45a7e 100644 --- a/lib/ui/views/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view.dart +++ b/lib/ui/views/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:stacked/stacked.dart'; import 'package:stacked_services/stacked_services.dart'; -import '../../../app/themes/app_colors.dart'; -import '../../../app/themes/app_text.dart'; +import '../../../../app/themes/app_colors.dart'; +import '../../../../app/themes/app_text.dart'; import './detail_suara_bottom_sheet_view_model.dart'; class DetailSuaraBottomSheetView extends StatelessWidget { @@ -88,13 +88,22 @@ class DetailSuaraBottomSheetView extends StatelessWidget { CrossAxisAlignment.start, children: [ if (request!.description == 'Caleg') - Text( - model.listPemilih[i].namaTimSurvei!, - style: italicTextStyle, - ), - Text( - model.listPemilih[i].namaArea!, - ), + CardWidget( + title: 'Tim', + value: model + .listPemilih[i].namaTimSurvei!), + CardWidget( + title: 'Kec', + value: + model.listPemilih[i].kecamatan!), + CardWidget( + title: 'Kel / Desa', + value: + model.listPemilih[i].kelurahan!), + CardWidget( + title: 'TPS', + value: model.listPemilih[i].tps! + .toString()), ], ), trailing: IconButton( @@ -139,3 +148,48 @@ class DetailSuaraBottomSheetView extends StatelessWidget { ); } } + +class CardWidget extends StatelessWidget { + const CardWidget({ + super.key, + required this.title, + required this.value, + }); + + final String title; + final String value; + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + flex: 3, + child: Text( + title, + style: italicTextStyle.copyWith( + fontSize: 12, + ), + overflow: TextOverflow.ellipsis, + ), + ), + const Expanded( + flex: 1, + child: Text( + ' : ', + ), + ), + Expanded( + flex: 6, + child: Text( + value, + style: boldTextStyle.copyWith( + fontSize: 12, + ), + overflow: TextOverflow.ellipsis, + ), + ), + ], + ); + } +} diff --git a/lib/ui/views/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view_model.dart b/lib/ui/views/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view_model.dart index 87c77c2..f892364 100644 --- a/lib/ui/views/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view_model.dart +++ b/lib/ui/views/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view_model.dart @@ -29,11 +29,11 @@ class DetailSuaraBottomSheetViewModel extends CustomBaseViewModel { var response = await httpService.get(url); MyResponseModel myResponseModel = MyResponseModel.fromJson(response.data); - PemilihDetailModel pemilihDetailModel = - PemilihDetailModel.fromJson(myResponseModel.data); + PemilihDetail pemilihDetail = + PemilihDetail.fromJson(myResponseModel.data); - listPemilih = pemilihDetailModel.pemilihModel!; - counter = pemilihDetailModel.jumlah!; + listPemilih = pemilihDetail.pemilihModel!; + counter = pemilihDetail.jumlah!; this.status = true; } catch (e) { this.status = false; diff --git a/lib/ui/views/detail_suara_pemilih_bottom_sheet/detail_suara_pemilih_bottom_sheet_view.dart b/lib/ui/views/detail_suara_pemilih_bottom_sheet/detail_suara_pemilih_bottom_sheet_view.dart index 42439ac..bda790d 100644 --- a/lib/ui/views/detail_suara_pemilih_bottom_sheet/detail_suara_pemilih_bottom_sheet_view.dart +++ b/lib/ui/views/detail_suara_pemilih_bottom_sheet/detail_suara_pemilih_bottom_sheet_view.dart @@ -41,69 +41,83 @@ class DetailSuaraPemilihBottomSheetView extends StatelessWidget { topRight: Radius.circular(16.0), ), ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - request.title!, - style: boldTextStyle.copyWith( - fontSize: 16, - color: fontColor, + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + request.title!, + style: boldTextStyle.copyWith( + fontSize: 16, + color: fontColor, + ), ), - ), - const SizedBox(height: 15), - Container( - height: 100, - width: 150, - decoration: BoxDecoration( - color: mainColor, - borderRadius: BorderRadius.circular(10), - ), - child: GestureDetector( - onTap: () { - model.showImage( - context, - dotenv.env['url']! + request.data!.img!, - ); - }, - child: ClipRRect( + const SizedBox(height: 15), + Container( + height: 100, + width: 150, + decoration: BoxDecoration( + color: mainColor, borderRadius: BorderRadius.circular(10), - child: Image.network( - dotenv.env['url']! + request.data!.img!, - fit: BoxFit.fill, - errorBuilder: (context, error, stackTrace) { - return const Center( - child: Icon( - Icons.error, - color: backgroundColor, - size: 50, - ), - ); - }, + ), + child: GestureDetector( + onTap: () { + model.showImage( + context, + dotenv.env['url']! + request.data!.img!, + ); + }, + child: ClipRRect( + borderRadius: BorderRadius.circular(10), + child: Image.network( + dotenv.env['url']! + request.data!.img!, + fit: BoxFit.fill, + errorBuilder: (context, error, stackTrace) { + return const Center( + child: Icon( + Icons.error, + color: backgroundColor, + size: 50, + ), + ); + }, + ), ), ), ), - ), - _DetailChildWidget( - title: 'Nama', - value: request.data!.namaPemilih!, - ), - _DetailChildWidget( - title: 'No KTP /\nNo HP', - value: request.data!.nikNomorHp!, - ), - _DetailChildWidget( - title: 'Tanggal/\nWaktu', - value: model.myFunction - .convertDateTime2(request.data!.createdAt!), - ), - _DetailChildWidget( - title: 'Caleg', value: request.data!.namaCaleg!), - _DetailChildWidget( - title: 'Tim Survei', - value: request.data!.namaTimSurvei!, - ), - ], + _DetailChildWidget( + title: 'Nama', + value: request.data!.namaPemilih!, + ), + _DetailChildWidget( + title: 'No KTP /\nNo HP', + value: request.data!.nikNomorHp!, + ), + _DetailChildWidget( + title: 'Tanggal/\nWaktu', + value: model.myFunction + .convertDateTime2(request.data!.createdAt!), + ), + _DetailChildWidget( + title: 'Caleg', value: request.data!.namaCaleg!), + _DetailChildWidget( + title: 'Tim Survei', + value: request.data!.namaTimSurvei!, + ), + _DetailChildWidget( + title: 'Kecamatan', + value: request.data!.kecamatan!, + ), + _DetailChildWidget( + title: 'Kelurahan', + value: request.data!.kelurahan!, + ), + _DetailChildWidget( + title: 'TPS', + value: request.data!.tps!.toString(), + ), + ], + ), ), ), ); diff --git a/lib/ui/views/login_screen/login_screen_view_model.dart b/lib/ui/views/login_screen/login_screen_view_model.dart index d743115..586926e 100644 --- a/lib/ui/views/login_screen/login_screen_view_model.dart +++ b/lib/ui/views/login_screen/login_screen_view_model.dart @@ -25,15 +25,21 @@ class LoginScreenViewModel extends CustomBaseViewModel { globalVar.backPressed = 'cantBack'; try { + // log.i('username: ${usernameController.text}'); + // log.i('password: ${passwordController.text}'); var formData = FormData.fromMap({ 'username': usernameController.text, 'password': passwordController.text, }); + // log.i('formData: $formData'); var response = await httpService.postWithFormData('login/caleg', formData); + // log.i('response: ${response.data}'); + MyResponseModel myResponseModel = MyResponseModel.fromJson(response.data); var data = myResponseModel.data; + // log.i('data: $data'); CalegModel calegModel = CalegModel.fromJson(data); // log.i('calegModel: ${calegModel.toJson()}'); await mySharedPrefs.setString('id', calegModel.idCaleg!.toString());