From 5e408f508573e731bb3f333c734c2ab734da8435 Mon Sep 17 00:00:00 2001 From: cyzoox Date: Mon, 18 Sep 2023 14:14:53 +0800 Subject: [PATCH] Added edit feature on land faas --- .../additional_item/additional_item_bloc.dart | 25 +- .../property_appraisal_bloc.dart | 21 +- .../property_appraisal_state.dart | 4 + .../property_info/property_info_bloc.dart | 6 + .../land_boundaries_edit_bloc.dart | 54 + .../land_boundaries_edit_event.dart | 41 + .../land_boundaries_edit_state.dart | 28 + .../land_location_edit_bloc.dart | 59 + .../land_location_edit_event.dart | 39 + .../land_location_edit_state.dart | 28 + .../land_property_owner_info_bloc.dart | 33 +- .../land_property_owner_info_event.dart | 12 + .../land_property_owner_info_state.dart | 8 - lib/screens/passo/Building/add_building.dart | 10 +- .../AddExtraItems.dart | 83 +- .../additional_items.dart | 470 ++++--- .../bldg_location_landref.dart | 485 ++++--- .../property_assessment.dart | 128 +- .../structural_materials.dart | 714 +++++------ .../edit_building/general_description.dart | 10 +- .../edit_building/property_appraisal.dart | 1136 ++++++++--------- .../passo/Land/add_land/AddLandAppraisal.dart | 3 +- .../passo/Land/add_land/land_appraisal.dart | 4 +- .../add_land/location_and_boundaries.dart | 9 +- .../Land/add_land/property_owner_info.dart | 40 - lib/screens/passo/Land/edit_land.dart | 128 ++ .../passo/Land/edit_land/land_appraisal.dart | 262 ++++ .../location_and_boundaries_edit.dart | 266 ++++ .../edit_land/other_improvements_edit.dart | 263 ++++ .../property_assessment_cont_edit.dart | 541 ++++++++ .../edit_land/property_assessment_edit.dart | 245 ++++ .../edit_land/property_owner_info_edit.dart | 223 ++++ .../edit_land/value_adjustments_edit.dart | 246 ++++ lib/screens/passo/land_home .dart | 144 ++- lib/sevices/passo/land/land_boundaries.dart | 53 + lib/sevices/passo/land/land_location.dart | 53 + .../passo/land/land_property_owner.dart | 20 + 37 files changed, 4259 insertions(+), 1635 deletions(-) create mode 100644 lib/bloc/passo/land/land_boundaries_edit/land_boundaries_edit_bloc.dart create mode 100644 lib/bloc/passo/land/land_boundaries_edit/land_boundaries_edit_event.dart create mode 100644 lib/bloc/passo/land/land_boundaries_edit/land_boundaries_edit_state.dart create mode 100644 lib/bloc/passo/land/land_location_edit/land_location_edit_bloc.dart create mode 100644 lib/bloc/passo/land/land_location_edit/land_location_edit_event.dart create mode 100644 lib/bloc/passo/land/land_location_edit/land_location_edit_state.dart create mode 100644 lib/screens/passo/Land/edit_land.dart create mode 100644 lib/screens/passo/Land/edit_land/land_appraisal.dart create mode 100644 lib/screens/passo/Land/edit_land/location_and_boundaries_edit.dart create mode 100644 lib/screens/passo/Land/edit_land/other_improvements_edit.dart create mode 100644 lib/screens/passo/Land/edit_land/property_assessment_cont_edit.dart create mode 100644 lib/screens/passo/Land/edit_land/property_assessment_edit.dart create mode 100644 lib/screens/passo/Land/edit_land/property_owner_info_edit.dart create mode 100644 lib/screens/passo/Land/edit_land/value_adjustments_edit.dart diff --git a/lib/bloc/passo/bulding/additional_item/additional_item_bloc.dart b/lib/bloc/passo/bulding/additional_item/additional_item_bloc.dart index 167c65e..2d77bc3 100644 --- a/lib/bloc/passo/bulding/additional_item/additional_item_bloc.dart +++ b/lib/bloc/passo/bulding/additional_item/additional_item_bloc.dart @@ -27,18 +27,23 @@ class AdditionalItemBloc } }); on((event, emit) async { - http.Response response = - (await AdditionalItemsServices.instance.add(event.items))!; - print(response.body); + emit(AdditionalItemsLoading()); + try { + http.Response response = + (await AdditionalItemsServices.instance.add(event.items))!; + print(response.body); - if (response.statusCode == 201) { - var jsonResponse = jsonDecode(response.body); - AdditionalItems newAdditional = - AdditionalItems.fromJson(jsonResponse['data']); - print(jsonResponse['data']); - globalAdditionalItems.add(newAdditional); + if (response.statusCode == 201) { + var jsonResponse = jsonDecode(response.body); + AdditionalItems newAdditional = + AdditionalItems.fromJson(jsonResponse['data']); + print(jsonResponse['data']); + globalAdditionalItems.add(newAdditional); - emit(AdditionalItemsLoaded(globalAdditionalItems)); + emit(AdditionalItemsLoaded(globalAdditionalItems)); + } + } catch (e) { + emit(AdditionalItemsErrorState(e.toString())); } }); on((event, emit) async { diff --git a/lib/bloc/passo/bulding/property_appraisal/property_appraisal_bloc.dart b/lib/bloc/passo/bulding/property_appraisal/property_appraisal_bloc.dart index e7953c2..cd11afb 100644 --- a/lib/bloc/passo/bulding/property_appraisal/property_appraisal_bloc.dart +++ b/lib/bloc/passo/bulding/property_appraisal/property_appraisal_bloc.dart @@ -26,19 +26,16 @@ class PropertyAppraisalBloc }); on((event, emit) async { final tempID = await SharedPreferences.getInstance(); + emit(PropertyAppraisalLoading()); + try { + http.Response response = (await PropertyAppraisalServices.instance + .update(event.appraisal, tempID.getInt('tempid')! - 1))!; - http.Response response = (await PropertyAppraisalServices.instance - .update(event.appraisal, tempID.getInt('tempid')! - 1))!; - - if (response.statusCode == 201) { - var jsonResponse = jsonDecode(response.body); - PropertyAppraisal newAppraisal = - PropertyAppraisal.fromJson(jsonResponse['data']); - print("PA"); - print(newAppraisal); - print(response.statusCode); - - emit(PropertyAppraisalLoaded(newAppraisal)); + if (response.statusCode == 200) { + emit(ShowPropertyAppraisalSuccessAlertState()); + } + } catch (e) { + emit(ShowPropertyAppraisalErrorAlertState()); } }); } diff --git a/lib/bloc/passo/bulding/property_appraisal/property_appraisal_state.dart b/lib/bloc/passo/bulding/property_appraisal/property_appraisal_state.dart index 2010d45..6a9296b 100644 --- a/lib/bloc/passo/bulding/property_appraisal/property_appraisal_state.dart +++ b/lib/bloc/passo/bulding/property_appraisal/property_appraisal_state.dart @@ -26,3 +26,7 @@ class PropertyAppraisalErrorState extends PropertyAppraisalState { @override List get props => [error]; } + +class ShowPropertyAppraisalErrorAlertState extends PropertyAppraisalState {} + +class ShowPropertyAppraisalSuccessAlertState extends PropertyAppraisalState {} diff --git a/lib/bloc/passo/bulding/property_info/property_info_bloc.dart b/lib/bloc/passo/bulding/property_info/property_info_bloc.dart index 1df521b..fd49f51 100644 --- a/lib/bloc/passo/bulding/property_info/property_info_bloc.dart +++ b/lib/bloc/passo/bulding/property_info/property_info_bloc.dart @@ -48,6 +48,7 @@ class PropertyInfoBloc extends Bloc { } }); on(((event, emit) async { + emit(PropertyInfoLoading()); final state = this.state; try { http.Response response = (await PropertyInfoService.instance @@ -60,6 +61,7 @@ class PropertyInfoBloc extends Bloc { })); on(((event, emit) async { final state = this.state; + try { http.Response response = (await PropertyInfoService.instance .updateBldg(event.bldg_loc, event.bldg_loc.id))!; @@ -77,6 +79,7 @@ class PropertyInfoBloc extends Bloc { on( (event, emit) async { final state = this.state; + emit(PropertyInfoLoading()); try { http.Response response = (await PropertyInfoService.instance .updateLandRef(event.land_ref, event.land_ref.id))!; @@ -95,6 +98,7 @@ class PropertyInfoBloc extends Bloc { on((event, emit) async { final state = this.state; + emit(PropertyInfoLoading()); try { http.Response response = (await PropertyInfoService.instance .updateGenDesc(event.gen_desc, event.gen_desc.id))!; @@ -112,6 +116,7 @@ class PropertyInfoBloc extends Bloc { on((event, emit) async { final state = this.state; + emit(PropertyInfoLoading()); try { final tempID = await SharedPreferences.getInstance(); print(tempID.getInt('tempid')! - 1); @@ -131,6 +136,7 @@ class PropertyInfoBloc extends Bloc { on((event, emit) async { print(event.id); + emit(PropertyInfoLoading()); http.Response response = (await PropertyInfoService.instance.remove(event.id)); print(response.statusCode); diff --git a/lib/bloc/passo/land/land_boundaries_edit/land_boundaries_edit_bloc.dart b/lib/bloc/passo/land/land_boundaries_edit/land_boundaries_edit_bloc.dart new file mode 100644 index 0000000..355a378 --- /dev/null +++ b/lib/bloc/passo/land/land_boundaries_edit/land_boundaries_edit_bloc.dart @@ -0,0 +1,54 @@ +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:unit2/model/passo/land_property_boundaries.dart'; +import 'package:http/http.dart' as http; +import 'package:unit2/sevices/passo/land/land_boundaries.dart'; +part 'land_boundaries_edit_event.dart'; +part 'land_boundaries_edit_state.dart'; + +class LandBoundariesEditBloc + extends Bloc { + LandBoundariesEditBloc() : super(LandBoundariesEditInitial()) { + on((event, emit) async { + emit(LandBoundariesEditLoading()); + try { + final tempID = await SharedPreferences.getInstance(); + + final assessments = + await LandBoundariesService.instance.fetchEdit(event.id); + + emit(LandBoundariesEditLoaded(assessments)); + } catch (e) { + emit(LandBoundariesEditErrorState(e.toString())); + } + }); + // on((event, emit) async { + // http.Response response = (await LandLocationService.instance + // .addEdit(event.land_loc_edit))!; + // print('Assessment'); + // print(response.statusCode); + // print(response.body); + // if (response.statusCode == 201) { + // var jsonResponse = jsonDecode(response.body); + // LandPropertyLoc newAssessment = + // LandPropertyLoc.fromJson(jsonResponse['data']); + + // globalLandLocationEdit = newAssessment; + + // emit(LandLocationEditLoaded(globalLandBoundariesEdit)); + // } + // }); + on((event, emit) async { + http.Response response = (await LandBoundariesService.instance + .updateEdit(event.land_boundaries_edit, event.id))!; + print('landloc edit'); + print(response.statusCode); + print(response.body); + // if (response.statusCode == 201) { + // final faas = await PropertyInfoRepository.getUsers(); + // emit(FaasLoaded(faas)); + // } + }); + } +} diff --git a/lib/bloc/passo/land/land_boundaries_edit/land_boundaries_edit_event.dart b/lib/bloc/passo/land/land_boundaries_edit/land_boundaries_edit_event.dart new file mode 100644 index 0000000..0fb96ef --- /dev/null +++ b/lib/bloc/passo/land/land_boundaries_edit/land_boundaries_edit_event.dart @@ -0,0 +1,41 @@ +part of 'land_boundaries_edit_bloc.dart'; + +class LandBoundariesEditEvent extends Equatable { + const LandBoundariesEditEvent(); + + @override + List get props => []; +} + +class LoadLandBoundariesEdit extends LandBoundariesEditEvent { + final LandPropertyBoundaries land_boundaries_edit; + final int? id; + + const LoadLandBoundariesEdit( + {required this.land_boundaries_edit, required this.id}); + + @override + List get props => [land_boundaries_edit]; +} + +class AddLandBoundariesEdit extends LandBoundariesEditEvent { + final LandPropertyBoundaries land_boundaries_edit; + + const AddLandBoundariesEdit({required this.land_boundaries_edit}); + + @override + List get props => [land_boundaries_edit]; +} + +class UpdateLandBoundariesEdit extends LandBoundariesEditEvent { + // ignore: non_constant_identifier_names + final LandPropertyBoundaries land_boundaries_edit; + final int id; + + // ignore: non_constant_identifier_names + const UpdateLandBoundariesEdit( + {required this.land_boundaries_edit, required this.id}); + + @override + List get props => [land_boundaries_edit]; +} diff --git a/lib/bloc/passo/land/land_boundaries_edit/land_boundaries_edit_state.dart b/lib/bloc/passo/land/land_boundaries_edit/land_boundaries_edit_state.dart new file mode 100644 index 0000000..2fa8ffe --- /dev/null +++ b/lib/bloc/passo/land/land_boundaries_edit/land_boundaries_edit_state.dart @@ -0,0 +1,28 @@ +part of 'land_boundaries_edit_bloc.dart'; + +class LandBoundariesEditState extends Equatable { + const LandBoundariesEditState(); + + @override + List get props => []; +} + +class LandBoundariesEditInitial extends LandBoundariesEditState {} + +class LandBoundariesEditLoading extends LandBoundariesEditState {} + +class LandBoundariesEditLoaded extends LandBoundariesEditState { + LandBoundariesEditLoaded(this.land_boundaries_edit); + final LandPropertyBoundaries land_boundaries_edit; + + @override + List get props => [land_boundaries_edit]; +} + +class LandBoundariesEditErrorState extends LandBoundariesEditState { + LandBoundariesEditErrorState(this.error); + final String error; + + @override + List get props => [error]; +} diff --git a/lib/bloc/passo/land/land_location_edit/land_location_edit_bloc.dart b/lib/bloc/passo/land/land_location_edit/land_location_edit_bloc.dart new file mode 100644 index 0000000..6b8f9ed --- /dev/null +++ b/lib/bloc/passo/land/land_location_edit/land_location_edit_bloc.dart @@ -0,0 +1,59 @@ +import 'dart:convert'; + +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:unit2/model/passo/land_property_loc.dart'; +import 'package:http/http.dart' as http; +import 'package:unit2/sevices/passo/land/land_location.dart'; +part 'land_location_edit_event.dart'; +part 'land_location_edit_state.dart'; + +class LandLocationEditBloc + extends Bloc { + LandPropertyLoc globalLandLocationEdit; + LandLocationEditBloc() + : globalLandLocationEdit = LandPropertyLoc(), + super(LandLocationEditInitial()) { + on((event, emit) async { + emit(LandLocationEditLoading()); + try { + final tempID = await SharedPreferences.getInstance(); + + final assessments = + await LandLocationService.instance.fetchEdit(event.id); + + emit(LandLocationEditLoaded(assessments)); + } catch (e) { + emit(LandLocationEditErrorState(e.toString())); + } + }); + // on((event, emit) async { + // http.Response response = (await LandLocationService.instance + // .addEdit(event.land_loc_edit))!; + // print('Assessment'); + // print(response.statusCode); + // print(response.body); + // if (response.statusCode == 201) { + // var jsonResponse = jsonDecode(response.body); + // LandPropertyLoc newAssessment = + // LandPropertyLoc.fromJson(jsonResponse['data']); + + // globalLandLocationEdit = newAssessment; + + // emit(LandLocationEditLoaded(globalLandLocationEdit)); + // } + // }); + on((event, emit) async { + http.Response response = (await LandLocationService.instance + .updateEdit(event.land_loc_edit, event.id))!; + print('landloc edit'); + print(response.statusCode); + print(response.body); + // if (response.statusCode == 201) { + // final faas = await PropertyInfoRepository.getUsers(); + // emit(FaasLoaded(faas)); + // } + }); + } +} diff --git a/lib/bloc/passo/land/land_location_edit/land_location_edit_event.dart b/lib/bloc/passo/land/land_location_edit/land_location_edit_event.dart new file mode 100644 index 0000000..bc22948 --- /dev/null +++ b/lib/bloc/passo/land/land_location_edit/land_location_edit_event.dart @@ -0,0 +1,39 @@ +part of 'land_location_edit_bloc.dart'; + +class LandLocationEditEvent extends Equatable { + const LandLocationEditEvent(); + + @override + List get props => []; +} + +class LoadLandLocationEdit extends LandLocationEditEvent { + final LandPropertyLoc land_loc_edit; + final int? id; + + const LoadLandLocationEdit({required this.land_loc_edit, required this.id}); + + @override + List get props => [land_loc_edit]; +} + +class AddLandLocationEdit extends LandLocationEditEvent { + final LandPropertyLoc land_loc_edit; + + const AddLandLocationEdit({required this.land_loc_edit}); + + @override + List get props => [land_loc_edit]; +} + +class UpdateLandLocationEdit extends LandLocationEditEvent { + // ignore: non_constant_identifier_names + final LandPropertyLoc land_loc_edit; + final int id; + + // ignore: non_constant_identifier_names + const UpdateLandLocationEdit({required this.land_loc_edit, required this.id}); + + @override + List get props => [land_loc_edit]; +} diff --git a/lib/bloc/passo/land/land_location_edit/land_location_edit_state.dart b/lib/bloc/passo/land/land_location_edit/land_location_edit_state.dart new file mode 100644 index 0000000..97564c8 --- /dev/null +++ b/lib/bloc/passo/land/land_location_edit/land_location_edit_state.dart @@ -0,0 +1,28 @@ +part of 'land_location_edit_bloc.dart'; + +class LandLocationEditState extends Equatable { + const LandLocationEditState(); + + @override + List get props => []; +} + +class LandLocationEditInitial extends LandLocationEditState {} + +class LandLocationEditLoading extends LandLocationEditState {} + +class LandLocationEditLoaded extends LandLocationEditState { + LandLocationEditLoaded(this.land_loc_edit); + final LandPropertyLoc land_loc_edit; + + @override + List get props => [land_loc_edit]; +} + +class LandLocationEditErrorState extends LandLocationEditState { + LandLocationEditErrorState(this.error); + final String error; + + @override + List get props => [error]; +} diff --git a/lib/bloc/passo/land/land_property_owner_info/land_property_owner_info_bloc.dart b/lib/bloc/passo/land/land_property_owner_info/land_property_owner_info_bloc.dart index 1abcfdc..9f9ec3f 100644 --- a/lib/bloc/passo/land/land_property_owner_info/land_property_owner_info_bloc.dart +++ b/lib/bloc/passo/land/land_property_owner_info/land_property_owner_info_bloc.dart @@ -10,6 +10,7 @@ import 'package:unit2/sevices/passo/land/land_boundaries.dart'; import 'package:unit2/sevices/passo/land/land_location.dart'; import 'package:unit2/sevices/passo/land/land_property_owner.dart'; import 'package:http/http.dart' as http; +import 'package:unit2/utils/text_container.dart'; part 'land_property_owner_info_event.dart'; part 'land_property_owner_info_state.dart'; @@ -25,33 +26,39 @@ class LandPropertyOwnerInfoBloc emit(LandErrorState(e.toString())); } }); + on((event, emit) async { http.Response response = (await LandServices.instance.add(event.land))!; if (response.statusCode == 201) { var jsonResponse = jsonDecode(response.body); - var details = jsonResponse['data']['details']; + var details = jsonResponse['data']; + print(jsonResponse); - if (details != null) { - var id = details['id']; - final tempID = await SharedPreferences.getInstance(); - print(id); - await tempID.setInt('landid', id + 1); - final faas = await LandServices.instance.fetch(); - emit(LandLoaded(faas)); - } else { - print("No 'details' object found in the response."); - // Handle the case when 'details' is missing - } + var id = details['id']; + final tempID = await SharedPreferences.getInstance(); + print(id); + await tempID.setInt('landid', id + 1); + final faas = await LandServices.instance.fetch(); + emit(LandLoaded(faas)); } }); + on((event, emit) async { + final state = this.state; + http.Response response = (await LandServices.instance + .update(event.land_edit, event.land_edit.id))!; + print('Land LOc'); + print(response.body); + }); + on((event, emit) async { final state = this.state; http.Response response = (await LandLocationService.instance .update(event.land_loc, event.land_loc.id))!; + print(event.land_loc.id!); print('Land LOc'); - print(response.body); + print(response.statusCode); }); on((event, emit) async { diff --git a/lib/bloc/passo/land/land_property_owner_info/land_property_owner_info_event.dart b/lib/bloc/passo/land/land_property_owner_info/land_property_owner_info_event.dart index c05cacf..58820b6 100644 --- a/lib/bloc/passo/land/land_property_owner_info/land_property_owner_info_event.dart +++ b/lib/bloc/passo/land/land_property_owner_info/land_property_owner_info_event.dart @@ -25,6 +25,18 @@ class AddPropertyOwnerLand extends LandPropertyOwnerInfoEvent { List get props => [land]; } +class UpdateLandPropertyOwner extends LandPropertyOwnerInfoEvent { + // ignore: non_constant_identifier_names + final LandPropertyOwner land_edit; + final int id; + + // ignore: non_constant_identifier_names + const UpdateLandPropertyOwner({required this.land_edit, required this.id}); + + @override + List get props => [land_edit]; +} + class UpdateLandLoc extends LandPropertyOwnerInfoEvent { // ignore: non_constant_identifier_names final LandPropertyLoc land_loc; diff --git a/lib/bloc/passo/land/land_property_owner_info/land_property_owner_info_state.dart b/lib/bloc/passo/land/land_property_owner_info/land_property_owner_info_state.dart index ec64d5f..a519420 100644 --- a/lib/bloc/passo/land/land_property_owner_info/land_property_owner_info_state.dart +++ b/lib/bloc/passo/land/land_property_owner_info/land_property_owner_info_state.dart @@ -17,14 +17,6 @@ class LandLoaded extends LandPropertyOwnerInfoState { List get props => [land]; } -// class PropertyAppraisalLoaded extends AssessorsState { -// PropertyAppraisalLoaded(this.appraisal); -// final List appraisal; - -// @override -// List get props => [appraisal]; -// } - class LandErrorState extends LandPropertyOwnerInfoState { const LandErrorState(this.error); final String error; diff --git a/lib/screens/passo/Building/add_building.dart b/lib/screens/passo/Building/add_building.dart index 790fc37..e87d3e9 100644 --- a/lib/screens/passo/Building/add_building.dart +++ b/lib/screens/passo/Building/add_building.dart @@ -121,20 +121,24 @@ class _AddBuilding extends State { final progress = ProgressHUD.of(context); progress?.dismiss(); } - if (state is ShowBldgLocErrorAlertState || - state is ShowGenDescErrorAlertState || + if (state is ShowGenDescErrorAlertState || state is ShowLandRefErrorAlertState || state is ShowStrucMatErrorAlertState) { + final progress = ProgressHUD.of(context); + progress?.dismiss(); Fluttertoast.showToast( msg: "Slow internet connection, please try again!"); } if (state is ShowLandRefSuccessAlertState || state is ShowGenDescSuccessAlertState || state is ShowStrucMatSuccessAlertState) { + final progress = ProgressHUD.of(context); + progress?.dismiss(); NextBtn(); } }, builder: (context, state) { - if (state is PropertyInfoLoaded || + if (state is PropertyInfoLoading || + state is PropertyInfoLoaded || state is PropertyInfoErrorState || state is ShowBldgLocErrorAlertState || state is ShowGenDescErrorAlertState || diff --git a/lib/screens/passo/Building/add_building_components/AddExtraItems.dart b/lib/screens/passo/Building/add_building_components/AddExtraItems.dart index ef4fac4..2140035 100644 --- a/lib/screens/passo/Building/add_building_components/AddExtraItems.dart +++ b/lib/screens/passo/Building/add_building_components/AddExtraItems.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; import 'package:intl/intl.dart'; import 'package:searchfield/searchfield.dart'; @@ -500,48 +501,56 @@ class _AddExtraItems extends State { padding: const EdgeInsets.all(8.0), child: ElevatedButton( onPressed: () async { - final tempID = - await SharedPreferences.getInstance(); - var itemss = AdditionalItems( - id: 1, - bldgapprDetailsId: - tempID.getInt('tempid')! - 1, - classId: _classId, - className: _className, - structType: _structureType, - unitValue: - _withoutBUCC == true ? 0 : _unitValue, - baseUnitValue: _unitBase, - area: _areaValue, - marketValue: - (_unitValue * _unitBase) * _areaValue, - depreciationRate: _depValue, - adjustedMarketVal: _totalMarketValue( + try { + final tempID = + await SharedPreferences.getInstance(); + var itemss = AdditionalItems( + id: 1, + bldgapprDetailsId: + tempID.getInt('tempid')! - 1, + classId: _classId, + className: _className, + structType: _structureType, + unitValue: _withoutBUCC == true + ? 0 + : _unitValue, + baseUnitValue: _unitBase, + area: _areaValue, + marketValue: (_unitValue * _unitBase) * + _areaValue, + depreciationRate: _depValue, + adjustedMarketVal: _totalMarketValue( + _unitValue, + _unitBase, + _areaValue, + _depValue, + _withoutBUCC, + _className, + isPainted, + isSecondHand, + _notPaintedUnitVal, + _secondHandUnitVal), + actualUse: 'Test', + amtDepreciation: _amountofDepreciation( _unitValue, _unitBase, _areaValue, _depValue, - _withoutBUCC, - _className, - isPainted, - isSecondHand, - _notPaintedUnitVal, - _secondHandUnitVal), - actualUse: 'Test', - amtDepreciation: _amountofDepreciation( - _unitValue, - _unitBase, - _areaValue, - _depValue, - ), - painted: true, - secondhand: true, - paintedUnitval: '1', - secondhandUnitval: '1'); + ), + painted: true, + secondhand: true, + paintedUnitval: '1', + secondhandUnitval: '1'); - context - .read() - .add(AddAdditionalItems(items: itemss)); + context + .read() + .add(AddAdditionalItems(items: itemss)); + } catch (e) { + Fluttertoast.showToast( + msg: + "Slow internet connection, please try again!", + ); + } }, style: ElevatedButton.styleFrom( primary: Colors.black, diff --git a/lib/screens/passo/Building/add_building_components/additional_items.dart b/lib/screens/passo/Building/add_building_components/additional_items.dart index f087534..dd0f133 100644 --- a/lib/screens/passo/Building/add_building_components/additional_items.dart +++ b/lib/screens/passo/Building/add_building_components/additional_items.dart @@ -1,11 +1,15 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_progress_hud/flutter_progress_hud.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:intl/intl.dart'; import 'package:unit2/bloc/passo/bulding/additional_item/additional_item_bloc.dart'; import 'package:unit2/model/passo/class_components.dart'; import 'package:unit2/model/passo/unit_construct.dart'; import 'package:unit2/screens/passo/Building/add_building_components/AddExtraItems.dart'; import 'package:unit2/utils/alerts.dart'; +import 'package:unit2/utils/text_container.dart'; +import 'package:unit2/widgets/error_state.dart'; import 'package:unit2/widgets/passo/custom_button.dart'; class AdditionalItemPage extends StatefulWidget { @@ -37,260 +41,252 @@ class _AdditionalItemPage extends State { @override Widget build(BuildContext context) { - return BlocConsumer( - listener: (context, state) { - // TODO: implement listener - }, - builder: (context, state) { - final state = context.watch().state; - if (state is AdditionalItemsLoaded) { - return Column( - children: [ - Expanded( - child: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(15.0), - child: Column( - children: [ - Container( - margin: const EdgeInsets.only( - left: 0, top: 20, right: 0, bottom: 10), - child: const Text('ADDITIONAL ITEMS', - style: TextStyle( - fontWeight: FontWeight.bold, fontSize: 18), - textAlign: TextAlign.left), - ), - Align( - alignment: Alignment.topRight, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - backgroundColor: Colors.red, + return Scaffold( + body: ProgressHUD( + padding: const EdgeInsets.all(24), + backgroundColor: Colors.black87, + indicatorWidget: const SpinKitFadingCircle(color: Colors.white), + child: BlocConsumer( + listener: (context, state) { + if (state is AdditionalItemsLoading) { + final progress = ProgressHUD.of(context); + progress!.showWithText("Please wait..."); + } + if (state is AdditionalItemsLoaded) { + final progress = ProgressHUD.of(context); + progress?.dismiss(); + } + if (state is AdditionalItemsErrorState) { + final progress = ProgressHUD.of(context); + progress?.dismiss(); + } + }, + builder: (context, state) { + final state = context.watch().state; + if (state is AdditionalItemsLoaded) { + return Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Column( + children: [ + Container( + margin: const EdgeInsets.only( + left: 0, top: 20, right: 0, bottom: 10), + child: const Text('ADDITIONAL ITEMS', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18), + textAlign: TextAlign.left), ), - onPressed: () { - context - .read() - .add(ShowAdditionalItems()); - }, - child: Row( - mainAxisSize: MainAxisSize.min, - children: const [ - Text('ADD ITEM'), // <-- Text - SizedBox( - width: 5, + Align( + alignment: Alignment.topRight, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.red, ), - Icon( - // <-- Icon - Icons.add, - size: 24.0, + onPressed: () { + context + .read() + .add(ShowAdditionalItems()); + }, + child: Row( + mainAxisSize: MainAxisSize.min, + children: const [ + Text('ADD ITEM'), // <-- Text + SizedBox( + width: 5, + ), + Icon( + // <-- Icon + Icons.add, + size: 24.0, + ), + ], ), - ], + ), ), - ), - ), - SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: DataTable( - // ignore: prefer_const_literals_to_create_immutables - columns: [ - const DataColumn( - label: Text('Items'), - ), - const DataColumn( - label: Text('Unit Value'), - ), - const DataColumn( - label: Text('% of BUCC'), - ), - const DataColumn( - label: Text('Market Value'), - ), - const DataColumn( - label: Text('Action'), - ) - ], - rows: state.items.map((dataRow) { - return DataRow( - cells: [ - DataCell(Text(dataRow.className)), - DataCell(Text(dataRow.baseUnitValue)), - DataCell(Text(dataRow.unitValue)), - DataCell(Text(((double.parse( - dataRow.adjustedMarketVal))) - .toString())), - DataCell(Row( - children: [ - InkWell( - child: Container( - height: 30, - width: 30, - decoration: const BoxDecoration( - shape: BoxShape.circle, - color: Colors.red, - ), - child: const Icon( - Icons.delete, - color: Colors.white, - size: 20.0, - ), - ), - onTap: () { - deleteItem(dataRow.id); - }, - ), - const SizedBox( - width: 10, - ), - InkWell( - child: Container( - height: 30, - width: 30, - decoration: const BoxDecoration( - shape: BoxShape.circle, - color: Colors.red, - ), - child: const Icon( - Icons.edit, - color: Colors.white, - size: 20.0, - ), - ), - onTap: () {}, - ), - ], - )) + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: DataTable( + // ignore: prefer_const_literals_to_create_immutables + columns: [ + const DataColumn( + label: Text('Items'), + ), + const DataColumn( + label: Text('Unit Value'), + ), + const DataColumn( + label: Text('% of BUCC'), + ), + const DataColumn( + label: Text('Market Value'), + ), + const DataColumn( + label: Text('Action'), + ) ], - ); - }).toList(), - ), + rows: state.items.map((dataRow) { + return DataRow( + cells: [ + DataCell(Text(dataRow.className)), + DataCell(Text(dataRow.baseUnitValue)), + DataCell(Text(dataRow.unitValue)), + DataCell(Text(((double.parse( + dataRow.adjustedMarketVal))) + .toString())), + DataCell(Row( + children: [ + InkWell( + child: Container( + height: 30, + width: 30, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + child: const Icon( + Icons.delete, + color: Colors.white, + size: 20.0, + ), + ), + onTap: () { + deleteItem(dataRow.id); + }, + ), + const SizedBox( + width: 10, + ), + InkWell( + child: Container( + height: 30, + width: 30, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + child: const Icon( + Icons.edit, + color: Colors.white, + size: 20.0, + ), + ), + onTap: () {}, + ), + ], + )) + ], + ); + }).toList(), + ), + ), + ], ), + ), + ), + ), + Padding( + padding: const EdgeInsets.only(left: 20.0, right: 20.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + 'Total', + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 15), + ), + Text( + NumberFormat.currency(locale: 'en-PH', symbol: "₱") + .format(_totalMarketValue(state.items)), + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 15), + ) ], ), ), - ), - ), - Padding( - padding: const EdgeInsets.only(left: 20.0, right: 20.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const Text( - 'Total', - style: - TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + Padding( + padding: const EdgeInsets.all(15.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + CustomButton( + icon: const Icon(Icons.chevron_left_rounded, + color: Colors.white), + onPressed: () { + { + widget.additionalItemsPrevBtn(); + } + ; + }, + ), + CustomButton( + icon: const Icon(Icons.chevron_right_rounded, + color: Colors.white), + onPressed: () { + { + widget.additionalItemsNextBtn(); + } + ; + }, + ) + ], ), - Text( - NumberFormat.currency(locale: 'en-PH', symbol: "₱") - .format(_totalMarketValue(state.items)), - style: - TextStyle(fontWeight: FontWeight.bold, fontSize: 15), - ) - ], - ), - ), - Padding( - padding: const EdgeInsets.all(15.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - CustomButton( - icon: const Icon(Icons.chevron_left_rounded, - color: Colors.white), - onPressed: () { - { - widget.additionalItemsPrevBtn(); - } - ; - }, - ), - CustomButton( - icon: const Icon(Icons.chevron_right_rounded, - color: Colors.white), - onPressed: () { - { - widget.additionalItemsNextBtn(); - } - ; - }, - ) - ], - ), - ), - ], - ); - } - if (state is AdditionalItemsDeletedState) { - if (state.success) { - WidgetsBinding.instance.addPostFrameCallback((_) { - successAlert(context, "Deletion Successful", - "Extra item has been deleted successfully", () { - Navigator.of(context).pop(); - context - .read() - .add(const LoadAdditionalItems()); - }); - }); - } - } - if (state is ShowAddItemsScreen) { - return ConstrainedBox( - constraints: BoxConstraints(maxHeight: 1000.0), - child: AlertDialog( - insetPadding: const EdgeInsets.symmetric( - horizontal: 20.0, - vertical: 10.0, - ), - title: const Text( - 'ADD EXTRA ITEMS', - textAlign: TextAlign.center, - ), - content: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded(child: AddExtraItems(widget.unit, widget.options)) + ), ], - ), - ), - ); - } - return Container( - child: Column( - children: [ - Container( - margin: const EdgeInsets.only( - left: 0, top: 20, right: 0, bottom: 10), - child: const Text('ADDITIONAL MATERIALS', - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18), - textAlign: TextAlign.left), - ), - Align( - alignment: Alignment.topRight, - child: ElevatedButton( - onPressed: () { + ); + } + if (state is AdditionalItemsDeletedState) { + if (state.success) { + WidgetsBinding.instance.addPostFrameCallback((_) { + successAlert(context, "Deletion Successful", + "Extra item has been deleted successfully", () { + Navigator.of(context).pop(); context .read() - .add(ShowAdditionalItems()); - }, - child: Row( + .add(const LoadAdditionalItems()); + }); + }); + } + } + if (state is ShowAddItemsScreen) { + return ConstrainedBox( + constraints: BoxConstraints(maxHeight: 1000.0), + child: AlertDialog( + insetPadding: const EdgeInsets.symmetric( + horizontal: 20.0, + vertical: 10.0, + ), + title: const Text( + 'ADD EXTRA ITEMS', + textAlign: TextAlign.center, + ), + content: Column( mainAxisSize: MainAxisSize.min, - children: const [ - Text('ADD ITEM'), // <-- Text - SizedBox( - width: 5, - ), - Icon( - // <-- Icon - Icons.add, - size: 24.0, - ), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: AddExtraItems(widget.unit, widget.options)) ], ), ), - ), - ], - ), - ); - }, + ); + } + if (state is AdditionalItemsErrorState) { + return SomethingWentWrong( + message: onError, + onpressed: () { + context.read().add(LoadAdditionalItems()); + }, + ); + } + return Container(); + }, + ), + ), ); } } diff --git a/lib/screens/passo/Building/add_building_components/bldg_location_landref.dart b/lib/screens/passo/Building/add_building_components/bldg_location_landref.dart index 5491d8b..7346172 100644 --- a/lib/screens/passo/Building/add_building_components/bldg_location_landref.dart +++ b/lib/screens/passo/Building/add_building_components/bldg_location_landref.dart @@ -98,223 +98,298 @@ class _BldgLocationLandrefPage extends State { .map((brgy) => brgy.barangayDescription) .toList() .cast(); - return SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(20.0), - child: Column( - children: [ - Container( - margin: const EdgeInsets.only( - left: 0, top: 20, right: 0, bottom: 10), - child: const Text('BUILDING LOCATION', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 18), - textAlign: TextAlign.left), - ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - Expanded( - child: Container( - height: 45.0, - width: double.infinity, - decoration: BoxDecoration( - color: Colors.white, - border: Border.all( - color: Colors.grey, - width: 1.0, + return StatefulBuilder(builder: (context, locationState) { + return SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + children: [ + Container( + margin: const EdgeInsets.only( + left: 0, top: 20, right: 0, bottom: 10), + child: const Text('BUILDING LOCATION', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18), + textAlign: TextAlign.left), + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + child: Container( + height: 45.0, + width: double.infinity, + decoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.grey, + width: 1.0, + ), + borderRadius: + BorderRadius.circular(5.0), ), - borderRadius: - BorderRadius.circular(5.0), - ), - child: Align( - alignment: Alignment.center, - child: Text( - "AGUSAN DEL NORTE", - style: TextStyle(fontSize: 15), + child: Align( + alignment: Alignment.center, + child: Text( + "AGUSAN DEL NORTE", + style: TextStyle(fontSize: 15), + ), ), ), ), - ), - const SizedBox(width: 10.0), - Expanded( - flex: 1, - child: FormBuilderDropdown( - name: 'municipality', - autofocus: false, - decoration: normalTextFieldStyle( - "Municipality", ""), - items: cityList - .map((city) => - DropdownMenuItem( - value: city, - child: Text(city - .cityDescription!), // Use cityDescription instead of cityName - )) - .toList(), - onChanged: (selectedCity) { - if (selectedCity != null) { - final selectedCityCode = - selectedCity.cityCode; - final barangayBloc = - context.read(); - barangayBloc.add(LoadBarangay( - id: selectedCityCode!)); // Use selectedCityCode directly - } - }, - )), - ]), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - Expanded( - flex: 1, - child: customTextField( - "No. / Street", "", 'street'), - ), - const SizedBox(width: 10.0), - Expanded( - // optional flex property if flex is 1 because the default flex is 1 - flex: 1, - child: customDropDownField( - "Brgy. / District", - "", - 'brgy', - brgyNAmes)) - ]), - Container( - margin: const EdgeInsets.only( - left: 0, top: 20, right: 0, bottom: 10), - child: const Text('LAND REFERENCE', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 18), - textAlign: TextAlign.left), - ), - customTextField("Land Owner", "", 'l_owner'), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - Expanded( - flex: 1, - child: customTextField( - "OCT/TCT/CLOA No.", "", 'oct_tct_cloa'), - ), - const SizedBox(width: 10.0), - Expanded( - // optional flex property if flex is 1 because the default flex is 1 + const SizedBox(width: 10.0), + Expanded( + flex: 1, + child: FormBuilderDropdown( + name: 'municipality', + autofocus: false, + decoration: normalTextFieldStyle( + "Municipality", ""), + items: cityList + .map((city) => + DropdownMenuItem( + value: city, + child: Text(city + .cityDescription!), // Use cityDescription instead of cityName + )) + .toList(), + onChanged: (selectedCity) { + if (selectedCity != null) { + final selectedCityCode = + selectedCity.cityCode; + final barangayBloc = + context.read(); + barangayBloc.add(LoadBarangay( + id: selectedCityCode!)); // Use selectedCityCode directly + } + }, + )), + ]), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( flex: 1, child: customTextField( - "Survey No.", "", 'survey_no')) - ]), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - Expanded( - flex: 1, - child: customTextField( - "Lot No.", "", 'lot_no'), - ), - const SizedBox(width: 10.0), - Expanded( - // optional flex property if flex is 1 because the default flex is 1 + "No. / Street", "", 'street'), + ), + const SizedBox(width: 10.0), + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: customDropDownField( + "Brgy. / District", + "", + 'brgy', + brgyNAmes)) + ]), + Container( + margin: const EdgeInsets.only( + left: 0, top: 20, right: 0, bottom: 10), + child: const Text('LAND REFERENCE', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18), + textAlign: TextAlign.left), + ), + customTextField("Land Owner", "", 'l_owner'), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + flex: 1, + child: customTextField("OCT/TCT/CLOA No.", + "", 'oct_tct_cloa'), + ), + const SizedBox(width: 10.0), + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: customTextField( + "Survey No.", "", 'survey_no')) + ]), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( flex: 1, child: customTextField( - "Blk No.", "", 'blk_no')) - ]), - Row( + "Lot No.", "", 'lot_no'), + ), + const SizedBox(width: 10.0), + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: customTextField( + "Blk No.", "", 'blk_no')) + ]), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + flex: 1, + child: customTextField( + "TD / ARP No.", "", 'l_td_arp'), + ), + const SizedBox(width: 10.0), + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: + customTextField("Area", "", 'area')) + ]), + SizedBox( + height: 50, + ), + Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Expanded( - flex: 1, - child: customTextField( - "TD / ARP No.", "", 'l_td_arp'), - ), - const SizedBox(width: 10.0), - Expanded( - // optional flex property if flex is 1 because the default flex is 1 - flex: 1, - child: - customTextField("Area", "", 'area')) - ]), - SizedBox( - height: 50, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - CustomButton( - icon: const Icon(Icons.chevron_left_rounded, - color: Colors.white), - onPressed: () { - { - widget.PrevBtn(); - } - ; - }, - ), - CustomButton( - icon: const Icon(Icons.chevron_right_rounded, - color: Colors.white), - onPressed: () async { - { - try { - final tempID = await SharedPreferences - .getInstance(); - var bldgLocData = BldgLoc( - id: tempID.getInt('tempid')! - 1, - street: formKey - .currentState?.value['street'], - barangay: formKey - .currentState?.value['brgy'], - municipality: formKey - .currentState - ?.value['municipality'] - .cityDescription, - province: "Agusan Del Norte"); - var landRefData = LandRef( - id: tempID.getInt('tempid')! - 1, - owner: formKey - .currentState?.value['l_owner'], - cloaNo: formKey.currentState - ?.value['oct_tct_cloa'], - lotNo: formKey - .currentState?.value['lot_no'], - tdn: formKey - .currentState?.value['l_td_arp'], - area: formKey - .currentState?.value['area'], - surveyNo: formKey - .currentState?.value['survey_no'], - blkNo: formKey - .currentState?.value['blk_no'], - ); - context.read() - ..add(UpdateBldgLoc( - bldg_loc: bldgLocData)) - ..add(UpdateLandRef( - land_ref: landRefData)); - } catch (e) { - Fluttertoast.showToast( - msg: - "Slow internet connection, please try again!"); + children: [ + CustomButton( + icon: const Icon(Icons.chevron_left_rounded, + color: Colors.white), + onPressed: () { + { + widget.PrevBtn(); } - } - ; - }, - ) - ], - ) - ], + ; + }, + ), + // Builder(builder: (context) { + // return CustomButton( + // icon: const Icon( + // Icons.chevron_right_rounded, + // color: Colors.white), + // onPressed: () async { + // { + // try { + // final progress = + // ProgressHUD.of(context); + // Future.delayed(Duration(seconds: 3), + // () { + // progress?.dismiss(); + // }); + // final tempID = await SharedPreferences + // .getInstance(); + // var bldgLocData = BldgLoc( + // id: tempID.getInt('tempid')! - 1, + // street: formKey.currentState + // ?.value['street'], + // barangay: formKey + // .currentState?.value['brgy'], + // municipality: formKey + // .currentState + // ?.value['municipality'] + // .cityDescription, + // province: "Agusan Del Norte"); + // var landRefData = LandRef( + // id: tempID.getInt('tempid')! - 1, + // owner: formKey + // .currentState?.value['l_owner'], + // cloaNo: formKey.currentState + // ?.value['oct_tct_cloa'], + // lotNo: formKey + // .currentState?.value['lot_no'], + // tdn: formKey.currentState + // ?.value['l_td_arp'], + // area: formKey + // .currentState?.value['area'], + // surveyNo: formKey.currentState + // ?.value['survey_no'], + // blkNo: formKey + // .currentState?.value['blk_no'], + // ); + // context.read() + // ..add(UpdateBldgLoc( + // bldg_loc: bldgLocData)) + // ..add(UpdateLandRef( + // land_ref: landRefData)); + // } catch (e) { + // Fluttertoast.showToast( + // msg: + // "Slow internet connection, please try again!"); + // } + // } + // ; + // }, + // ); + // }) + Builder(builder: (context) { + return CustomButton( + icon: const Icon( + Icons.chevron_right_rounded, + color: Colors.white, + ), + onPressed: () async { + try { + // Get the ProgressHUD instance + final progress = + ProgressHUD.of(context); + + // Show the progress indicator + progress?.show(); + + // Dismiss the progress indicator + progress?.dismiss(); + + // Rest of your code... + final tempID = await SharedPreferences + .getInstance(); + var bldgLocData = BldgLoc( + id: tempID.getInt('tempid')! - 1, + street: formKey.currentState + ?.value['street'], + barangay: formKey + .currentState?.value['brgy'], + municipality: formKey + .currentState + ?.value['municipality'] + .cityDescription, + province: "Agusan Del Norte"); + var landRefData = LandRef( + id: tempID.getInt('tempid')! - 1, + owner: formKey + .currentState?.value['l_owner'], + cloaNo: formKey.currentState + ?.value['oct_tct_cloa'], + lotNo: formKey + .currentState?.value['lot_no'], + tdn: formKey.currentState + ?.value['l_td_arp'], + area: formKey + .currentState?.value['area'], + surveyNo: formKey.currentState + ?.value['survey_no'], + blkNo: formKey + .currentState?.value['blk_no'], + ); + context.read() + ..add(UpdateBldgLoc( + bldg_loc: bldgLocData)) + ..add(UpdateLandRef( + land_ref: landRefData)); + } catch (e) { + Fluttertoast.showToast( + msg: + "Slow internet connection, please try again!", + ); + } + }, + ); + }) + ], + ) + ], + ), ), - ), - ); + ); + }); } if (state is BarangayErrorState) { return SomethingWentWrong( diff --git a/lib/screens/passo/Building/add_building_components/property_assessment.dart b/lib/screens/passo/Building/add_building_components/property_assessment.dart index ff0d03c..e670b78 100644 --- a/lib/screens/passo/Building/add_building_components/property_assessment.dart +++ b/lib/screens/passo/Building/add_building_components/property_assessment.dart @@ -1002,76 +1002,104 @@ class _PropertyAssessmentPage extends State { bldgapprDetailsId: tempID.getInt('tempid')! - 1, actualUse: formKey.currentState! - .value['actual_use'], + .value['actual_use'] ?? + '', // Replace null with an empty string marketValue: '0.00', assessmentLevel: '0.00', assessedValue: '0.00', taxable: isTaxable, exempt: isExempt, qtr: int.parse(formKey - .currentState!.value['qtr']), + .currentState! + .value['qtr'] ?? + '0'), // Replace null with '0' yr: int.parse(formKey - .currentState!.value['yr']), - appraisedbyName: formKey .currentState! - .value['appraised_by'] - .firstname + + .value['yr'] ?? + '0'), // Replace null with '0' + appraisedbyName: (formKey + .currentState! + .value['appraised_by'] + ?.firstname ?? + '') + ' ' + - formKey - .currentState! - .value['appraised_by'] - .middlename + + (formKey + .currentState! + .value['appraised_by'] + ?.middlename ?? + '') + ' ' + - formKey - .currentState! - .value['appraised_by'] - .lastname, + (formKey + .currentState! + .value['appraised_by'] + ?.lastname ?? + ''), appraisedbyDate: formKey - .currentState! - .value['app_date'], - recommendapprName: formKey - .currentState! - .value['rec_approval'] - .firstname + + .currentState! + .value['app_date'] + as DateTime? ?? + DateTime + .now(), // Replace null with current date + recommendapprName: (formKey + .currentState! + .value['rec_approval'] + ?.firstname ?? + '') + ' ' + - formKey - .currentState! - .value['rec_approval'] - .middlename + + (formKey + .currentState! + .value['rec_approval'] + ?.middlename ?? + '') + ' ' + - formKey - .currentState! - .value['rec_approval'] - .lastname, + (formKey + .currentState! + .value['rec_approval'] + ?.lastname ?? + ''), recommendapprDate: formKey - .currentState! - .value['rec_date'], - approvedbyName: formKey - .currentState! - .value['apprvd_by'] - .firstname + + .currentState! + .value['rec_date'] + as DateTime? ?? + DateTime + .now(), // Replace null with current date + approvedbyName: (formKey + .currentState! + .value['apprvd_by'] + ?.firstname ?? + '') + ' ' + - formKey - .currentState! - .value['apprvd_by'] - .middlename + + (formKey + .currentState! + .value['apprvd_by'] + ?.middlename ?? + '') + ' ' + - formKey - .currentState! - .value['apprvd_by'] - .lastname, + (formKey + .currentState! + .value['apprvd_by'] + ?.lastname ?? + ''), memoranda: _memoranda, swornstatementNo: formKey - .currentState! - .value['sworn_statement'], + .currentState!.value[ + 'sworn_statement'] ?? + '', // Replace null with an empty string dateReceived: formKey - .currentState! - .value['date_received'], + .currentState! + .value['date_received'] + as DateTime? ?? + DateTime + .now(), // Replace null with current date entryDateAssessment: formKey - .currentState! - .value['date_of_entry'], - entryDateBy: formKey - .currentState!.value['by'], + .currentState! + .value['date_of_entry'] + as DateTime? ?? + DateTime + .now(), // Replace null with current date + entryDateBy: formKey.currentState! + .value['by'] ?? + '', // Replace null with an empty string ); propertyAssessments.add(ass); diff --git a/lib/screens/passo/Building/add_building_components/structural_materials.dart b/lib/screens/passo/Building/add_building_components/structural_materials.dart index 2546e30..95c7db4 100644 --- a/lib/screens/passo/Building/add_building_components/structural_materials.dart +++ b/lib/screens/passo/Building/add_building_components/structural_materials.dart @@ -52,376 +52,380 @@ class _StructuralMaterialsPage extends State { @override Widget build(BuildContext context) { - return SingleChildScrollView( - padding: const EdgeInsets.all(30.0), - child: Column( - children: [ - Container( - margin: - const EdgeInsets.only(left: 0, top: 20, right: 0, bottom: 10), - child: const Text('STRUCTURAL MATERIALS', - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18), - textAlign: TextAlign.left), - ), - Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - 'FOUNDATION', - textAlign: TextAlign.start, + return StatefulBuilder(builder: (context, structuralState) { + return SingleChildScrollView( + padding: const EdgeInsets.all(30.0), + child: Column( + children: [ + Container( + margin: + const EdgeInsets.only(left: 0, top: 20, right: 0, bottom: 10), + child: const Text('STRUCTURAL MATERIALS', + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18), + textAlign: TextAlign.left), ), - Row( - children: [ - const Text('Others'), - Checkbox( - checkColor: Colors.white, - value: foundationOthers, - onChanged: (bool? value) { - setState(() { - foundationOthers = value!; - }); - }, - ) - ], - ), - ]), - Padding( - padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), - child: Visibility( - visible: foundationOthers, - child: customTextField( - "Enter other foundation", "", "other_foundation"), - replacement: DropDownMultiSelect( - selected_values_style: TextStyle(color: Colors.black), - onChanged: (List x) { - setState(() { - foundation = x; - }); - }, - options: const ['Reinforced Concrete', 'Plain Concrete'], - selectedValues: foundation, - whenEmpty: 'Select Foundations', + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Text( + 'FOUNDATION', + textAlign: TextAlign.start, ), - ), - ), - Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - 'COLUMNS', - textAlign: TextAlign.start, - ), - Row( - children: [ - const Text('Others'), - Checkbox( - checkColor: Colors.white, - value: columOthers, - onChanged: (bool? value) { - setState(() { - columOthers = value!; - }); - }, - ) - ], - ), - ]), - Padding( - padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), - child: Visibility( - visible: columOthers, - child: customTextField("Enter other columns", "", "other_column"), - replacement: DropDownMultiSelect( - selected_values_style: TextStyle(color: Colors.black), - onChanged: (List x) { - setState(() { - column = x; - }); - }, - options: const ['Steel', 'Reinforced Concrete', 'Wood'], - selectedValues: column, - whenEmpty: 'Select Column/s', - ), - ), - ), - Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - 'BEAMS', - textAlign: TextAlign.start, - ), - Row( - children: [ - const Text('Others'), - Checkbox( - checkColor: Colors.white, - value: beamsOthers, - onChanged: (bool? value) { - setState(() { - beamsOthers = value!; - }); - }, - ) - ], - ), - ]), - Padding( - padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), - child: Visibility( - visible: beamsOthers, - child: customTextField("Enter other beam/s", "", "other_beam"), - replacement: DropDownMultiSelect( - selected_values_style: TextStyle(color: Colors.black), - onChanged: (List x) { - setState(() { - beam = x; - }); - }, - options: const ['Steel', 'Reinforced Concrete', 'Wood'], - selectedValues: beam, - whenEmpty: 'Select Beam/s', - ), - ), - ), - Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - 'TRUSS FRAMING', - textAlign: TextAlign.start, - ), - Row( - children: [ - const Text('Others'), - Checkbox( - checkColor: Colors.white, - value: tfOthers, - onChanged: (bool? value) { - setState(() { - tfOthers = value!; - }); - }, - ) - ], - ), - ]), - Padding( - padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), - child: Visibility( - visible: tfOthers, - child: customTextField( - "Enter other truss framing/s", "", "other_tf"), - replacement: DropDownMultiSelect( - selected_values_style: TextStyle(color: Colors.black), - onChanged: (List x) { - setState(() { - truss_framing = x; - }); - }, - options: const ['Steel', 'Wood'], - selectedValues: truss_framing, - whenEmpty: 'Select Truss Framing/s', - ), - ), - ), - Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - 'ROOF', - textAlign: TextAlign.start, - ), - Row( - children: [ - const Text('Others'), - Checkbox( - checkColor: Colors.white, - value: roofOthers, - onChanged: (bool? value) { - setState(() { - roofOthers = value!; - }); - }, - ) - ], - ), - ]), - Padding( - padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), - child: Visibility( - visible: roofOthers, - child: customTextField("Enter other roof/s", "", "other_roof"), - replacement: DropDownMultiSelect( - selected_values_style: TextStyle(color: Colors.black), - onChanged: (List x) { - setState(() { - roof = x; - }); - }, - options: const [ - 'Reinforced Concrete', - 'Tiles', - 'G.I Sheet', - 'Aluminum', - 'Asbestos', - 'Long Span', - 'Concrete Desk', - 'Nipa/Anahaw/Cogon' + Row( + children: [ + const Text('Others'), + Checkbox( + checkColor: Colors.white, + value: foundationOthers, + onChanged: (bool? value) { + structuralState(() { + foundationOthers = value!; + }); + }, + ) ], - selectedValues: roof, - whenEmpty: 'Select Roof/s', ), - ), - ), - Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - 'FLOORING', - textAlign: TextAlign.start, - ), - Row( - children: [ - const Text('Others'), - Checkbox( - checkColor: Colors.white, - value: flooringOthers, - onChanged: (bool? value) { - setState(() { - flooringOthers = value!; + ]), + Padding( + padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), + child: Visibility( + visible: foundationOthers, + child: customTextField( + "Enter other foundation", "", "other_foundation"), + replacement: DropDownMultiSelect( + selected_values_style: TextStyle(color: Colors.black), + onChanged: (List x) { + structuralState(() { + foundation = x; }); }, - ) - ], - ), - ]), - Padding( - padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), - child: Visibility( - visible: flooringOthers, - child: customTextField( - "Enter other flooring/s", "", "other_flooring"), - replacement: DropDownMultiSelect( - selected_values_style: TextStyle(color: Colors.black), - onChanged: (List x) { - setState(() { - flooring = x; - }); - }, - options: const [ - 'Reinforced Concrete', - 'Plain Cement', - 'Marble', - 'Wood', - 'Tiles' - ], - selectedValues: flooring, - whenEmpty: 'Select Flooring/s', + options: const ['Reinforced Concrete', 'Plain Concrete'], + selectedValues: foundation, + whenEmpty: 'Select Foundations', + ), ), ), - ), - Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - 'WALLS & PARTITIONS', - textAlign: TextAlign.start, - ), - Row( - children: [ - const Text('Others'), - Checkbox( - checkColor: Colors.white, - value: wpOthers, - onChanged: (bool? value) { - setState(() { - wpOthers = value!; + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Text( + 'COLUMNS', + textAlign: TextAlign.start, + ), + Row( + children: [ + const Text('Others'), + Checkbox( + checkColor: Colors.white, + value: columOthers, + onChanged: (bool? value) { + structuralState(() { + columOthers = value!; + }); + }, + ) + ], + ), + ]), + Padding( + padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), + child: Visibility( + visible: columOthers, + child: + customTextField("Enter other columns", "", "other_column"), + replacement: DropDownMultiSelect( + selected_values_style: TextStyle(color: Colors.black), + onChanged: (List x) { + structuralState(() { + column = x; }); }, - ) - ], + options: const ['Steel', 'Reinforced Concrete', 'Wood'], + selectedValues: column, + whenEmpty: 'Select Column/s', + ), + ), ), - ]), - Padding( - padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), - child: Visibility( - visible: wpOthers, - child: customTextField( - "Enter other walls & partition/s", "", "other_wp"), - replacement: DropDownMultiSelect( - selected_values_style: TextStyle(color: Colors.black), - onChanged: (List x) { - setState(() { - walls = x; - }); - }, - options: const [ - 'Reinforced Concrete', - 'Plain Concrete', - 'Wood', - 'CHIB', - 'G.I Sheet', - 'Build-a-wall', - 'Sawali', - 'Bamboo' + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Text( + 'BEAMS', + textAlign: TextAlign.start, + ), + Row( + children: [ + const Text('Others'), + Checkbox( + checkColor: Colors.white, + value: beamsOthers, + onChanged: (bool? value) { + structuralState(() { + beamsOthers = value!; + }); + }, + ) ], - selectedValues: walls, - whenEmpty: 'Select Walls & Partition/s', + ), + ]), + Padding( + padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), + child: Visibility( + visible: beamsOthers, + child: customTextField("Enter other beam/s", "", "other_beam"), + replacement: DropDownMultiSelect( + selected_values_style: TextStyle(color: Colors.black), + onChanged: (List x) { + structuralState(() { + beam = x; + }); + }, + options: const ['Steel', 'Reinforced Concrete', 'Wood'], + selectedValues: beam, + whenEmpty: 'Select Beam/s', + ), ), ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - CustomButton( - icon: - const Icon(Icons.chevron_left_rounded, color: Colors.white), - onPressed: () { - { - widget.PrevBtn(); - } - ; - }, + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Text( + 'TRUSS FRAMING', + textAlign: TextAlign.start, ), - CustomButton( - icon: const Icon(Icons.chevron_right_rounded, - color: Colors.white), - onPressed: () async { - { - try { - final tempID = await SharedPreferences.getInstance(); - var strucMaterials = StructureMaterialsII( - id: tempID.getInt('tempid')! - 1, - foundation: foundationOthers - ? formKey.currentState!.value['other_foundation'] - .split(',') - : foundation, - columns: columOthers - ? formKey.currentState!.value['other_column'] - .split(',') - : column, - beams: beamsOthers - ? formKey.currentState!.value['other_beam'] - .split(',') - : beam, - trussFraming: tfOthers - ? formKey.currentState!.value['other_tf'] - .split(',') - : truss_framing, - roof: roofOthers - ? formKey.currentState!.value['other_roof'] - .split(',') - : roof, - flooring: flooringOthers - ? formKey.currentState!.value['other_flooring'] - .split(',') - : flooring, - walls: wpOthers - ? formKey.currentState!.value['other_wp'] - .split(',') - : walls, - others: ["Others"]); - context.read() - ..add(UpdateStrucMaterials(data: strucMaterials)); - } catch (e) { - Fluttertoast.showToast( - msg: "Slow internet connection, please try again!"); + Row( + children: [ + const Text('Others'), + Checkbox( + checkColor: Colors.white, + value: tfOthers, + onChanged: (bool? value) { + structuralState(() { + tfOthers = value!; + }); + }, + ) + ], + ), + ]), + Padding( + padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), + child: Visibility( + visible: tfOthers, + child: customTextField( + "Enter other truss framing/s", "", "other_tf"), + replacement: DropDownMultiSelect( + selected_values_style: TextStyle(color: Colors.black), + onChanged: (List x) { + structuralState(() { + truss_framing = x; + }); + }, + options: const ['Steel', 'Wood'], + selectedValues: truss_framing, + whenEmpty: 'Select Truss Framing/s', + ), + ), + ), + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Text( + 'ROOF', + textAlign: TextAlign.start, + ), + Row( + children: [ + const Text('Others'), + Checkbox( + checkColor: Colors.white, + value: roofOthers, + onChanged: (bool? value) { + structuralState(() { + roofOthers = value!; + }); + }, + ) + ], + ), + ]), + Padding( + padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), + child: Visibility( + visible: roofOthers, + child: customTextField("Enter other roof/s", "", "other_roof"), + replacement: DropDownMultiSelect( + selected_values_style: TextStyle(color: Colors.black), + onChanged: (List x) { + structuralState(() { + roof = x; + }); + }, + options: const [ + 'Reinforced Concrete', + 'Tiles', + 'G.I Sheet', + 'Aluminum', + 'Asbestos', + 'Long Span', + 'Concrete Desk', + 'Nipa/Anahaw/Cogon' + ], + selectedValues: roof, + whenEmpty: 'Select Roof/s', + ), + ), + ), + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Text( + 'FLOORING', + textAlign: TextAlign.start, + ), + Row( + children: [ + const Text('Others'), + Checkbox( + checkColor: Colors.white, + value: flooringOthers, + onChanged: (bool? value) { + structuralState(() { + flooringOthers = value!; + }); + }, + ) + ], + ), + ]), + Padding( + padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), + child: Visibility( + visible: flooringOthers, + child: customTextField( + "Enter other flooring/s", "", "other_flooring"), + replacement: DropDownMultiSelect( + selected_values_style: TextStyle(color: Colors.black), + onChanged: (List x) { + structuralState(() { + flooring = x; + }); + }, + options: const [ + 'Reinforced Concrete', + 'Plain Cement', + 'Marble', + 'Wood', + 'Tiles' + ], + selectedValues: flooring, + whenEmpty: 'Select Flooring/s', + ), + ), + ), + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Text( + 'WALLS & PARTITIONS', + textAlign: TextAlign.start, + ), + Row( + children: [ + const Text('Others'), + Checkbox( + checkColor: Colors.white, + value: wpOthers, + onChanged: (bool? value) { + structuralState(() { + wpOthers = value!; + }); + }, + ) + ], + ), + ]), + Padding( + padding: const EdgeInsets.only(top: 10.0, bottom: 10.0), + child: Visibility( + visible: wpOthers, + child: customTextField( + "Enter other walls & partition/s", "", "other_wp"), + replacement: DropDownMultiSelect( + selected_values_style: TextStyle(color: Colors.black), + onChanged: (List x) { + setState(() { + walls = x; + }); + }, + options: const [ + 'Reinforced Concrete', + 'Plain Concrete', + 'Wood', + 'CHIB', + 'G.I Sheet', + 'Build-a-wall', + 'Sawali', + 'Bamboo' + ], + selectedValues: walls, + whenEmpty: 'Select Walls & Partition/s', + ), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + CustomButton( + icon: const Icon(Icons.chevron_left_rounded, + color: Colors.white), + onPressed: () { + { + widget.PrevBtn(); } - } - ; - }, - ) - ], - ) - ], - ), - ); + ; + }, + ), + CustomButton( + icon: const Icon(Icons.chevron_right_rounded, + color: Colors.white), + onPressed: () async { + { + try { + final tempID = await SharedPreferences.getInstance(); + var strucMaterials = StructureMaterialsII( + id: tempID.getInt('tempid')! - 1, + foundation: foundationOthers + ? formKey + .currentState!.value['other_foundation'] + .split(',') + : foundation, + columns: columOthers + ? formKey.currentState!.value['other_column'] + .split(',') + : column, + beams: beamsOthers + ? formKey.currentState!.value['other_beam'] + .split(',') + : beam, + trussFraming: tfOthers + ? formKey.currentState!.value['other_tf'] + .split(',') + : truss_framing, + roof: roofOthers + ? formKey.currentState!.value['other_roof'] + .split(',') + : roof, + flooring: flooringOthers + ? formKey.currentState!.value['other_flooring'] + .split(',') + : flooring, + walls: wpOthers + ? formKey.currentState!.value['other_wp'] + .split(',') + : walls, + others: ["Others"]); + context.read() + ..add(UpdateStrucMaterials(data: strucMaterials)); + } catch (e) { + Fluttertoast.showToast( + msg: "Slow internet connection, please try again!"); + } + } + ; + }, + ) + ], + ) + ], + ), + ); + }); } } diff --git a/lib/screens/passo/Building/edit_building/general_description.dart b/lib/screens/passo/Building/edit_building/general_description.dart index eb75f7b..6fbfc23 100644 --- a/lib/screens/passo/Building/edit_building/general_description.dart +++ b/lib/screens/passo/Building/edit_building/general_description.dart @@ -3,6 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:flutter_progress_hud/flutter_progress_hud.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:unit2/bloc/passo/bulding/general_description/general_description_bloc.dart'; import 'package:unit2/bloc/passo/bulding/property_info/property_info_bloc.dart'; import 'package:unit2/model/passo/general_description.dart'; @@ -49,7 +50,7 @@ class _GeneralDescriptionEdit extends State { indicatorWidget: const SpinKitFadingCircle(color: Colors.white), child: BlocConsumer( - listener: (context, state) { + listener: (context, state) async { if (state is GenDescLoading) { final progress = ProgressHUD.of(context); progress!.showWithText("Please wait..."); @@ -57,6 +58,13 @@ class _GeneralDescriptionEdit extends State { if (state is GenDescLoaded) { final progress = ProgressHUD.of(context); progress?.dismiss(); + + final tempID = await SharedPreferences.getInstance(); + await tempID.setInt( + 'totalValue', int.parse(state.gendesc.totalFloorArea!)); + await tempID.setString( + 'actualUse', state.gendesc.actualUse!); + } if (state is GenDescErrorState) { final progress = ProgressHUD.of(context); diff --git a/lib/screens/passo/Building/edit_building/property_appraisal.dart b/lib/screens/passo/Building/edit_building/property_appraisal.dart index de28b54..b6dc672 100644 --- a/lib/screens/passo/Building/edit_building/property_appraisal.dart +++ b/lib/screens/passo/Building/edit_building/property_appraisal.dart @@ -33,6 +33,24 @@ class PropertyAppraisalEditPage extends StatefulWidget { class _PropertyAppraisalEditPage extends State { double depRate = 0; + int totalAreas = 0; + String actualUse = ""; + + @override + void initState() { + super.initState(); + _loadDataFromSharedPreferences(); // Call the method to load data + } + + // Method to load data from SharedPreferences + _loadDataFromSharedPreferences() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + setState(() { + actualUse = prefs.getString('actualUse') ?? ''; + totalAreas = prefs.getInt('totalArea') ?? + 0; // Provide a default value if the key doesn't exist + }); + } calculateAdditionalItems(List items) { double sum = 0; @@ -529,629 +547,577 @@ class _PropertyAppraisalEditPage extends State { }, builder: (context, state) { if (state is AdditionalItemsEditLoaded) { final item = state.items; - return BlocConsumer(listener: (context, state) { - // TODO: implement listener - }, builder: (context, state) { - if (state is GenDescLoaded) { - double totalArea = double.tryParse( - state.gendesc.totalFloorArea ?? - appraisal.totalArea.toString()) ?? - 0.0; - double bldgUnitValue = double.tryParse( - keys.currentState?.value['bldg_type']?.unitValue ?? - appraisal.unitconstructCost) ?? - 0.0; - return Expanded( - child: SingleChildScrollView( - child: Container( - margin: - const EdgeInsets.only(left: 20.0, right: 20.0), - child: Column( + double totalArea = double.tryParse(totalAreas.toString() ?? + appraisal.totalArea.toString()) ?? + 0.0; + + double bldgUnitValue = double.tryParse( + keys.currentState?.value['bldg_type']?.unitValue ?? + appraisal.unitconstructCost) ?? + 0.0; + return Expanded( + child: SingleChildScrollView( + child: Container( + margin: const EdgeInsets.only(left: 20.0, right: 20.0), + child: Column( + children: [ + Container( + margin: const EdgeInsets.only( + left: 0, top: 20, right: 0, bottom: 20), + child: const Text('PROPERTY APPRAISAL', + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 18), + textAlign: TextAlign.left), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( - margin: const EdgeInsets.only( - left: 0, top: 20, right: 0, bottom: 20), - child: const Text('PROPERTY APPRAISAL', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 18), - textAlign: TextAlign.left), + child: Text( + "Unit Construction Cost", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13), + textAlign: TextAlign.left, + ), ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Container( - child: Text( - "Unit Construction Cost", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 13), - textAlign: TextAlign.left, - ), - ), - Container( - child: Text( - bldgUnitValue.toString() + ' sq.m', - textAlign: TextAlign.right, - ), - ) - ], + Container( + child: Text( + bldgUnitValue.toString() + ' sq.m', + textAlign: TextAlign.right, + ), + ) + ], + ), + const SizedBox(height: 15), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: Text( + "Building Core", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13), + textAlign: TextAlign.left, + ), ), - const SizedBox(height: 15), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Container( - child: Text( - "Building Core", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 13), - textAlign: TextAlign.left, - ), - ), - Container( - child: Text( - '', - textAlign: TextAlign.right, - ), - ) - ], + Container( + child: Text( + '', + textAlign: TextAlign.right, + ), + ) + ], + ), + const SizedBox(height: 40), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: Text( + "Sub-total", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13), + textAlign: TextAlign.left, + ), ), - const SizedBox(height: 40), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Container( - child: Text( - "Sub-total", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 13), - textAlign: TextAlign.left, - ), - ), - Container( - child: Text( - bldgUnitValue.toString(), - textAlign: TextAlign.right, - ), - ) - ], + Container( + child: Text( + bldgUnitValue.toString(), + textAlign: TextAlign.right, + ), + ) + ], + ), + const SizedBox(height: 40), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: Text( + "Cost of Additional Items", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13), + textAlign: TextAlign.left, + ), ), - const SizedBox(height: 40), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Container( - child: Text( - "Cost of Additional Items", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 13), - textAlign: TextAlign.left, - ), - ), - Container( - child: Text( - '', - textAlign: TextAlign.right, - ), - ) - ], + Container( + child: Text( + '', + textAlign: TextAlign.right, + ), + ) + ], + ), + const SizedBox(height: 15), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: Text( + "Sub-total", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13), + textAlign: TextAlign.left, + ), ), - const SizedBox(height: 15), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Container( - child: Text( - "Sub-total", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 13), - textAlign: TextAlign.left, - ), - ), - Container( - child: Text( - appraisal.addItemsSubtotal ?? '0.00', - textAlign: TextAlign.right, - ), - ) - ], + Container( + child: Text( + appraisal.addItemsSubtotal ?? '0.00', + textAlign: TextAlign.right, + ), + ) + ], + ), + const SizedBox(height: 15), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: Text( + "Total Construction Cost", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13), + textAlign: TextAlign.left, + ), ), - const SizedBox(height: 15), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Container( - child: Text( - "Total Construction Cost", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 13), - textAlign: TextAlign.left, - ), - ), - Container( - child: Text( - calculateConstructionCost( - double.parse(appraisal - .unitconstructSubtotal!), - double.parse( - appraisal.addItemsSubtotal!)) - .toString()!, - textAlign: TextAlign.right, - ), - ) - ], + Container( + child: Text( + calculateConstructionCost( + double.parse( + appraisal.unitconstructSubtotal!), + double.parse( + appraisal.addItemsSubtotal!)) + .toString()!, + textAlign: TextAlign.right, + ), + ) + ], + ), + const SizedBox(height: 40), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: Text( + "Depreciation Rate", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13), + textAlign: TextAlign.left, + ), ), - const SizedBox(height: 40), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Container( - child: Text( - "Depreciation Rate", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 13), - textAlign: TextAlign.left, - ), - ), - SizedBox( - width: 90, - height: 25, - child: FormBuilderTextField( - name: 'depRate', - decoration: - normalTextFieldStyle("0.00", ""), - validator: - FormBuilderValidators.compose([]), - onChanged: (value) { - setState(() { - depRate = double.parse(value!); - }); - }, - ), - ), - ], + SizedBox( + width: 90, + height: 25, + child: FormBuilderTextField( + name: 'depRate', + decoration: normalTextFieldStyle("0.00", ""), + validator: FormBuilderValidators.compose([]), + onChanged: (value) { + setState(() { + depRate = double.parse(value!); + }); + }, + ), ), - const SizedBox(height: 15), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Container( - child: Text( - "Depreciation Cost", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 13), - textAlign: TextAlign.left, - ), - ), - Container( - child: Text( - calculateDepCost( - (totalArea * bldgUnitValue), - item, - double.parse(keys.currentState - ?.value['depRate'] ?? - appraisal.depreciationRate)) - .toString(), - textAlign: TextAlign.right, - ), - ) - ], + ], + ), + const SizedBox(height: 15), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: Text( + "Depreciation Cost", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13), + textAlign: TextAlign.left, + ), ), - const SizedBox(height: 15), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Container( - child: Text( - "Total % Depreciation", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 13), - textAlign: TextAlign.left, - ), - ), - Container( - child: Text( - '${(double.parse(keys.currentState?.value['depRate'] ?? appraisal.depreciationRate) * 100).toStringAsFixed(2)}%', - textAlign: TextAlign.right, - ), - ) - ], + Container( + child: Text( + calculateDepCost( + (totalArea * bldgUnitValue), + item, + double.parse(keys.currentState + ?.value['depRate'] ?? + appraisal.depreciationRate)) + .toString(), + textAlign: TextAlign.right, + ), + ) + ], + ), + const SizedBox(height: 15), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: Text( + "Total % Depreciation", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13), + textAlign: TextAlign.left, + ), ), - const SizedBox(height: 15), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Container( - child: Text( - "Market Value", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 13), - textAlign: TextAlign.left, - ), - ), - Container( - child: Text( - calculateMarketValue( - (totalArea * bldgUnitValue), - item, - double.parse(keys.currentState - ?.value['depRate'] ?? - appraisal.depreciationRate)) - .toString(), - textAlign: TextAlign.right, - ), - ) - ], + Container( + child: Text( + '${(double.parse(keys.currentState?.value['depRate'] ?? appraisal.depreciationRate) * 100).toStringAsFixed(2)}%', + textAlign: TextAlign.right, + ), + ) + ], + ), + const SizedBox(height: 15), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: Text( + "Market Value", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13), + textAlign: TextAlign.left, + ), ), - Row( - children: [ - Expanded( - flex: 1, - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: Container( - margin: const EdgeInsets.symmetric( - horizontal: 20.0), - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - children: [ - Container( - margin: const EdgeInsets.fromLTRB( - 0, 20, 0, 20), - child: const Text( - 'PROPERTY ASSESSMENT', - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 18, - ), - textAlign: TextAlign.left, - ), + Container( + child: Text( + calculateMarketValue( + (totalArea * bldgUnitValue), + item, + double.parse(keys.currentState + ?.value['depRate'] ?? + appraisal.depreciationRate)) + .toString(), + textAlign: TextAlign.right, + ), + ) + ], + ), + Row( + children: [ + Expanded( + flex: 1, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Container( + margin: const EdgeInsets.symmetric( + horizontal: 20.0), + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + children: [ + Container( + margin: const EdgeInsets.fromLTRB( + 0, 20, 0, 20), + child: const Text( + 'PROPERTY ASSESSMENT', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, ), - Column( + textAlign: TextAlign.left, + ), + ), + Column( + children: [ + Row( children: [ - Row( - children: [ - Container( - width: 100, - margin: - const EdgeInsets.only( - top: 15, - left: 15), - padding: - const EdgeInsets.all( - 5.0), - child: const Text( - 'Actual Use', - style: TextStyle( - fontWeight: - FontWeight.bold, - fontSize: 13, - ), - textAlign: - TextAlign.center, - ), + Container( + width: 100, + margin: const EdgeInsets.only( + top: 15, left: 15), + padding: + const EdgeInsets.all(5.0), + child: const Text( + 'Actual Use', + style: TextStyle( + fontWeight: + FontWeight.bold, + fontSize: 13, ), - Container( - width: 150, - margin: - const EdgeInsets.only( - top: 15, - left: 15), - padding: - const EdgeInsets.all( - 5.0), - child: const Text( - 'Market Value', - style: TextStyle( - fontWeight: - FontWeight.bold, - fontSize: 13, - ), - textAlign: - TextAlign.center, - ), - ), - Container( - width: 100, - margin: - const EdgeInsets.only( - top: 15, - left: 15), - padding: - const EdgeInsets.all( - 5.0), - child: const Text( - 'Ass. Level', - style: TextStyle( - fontWeight: - FontWeight.bold, - fontSize: 13, - ), - textAlign: - TextAlign.center, - ), - ), - Container( - width: 150, - margin: - const EdgeInsets.only( - top: 15, - left: 15), - padding: - const EdgeInsets.all( - 5.0), - child: const Text( - 'Ass. Value', - style: TextStyle( - fontWeight: - FontWeight.bold, - fontSize: 13, - ), - textAlign: - TextAlign.center, - ), - ), - ], + textAlign: TextAlign.center, + ), ), - SizedBox( - height: 50, - child: SingleChildScrollView( - scrollDirection: - Axis.horizontal, - child: Row(children: [ - Container( - height: 100, - child: Row( - children: [ - Container( - width: 100, - margin: - const EdgeInsets - .only( - top: 15, - left: 15), - padding: - const EdgeInsets - .all(5.0), - child: Text( - state.gendesc - .actualUse ?? - "", - style: - TextStyle( - fontWeight: - FontWeight - .bold, - fontSize: 13, - ), - textAlign: - TextAlign - .center, - ), + Container( + width: 150, + margin: const EdgeInsets.only( + top: 15, left: 15), + padding: + const EdgeInsets.all(5.0), + child: const Text( + 'Market Value', + style: TextStyle( + fontWeight: + FontWeight.bold, + fontSize: 13, + ), + textAlign: TextAlign.center, + ), + ), + Container( + width: 100, + margin: const EdgeInsets.only( + top: 15, left: 15), + padding: + const EdgeInsets.all(5.0), + child: const Text( + 'Ass. Level', + style: TextStyle( + fontWeight: + FontWeight.bold, + fontSize: 13, + ), + textAlign: TextAlign.center, + ), + ), + Container( + width: 150, + margin: const EdgeInsets.only( + top: 15, left: 15), + padding: + const EdgeInsets.all(5.0), + child: const Text( + 'Ass. Value', + style: TextStyle( + fontWeight: + FontWeight.bold, + fontSize: 13, + ), + textAlign: TextAlign.center, + ), + ), + ], + ), + SizedBox( + height: 50, + child: SingleChildScrollView( + scrollDirection: + Axis.horizontal, + child: Row(children: [ + Container( + height: 100, + child: Row( + children: [ + Container( + width: 100, + margin: + const EdgeInsets + .only( + top: 15, + left: 15), + padding: + const EdgeInsets + .all(5.0), + child: Text( + actualUse ?? "", + style: TextStyle( + fontWeight: + FontWeight + .bold, + fontSize: 13, ), - Container( - width: 150, - margin: - const EdgeInsets - .only( - top: 15, - left: 15), - padding: - const EdgeInsets - .all(5.0), - child: Text( - NumberFormat - .currency( - locale: - 'en-PH', - symbol: "₱", - ).format( - calculateMarketValue( - (totalArea * - bldgUnitValue), - item, - double.parse(keys + textAlign: TextAlign + .center, + ), + ), + Container( + width: 150, + margin: + const EdgeInsets + .only( + top: 15, + left: 15), + padding: + const EdgeInsets + .all(5.0), + child: Text( + NumberFormat + .currency( + locale: 'en-PH', + symbol: "₱", + ).format( + calculateMarketValue( + (totalArea * + bldgUnitValue), + item, + double.parse(keys .currentState - ?.value['depRate'] ?? - appraisal.depreciationRate)), - ), - style: - TextStyle( - fontWeight: - FontWeight - .bold, - fontSize: 13, - ), - textAlign: - TextAlign - .center, - ), + ?.value[ + 'depRate'] ?? + appraisal + .depreciationRate)), ), - Container( - width: 100, - margin: - const EdgeInsets - .only( - top: 15, - left: 15), - padding: - const EdgeInsets - .all(5.0), - child: Text( - assessmentLevel( - calculateMarketValue((totalArea * bldgUnitValue), item, double.parse(keys.currentState?.value['depRate'] ?? appraisal.depreciationRate)) - .toString(), - state - .gendesc - .actualUse) + - '%', - style: - TextStyle( - fontWeight: - FontWeight - .bold, - fontSize: 13, - ), - textAlign: - TextAlign - .center, - ), + style: TextStyle( + fontWeight: + FontWeight + .bold, + fontSize: 13, ), - Container( - width: 150, - margin: - const EdgeInsets - .only( - top: 15, - left: 15), - padding: - const EdgeInsets - .all(5.0), - child: Text( - NumberFormat - .currency( - locale: - 'en-PH', - symbol: "₱", - ).format(assessmentValue( + textAlign: TextAlign + .center, + ), + ), + Container( + width: 100, + margin: + const EdgeInsets + .only( + top: 15, + left: 15), + padding: + const EdgeInsets + .all(5.0), + child: Text( + assessmentLevel( calculateMarketValue( (totalArea * bldgUnitValue), item, double.parse(keys.currentState?.value['depRate'] ?? - appraisal - .depreciationRate)) + appraisal.depreciationRate)) .toString(), - state - .gendesc - .actualUse)), - style: - TextStyle( - fontWeight: - FontWeight - .bold, - fontSize: 13, - ), - textAlign: - TextAlign - .center, - ), + actualUse) + + '%', + style: TextStyle( + fontWeight: + FontWeight + .bold, + fontSize: 13, ), - const SizedBox( - height: 80, - ), - ], + textAlign: TextAlign + .center, + ), ), - ) - ]), - ), - ) - ], + Container( + width: 150, + margin: + const EdgeInsets + .only( + top: 15, + left: 15), + padding: + const EdgeInsets + .all(5.0), + child: Text( + NumberFormat + .currency( + locale: 'en-PH', + symbol: "₱", + ).format(assessmentValue( + calculateMarketValue( + (totalArea * + bldgUnitValue), + item, + double.parse(keys.currentState?.value['depRate'] ?? + appraisal.depreciationRate)) + .toString(), + actualUse)), + style: TextStyle( + fontWeight: + FontWeight + .bold, + fontSize: 13, + ), + textAlign: TextAlign + .center, + ), + ), + const SizedBox( + height: 80, + ), + ], + ), + ) + ]), + ), ) ], - ), - ), + ) + ], ), ), - ], + ), ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - CustomButton( - icon: const Icon(Icons.chevron_left_rounded, - color: Colors.white), - onPressed: () { - { - widget.PrevBtn(); - } - ; - }, - ), - CustomButton( - icon: const Icon( - Icons.chevron_right_rounded, - color: Colors.white), - onPressed: () async { - final tempID = - await SharedPreferences.getInstance(); - - final id = tempID.getInt('tempid')! - 1; - { - var appraisals = PropertyAppraisalEdit( - id: 1, - bldgapprDetailsId: id, - unitconstructCost: - bldgUnitValue.toString(), - buildingCore: 'test', - unitconstructSubtotal: - (totalArea * bldgUnitValue) - .toString(), - depreciationRate: - depRate.toString(), - depreciationCost: calculateDepCost( - (totalArea * bldgUnitValue), - item, - depRate) - .toString(), - costAddItems: calculateAdditionalItems(item) - .toString(), - addItemsSubtotal: - calculateAdditionalItems(item) - .toString(), - totalpercentDepreciation: (depRate * 100) - .toStringAsFixed(2), - marketValue: calculateMarketValue( - (totalArea * bldgUnitValue), - item, - depRate) - .toString(), - totalArea: totalArea.toString()); - context - .read() - ..add(UpdatePropertyAppraisalEdit( - appraisalEdit: appraisals, - id: widget.tempId)); - - widget.NextBtn(); - } - ; - }, - ) - ], - ) ], ), - ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + CustomButton( + icon: const Icon(Icons.chevron_left_rounded, + color: Colors.white), + onPressed: () { + { + widget.PrevBtn(); + } + ; + }, + ), + CustomButton( + icon: const Icon(Icons.chevron_right_rounded, + color: Colors.white), + onPressed: () async { + final tempID = + await SharedPreferences.getInstance(); + + final id = tempID.getInt('tempid')! - 1; + { + var appraisals = PropertyAppraisalEdit( + id: 1, + bldgapprDetailsId: id, + unitconstructCost: bldgUnitValue + .toString(), + buildingCore: 'test', + unitconstructSubtotal: (totalArea * + bldgUnitValue) + .toString(), + depreciationRate: depRate.toString(), + depreciationCost: calculateDepCost( + (totalArea * bldgUnitValue), + item, + depRate) + .toString(), + costAddItems: calculateAdditionalItems(item) + .toString(), + addItemsSubtotal: + calculateAdditionalItems(item) + .toString(), + totalpercentDepreciation: + (depRate * 100).toStringAsFixed(2), + marketValue: calculateMarketValue( + (totalArea * bldgUnitValue), + item, + depRate) + .toString(), + totalArea: totalArea.toString()); + context.read() + ..add(UpdatePropertyAppraisalEdit( + appraisalEdit: appraisals, + id: widget.tempId)); + + widget.NextBtn(); + } + ; + }, + ) + ], + ) + ], ), - ); - } - return Container(); - }); + ), + ), + ); } return Container(); }); diff --git a/lib/screens/passo/Land/add_land/AddLandAppraisal.dart b/lib/screens/passo/Land/add_land/AddLandAppraisal.dart index 02e4e74..a271e40 100644 --- a/lib/screens/passo/Land/add_land/AddLandAppraisal.dart +++ b/lib/screens/passo/Land/add_land/AddLandAppraisal.dart @@ -107,7 +107,6 @@ class _AddLandAppraisalModal extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: Container( - height: 800, child: SingleChildScrollView( padding: const EdgeInsets.all(8.0), child: Column( @@ -387,7 +386,7 @@ class _AddLandAppraisalModal extends State { ), ), ], - ) + ), ], ), ), diff --git a/lib/screens/passo/Land/add_land/land_appraisal.dart b/lib/screens/passo/Land/add_land/land_appraisal.dart index a7fcdc8..e881636 100644 --- a/lib/screens/passo/Land/add_land/land_appraisal.dart +++ b/lib/screens/passo/Land/add_land/land_appraisal.dart @@ -239,7 +239,9 @@ class _LandAppraisal extends State { content: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, - children: [Expanded(child: AddLandAppraisalModal())], + children: [ + Expanded(child: AddLandAppraisalModal()), + ], ), ), ); diff --git a/lib/screens/passo/Land/add_land/location_and_boundaries.dart b/lib/screens/passo/Land/add_land/location_and_boundaries.dart index f27db38..e81d200 100644 --- a/lib/screens/passo/Land/add_land/location_and_boundaries.dart +++ b/lib/screens/passo/Land/add_land/location_and_boundaries.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:unit2/bloc/passo/land/land_property_owner_info/land_property_owner_info_bloc.dart'; import 'package:unit2/model/passo/land_property_boundaries.dart'; import 'package:unit2/model/passo/land_property_loc.dart'; @@ -107,16 +108,18 @@ class _LandLocationAndBoundaries extends State { CustomButton( icon: const Icon(Icons.chevron_right, color: Colors.white), - onPressed: () { + onPressed: () async { + final tempID = await SharedPreferences.getInstance(); + print(tempID.getInt('landid')); var boundaries = LandPropertyBoundaries( - id: 3, + id: tempID.getInt('landid')! - 1, north: landKey.currentState?.value['north'], east: landKey.currentState?.value['east'], west: landKey.currentState?.value['west'], south: landKey.currentState?.value['south'], ); var location = LandPropertyLoc( - id: 3, + id: tempID.getInt('landid')! - 1, street: landKey.currentState?.value['street'], barangay: landKey.currentState?.value['brgy'], municipality: diff --git a/lib/screens/passo/Land/add_land/property_owner_info.dart b/lib/screens/passo/Land/add_land/property_owner_info.dart index ec1391f..f8fea59 100644 --- a/lib/screens/passo/Land/add_land/property_owner_info.dart +++ b/lib/screens/passo/Land/add_land/property_owner_info.dart @@ -76,7 +76,6 @@ class _LandPropertyOwnerInfo extends State { flex: 1, child: customTextField("Blk", "", "blk")), ]), - Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ @@ -117,45 +116,6 @@ class _LandPropertyOwnerInfo extends State { flex: 1, child: customTextField("Tel No.", "", "admin_telno")) ]), - - // SizedBox( - // width: double.infinity, - // height: 50, - // child: ElevatedButton( - // style: secondaryBtnStyle(const Color(0xffd92828), - // Color.fromARGB(0, 253, 252, 252), Colors.white54), - // child: const Text( - // "SUBMIT & PROCEED", - // style: TextStyle( - // color: Color.fromARGB(239, 255, 255, 255), - // fontWeight: FontWeight.w700), - // ), - // onPressed: () { - // // formKey.currentState?.save(); - // // // var faas = PropertyInfo( - // // // id: 1, - // // // transCode: formKey - // // // .currentState!.value['transaction_code'] - // // // .toString(), - // // // tdn: formKey.currentState!.value['arp_td'], - // // // pin: formKey.currentState!.value['pin'], - // // // owner: formKey.currentState!.value['owner'], - // // // address: formKey.currentState!.value['address'], - // // // telno: formKey.currentState!.value['tel_no'], - // // // tin: formKey.currentState!.value['tin'], - // // // adminUser: formKey.currentState!.value['benificiary'], - // // // adminAddress: formKey - // // // .currentState!.value['benificiary_address'], - // // // adminTin: - // // // formKey.currentState!.value['benificiary_tin'], - // // // adminTelno: - // // // formKey.currentState!.value['benificiary_telno']); - // // // context.read().add(AddFaas(faas: faas)); - // // // _loadTempId(); - // // _pageController.nextPage( - // // duration: _kDuration, curve: _kCurve); - // }), - // ), SizedBox( height: 30, ), diff --git a/lib/screens/passo/Land/edit_land.dart b/lib/screens/passo/Land/edit_land.dart new file mode 100644 index 0000000..13a7513 --- /dev/null +++ b/lib/screens/passo/Land/edit_land.dart @@ -0,0 +1,128 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; + +import 'package:im_stepper/stepper.dart'; +import 'package:unit2/model/passo/land_property_owner.dart'; +import 'package:unit2/screens/passo/Land/edit_land/land_appraisal.dart'; +import 'package:unit2/screens/passo/Land/edit_land/location_and_boundaries_edit.dart'; +import 'package:unit2/screens/passo/Land/edit_land/other_improvements_edit.dart'; +import 'package:unit2/screens/passo/Land/edit_land/property_assessment_cont_edit.dart'; +import 'package:unit2/screens/passo/Land/edit_land/property_assessment_edit.dart'; +import 'package:unit2/screens/passo/Land/edit_land/property_owner_info_edit.dart'; +import 'package:unit2/screens/passo/Land/edit_land/value_adjustments_edit.dart'; +import 'package:unit2/theme-data.dart/colors.dart'; + +GlobalKey landKey = GlobalKey(); + +class EditLand extends StatefulWidget { + final int index; + final LandPropertyOwner faas; + final String title; + + const EditLand( + {super.key, + required this.title, + required this.index, + required this.faas}); + @override + _EditLand createState() => _EditLand(); +} + +class _EditLand extends State { + // THE FOLLOWING TWO VARIABLES ARE REQUIRED TO CONTROL THE STEPPER. + int activeStep = 0; // Initial step set to 5. + + int upperBound = 6; // upperBound MUST BE total number of icons minus 1. + + void PrevBtn() { + setState(() { + activeStep--; + }); + } + + void NextBtn() { + setState(() { + activeStep++; + }); + } + + void onSAveAll() { + return Navigator.of(context).pop(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + centerTitle: true, + backgroundColor: primary, + title: Text('Land FAAS'), + ), + body: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + NumberStepper( + numbers: [1, 2, 3, 4, 5, 6, 7], + activeStepColor: primary, + numberStyle: TextStyle(color: Colors.white), + lineColor: primary, + // activeStep property set to activeStep variable defined above. + activeStep: activeStep, + activeStepBorderColor: Colors.white, + activeStepBorderWidth: 1, + // This ensures step-tapping updates the activeStep. + onStepReached: (index) { + setState(() { + activeStep = index; + }); + }, + ), + Expanded( + child: FormBuilder( + key: landKey, + + // enabled: false, + onChanged: () { + landKey.currentState?.save(); + + print(landKey.currentState?.value.toString()); + }, + autovalidateMode: AutovalidateMode.disabled, + skipDisabled: true, + child: Container( + child: content(PrevBtn, NextBtn, onSAveAll), + ), + ), + ), + ], + ), + ), + ); + } + + /// Returns the next button. + + // Returns the content widget based on the activeStep. + Widget content(PrevBtn, NextBtn, onSAveAll) { + switch (activeStep) { + case 0: + return LandPropertyOwnerInfoEdit(NextBtn, widget.faas!); + case 1: + return LandLocationAndBoundariesEdit(PrevBtn, NextBtn, widget.faas!); + case 2: + return LandAppraisalEdit(PrevBtn, NextBtn); + case 3: + return OtherImprovementEditPage(PrevBtn, NextBtn); + case 4: + return ValueAdjustmentEditPage(PrevBtn, NextBtn); + case 5: + return LandPropertyAssessmentEditPage(PrevBtn, NextBtn); + case 6: + return LandSignatoriesEdit(onSAveAll); + + default: + return LandPropertyOwnerInfoEdit(NextBtn, widget.faas!); + } + } +} diff --git a/lib/screens/passo/Land/edit_land/land_appraisal.dart b/lib/screens/passo/Land/edit_land/land_appraisal.dart new file mode 100644 index 0000000..9c6a6b2 --- /dev/null +++ b/lib/screens/passo/Land/edit_land/land_appraisal.dart @@ -0,0 +1,262 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:intl/intl.dart'; +import 'package:unit2/bloc/passo/land/land_appraisal/land_appraisal_bloc.dart'; +import 'package:unit2/model/passo/land_appr.dart'; +import 'package:unit2/screens/passo/Land/add_land/AddLandAppraisal.dart'; +import 'package:unit2/utils/alerts.dart'; +import 'package:unit2/utils/text_container.dart'; +import 'package:unit2/widgets/error_state.dart'; +import 'package:unit2/widgets/passo/custom_button.dart'; + +class LandAppraisalEdit extends StatefulWidget { + Function PrevBtn; + Function NextBtn; + LandAppraisalEdit(this.PrevBtn, this.NextBtn); + @override + _LandAppraisalEdit createState() => _LandAppraisalEdit(); +} + +class _LandAppraisalEdit extends State { + // double _totalMarketValue(items) { + // double total = 0; + // items.forEach((row) { + // total += double.parse(row); + // }); + // return total; + // } + + void deleteItem(int itemId) { + context.read().add(DeleteLandAppraisal(id: itemId)); + } + + @override + Widget build(BuildContext context) { + return BlocConsumer( + listener: (context, state) { + // TODO: implement listener + }, builder: (context, state) { + final state = context.watch().state; + if (state is LandAppraisalLoaded) { + return Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Column( + children: [ + Container( + margin: const EdgeInsets.only( + left: 0, top: 20, right: 0, bottom: 10), + child: const Text('LAND APPRAISAL', + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 18), + textAlign: TextAlign.left), + ), + Align( + alignment: Alignment.topRight, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.red, + ), + onPressed: () { + context + .read() + .add(ShowLandAppraisal()); + }, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Text('ADD ITEM'), // <-- Text + const SizedBox( + width: 5, + ), + const Icon( + // <-- Icon + Icons.add, + size: 24.0, + ), + ], + ), + ), + ), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: DataTable( + // ignore: prefer_const_literals_to_create_immutables + columns: [ + const DataColumn( + label: Text('Classification'), + ), + const DataColumn( + label: Text('Sub-Classification'), + ), + const DataColumn( + label: Text('Area'), + ), + const DataColumn( + label: Text('Unit Value'), + ), + const DataColumn( + label: Text('Base MArket Value'), + ), + const DataColumn( + label: Text('Action'), + ) + ], + rows: state.land_appr.map((dataRow) { + return DataRow( + cells: [ + DataCell(Text(dataRow.classification!)), + DataCell(Text(dataRow.subClass!)), + DataCell(Text(dataRow.area!)), + DataCell(Text( + ((double.parse(dataRow.unitValue!))) + .toString())), + DataCell(Text( + ((double.parse(dataRow.baseMarketval!))) + .toString())), + DataCell(Row( + children: [ + InkWell( + child: Container( + height: 30, + width: 30, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + child: Icon( + Icons.delete, + color: Colors.white, + size: 20.0, + ), + ), + onTap: () { + deleteItem(dataRow.id!); + }, + ), + SizedBox( + width: 10, + ), + InkWell( + child: Container( + height: 30, + width: 30, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + child: Icon( + Icons.edit, + color: Colors.white, + size: 20.0, + ), + ), + onTap: () {}, + ), + ], + )) + ], + ); + }).toList())) + ], + ), + ), + )), + // Padding( + // padding: const EdgeInsets.only(left: 20.0, right: 20.0), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // Text( + // 'Total', + // style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + // ), + // Text( + // NumberFormat.currency(locale: 'en-PH', symbol: "₱") + // .format('1.0'), + // style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + // ) + // ], + // ), + // ), + Padding( + padding: const EdgeInsets.all(15.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + CustomButton( + icon: const Icon(Icons.chevron_left_rounded, + color: Colors.white), + onPressed: () { + { + widget.PrevBtn(); + } + ; + }, + ), + CustomButton( + icon: const Icon(Icons.chevron_right_rounded, + color: Colors.white), + onPressed: () { + { + widget.NextBtn(); + } + ; + }, + ) + ], + ), + ), + ], + ); + } + if (state is LandAppraisalDeletedState) { + if (state.success) { + WidgetsBinding.instance.addPostFrameCallback((_) { + successAlert(context, "Deletion Successful", + "Extra item has been deleted successfully", () { + Navigator.of(context).pop(); + context.read().add(const LoadLandAppraisal()); + }); + }); + } + } + if (state is ShowAddLandAppraisalScreen) { + return ConstrainedBox( + constraints: BoxConstraints( + maxHeight: 700.0, + ), + child: AlertDialog( + insetPadding: EdgeInsets.symmetric( + horizontal: 20.0, + vertical: 10.0, + ), + title: Text( + 'ADD LAND APPRAISAL', + textAlign: TextAlign.center, + ), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container(child: AddLandAppraisalModal()), + ], + ), + ), + ); + } + if (state is LandAppraisalErrorState) { + return SomethingWentWrong( + message: onError, + onpressed: () { + context.read().add(LoadLandAppraisal()); + }, + ); + } + return Container(); + }); + } +} diff --git a/lib/screens/passo/Land/edit_land/location_and_boundaries_edit.dart b/lib/screens/passo/Land/edit_land/location_and_boundaries_edit.dart new file mode 100644 index 0000000..12f786d --- /dev/null +++ b/lib/screens/passo/Land/edit_land/location_and_boundaries_edit.dart @@ -0,0 +1,266 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:flutter_progress_hud/flutter_progress_hud.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; +import 'package:unit2/bloc/passo/land/land_boundaries_edit/land_boundaries_edit_bloc.dart'; +import 'package:unit2/bloc/passo/land/land_location_edit/land_location_edit_bloc.dart'; +import 'package:unit2/bloc/passo/land/land_property_owner_info/land_property_owner_info_bloc.dart'; +import 'package:unit2/model/passo/land_property_boundaries.dart'; +import 'package:unit2/model/passo/land_property_loc.dart'; +import 'package:unit2/model/passo/land_property_owner.dart'; +import 'package:unit2/screens/passo/Land/add_land.dart'; +import 'package:unit2/screens/passo/Land/edit_land/property_owner_info_edit.dart'; +import 'package:unit2/utils/text_container.dart'; +import 'package:unit2/widgets/error_state.dart'; +import 'package:unit2/widgets/passo/custom_button.dart'; +import 'package:unit2/widgets/passo/custom_formBuilder_fields.dart'; + +class LandLocationAndBoundariesEdit extends StatefulWidget { + Function PrevBtn; + Function NextBtn; + LandPropertyOwner land; + LandLocationAndBoundariesEdit(this.PrevBtn, this.NextBtn, this.land); + @override + _LandLocationAndBoundariesEdit createState() => + _LandLocationAndBoundariesEdit(); +} + +class _LandLocationAndBoundariesEdit + extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: ProgressHUD( + padding: const EdgeInsets.all(24), + backgroundColor: Colors.black87, + indicatorWidget: const SpinKitFadingCircle(color: Colors.white), + child: BlocConsumer( + listener: (context, state) { + if (state is LandLocationEditLoading) { + final progress = ProgressHUD.of(context); + progress!.showWithText("Please wait..."); + } + + if (state is LandLocationEditErrorState) { + final progress = ProgressHUD.of(context); + progress?.dismiss(); + } + }, + builder: (context, state) { + if (state is LandLocationEditLoaded) { + final landLoc = state.land_loc_edit; + return BlocConsumer( + listener: (context, state) { + if (state is LandLocationEditLoaded) { + final progress = ProgressHUD.of(context); + progress?.dismiss(); + } + if (state is LandBoundariesEditErrorState) { + final progress = ProgressHUD.of(context); + progress?.dismiss(); + } + }, + builder: (context, state) { + if (state is LandBoundariesEditLoaded) { + return FormBuilder( + key: landEditKey, + initialValue: { + 'street': landLoc.street, + 'brgy': landLoc.barangay, + 'municipality': landLoc.municipality, + 'province': landLoc.province + }, + enabled: true, + onChanged: () { + landEditKey.currentState!.save(); + debugPrint(landEditKey.currentState!.value.toString()); + }, + autovalidateMode: AutovalidateMode.disabled, + skipDisabled: true, + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: const EdgeInsets.only( + left: 0, top: 20, right: 0, bottom: 10), + child: const Text('PROPERTY LOCATION', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18), + textAlign: TextAlign.left), + ), + const SizedBox(height: 15), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: customTextField( + "No. / Street", "", "street")), + const SizedBox(width: 10.0), + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: customTextField( + "Brgy./District", "", "brgy")), + ], + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + flex: 1, + child: customTextField( + "Municipality", "", "municipality"), + ), + const SizedBox(width: 10.0), + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: customTextField( + "Province/City", "", "province")) + ]), + Container( + margin: const EdgeInsets.only( + left: 0, top: 20, right: 0, bottom: 10), + child: const Text('PROPERTY BOUNDARIES', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18), + textAlign: TextAlign.left), + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + flex: 1, + child: customTextField( + "North", "", "north"), + ), + const SizedBox(width: 10.0), + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: customTextField( + "East", "", "east")) + ]), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + flex: 1, + child: customTextField( + "South", "", "south"), + ), + const SizedBox(width: 10.0), + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: customTextField( + "West", "", "west")) + ]), + SizedBox( + height: 50, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + CustomButton( + icon: const Icon(Icons.chevron_left, + color: Colors.white), + onPressed: () { + widget.PrevBtn(); + }), + CustomButton( + icon: const Icon(Icons.chevron_right, + color: Colors.white), + onPressed: () { + print(widget.land.id); + var boundaries = + LandPropertyBoundaries( + id: widget.land.id, + north: landEditKey + .currentState?.value['north'], + east: landEditKey + .currentState?.value['east'], + west: landEditKey + .currentState?.value['west'], + south: landEditKey + .currentState?.value['south'], + ); + var location = LandPropertyLoc( + id: widget.land.id, + street: landEditKey + .currentState?.value['street'], + barangay: landEditKey + .currentState?.value['brgy'], + municipality: landEditKey + .currentState + ?.value['municipality'], + province: landEditKey.currentState + ?.value['province'], + ); + + context.read() + ..add(UpdateLandLocationEdit( + land_loc_edit: location, + id: widget.land.id!)); + + context.read() + ..add(UpdateLandBoundariesEdit( + land_boundaries_edit: + boundaries, + id: widget.land.id!)); + + widget.NextBtn(); + }) + ], + ) + ]), + ), + ), + ); + } + if (state is LandBoundariesEditErrorState) { + return SomethingWentWrong( + message: onError, + onpressed: () { + context.read().add( + LoadLandBoundariesEdit( + land_boundaries_edit: LandPropertyBoundaries(), + id: widget.land.id!)); + }, + ); + } + return Container(); + }, + ); + } + ; + if (state is LandLocationEditErrorState) { + return SomethingWentWrong( + message: onError, + onpressed: () { + context.read().add(LoadLandLocationEdit( + land_loc_edit: LandPropertyLoc(), id: widget.land.id!)); + }, + ); + } + return Container(); + }, + ), + ), + ); + } +} diff --git a/lib/screens/passo/Land/edit_land/other_improvements_edit.dart b/lib/screens/passo/Land/edit_land/other_improvements_edit.dart new file mode 100644 index 0000000..a750977 --- /dev/null +++ b/lib/screens/passo/Land/edit_land/other_improvements_edit.dart @@ -0,0 +1,263 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:unit2/bloc/passo/land/other_improvements/other_improvements_bloc.dart'; +import 'package:unit2/screens/passo/Land/add_land/AddOtherImprovementModal.dart'; +import 'package:unit2/utils/alerts.dart'; +import 'package:unit2/widgets/passo/custom_button.dart'; + +class OtherImprovementEditPage extends StatefulWidget { + Function PrevBtn; + Function NextBtn; + OtherImprovementEditPage(this.PrevBtn, this.NextBtn); + @override + _OtherImprovementEditPage createState() => _OtherImprovementEditPage(); +} + +class _OtherImprovementEditPage extends State { + // double _totalMarketValue(items) { + // double total = 0; + // items.forEach((row) { + // total += double.parse(row); + // }); + // return total; + // } + + void deleteItem(int itemId) { + context + .read() + .add(DeleteOtherImprovement(id: itemId)); + } + + @override + Widget build(BuildContext context) { + return BlocConsumer( + listener: (context, state) { + // TODO: implement listener + }, builder: (context, state) { + final state = context.watch().state; + if (state is OtherImprovementLoaded) { + return Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Column( + children: [ + Container( + margin: const EdgeInsets.only( + left: 0, top: 20, right: 0, bottom: 10), + child: const Text('OTHER IMPROVEMENTS', + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 18), + textAlign: TextAlign.left), + ), + Align( + alignment: Alignment.topRight, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.red, + ), + onPressed: () { + context + .read() + .add(ShowOtherImprovement()); + }, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Text('ADD ITEM'), // <-- Text + const SizedBox( + width: 5, + ), + const Icon( + // <-- Icon + Icons.add, + size: 24.0, + ), + ], + ), + ), + ), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: DataTable( + // ignore: prefer_const_literals_to_create_immutables + columns: [ + const DataColumn( + label: Text('Kinds of Tress'), + ), + const DataColumn( + label: Text('Sub-Class / Age'), + ), + const DataColumn( + label: Text('Type of Tree'), + ), + const DataColumn( + label: Text('No.'), + ), + const DataColumn( + label: Text('No. of Productive'), + ), + const DataColumn( + label: Text('No. of Non-Productive'), + ), + const DataColumn( + label: Text('Unit Value'), + ), + const DataColumn( + label: Text('Base Market Value'), + ), + const DataColumn( + label: Text('Action'), + ) + ], + rows: state.other_imp.map((dataRow) { + return DataRow( + cells: [ + DataCell(Text(dataRow.kindsOfTrees!)), + DataCell(Text(dataRow.subclassAge!)), + DataCell(Text(dataRow.fruitBearing! + ? "Fruit Bearing" + : "Non-Fruit Bearing")), + DataCell(Text(dataRow.quantity.toString()!)), + DataCell( + Text(dataRow.noOfProductive.toString()!)), + DataCell(Text( + dataRow.noOfNonproductive.toString()!)), + DataCell(Text(dataRow.unitValue.toString()!)), + DataCell( + Text(dataRow.baseMarketval.toString()!)), + DataCell(Row( + children: [ + InkWell( + child: Container( + height: 30, + width: 30, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + child: Icon( + Icons.delete, + color: Colors.white, + size: 20.0, + ), + ), + onTap: () { + deleteItem(dataRow.id!); + }, + ), + SizedBox( + width: 10, + ), + InkWell( + child: Container( + height: 30, + width: 30, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + child: Icon( + Icons.edit, + color: Colors.white, + size: 20.0, + ), + ), + onTap: () {}, + ), + ], + )) + ], + ); + }).toList())) + ], + ), + ), + )), + // Padding( + // padding: const EdgeInsets.only(left: 20.0, right: 20.0), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // Text( + // 'Total', + // style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + // ), + // Text( + // NumberFormat.currency(locale: 'en-PH', symbol: "₱") + // .format('1.0'), + // style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + // ) + // ], + // ), + // ), + Padding( + padding: const EdgeInsets.all(15.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + CustomButton( + icon: const Icon(Icons.chevron_left_rounded, + color: Colors.white), + onPressed: () { + { + widget.PrevBtn(); + } + ; + }, + ), + CustomButton( + icon: const Icon(Icons.chevron_right_rounded, + color: Colors.white), + onPressed: () { + { + widget.NextBtn(); + } + ; + }, + ) + ], + ), + ), + ], + ); + } + if (state is OtherImprovementDeletedState) { + if (state.success) { + WidgetsBinding.instance.addPostFrameCallback((_) { + successAlert(context, "Deletion Successful", + "Extra item has been deleted successfully", () { + Navigator.of(context).pop(); + context + .read() + .add(const LoadOtherImprovement()); + }); + }); + } + } + if (state is ShowAddOtherImprovementScreen) { + return ConstrainedBox( + constraints: BoxConstraints(maxHeight: 1000.0), + child: AlertDialog( + insetPadding: EdgeInsets.symmetric( + horizontal: 20.0, + vertical: 10.0, + ), + title: Text( + 'ADD OTHER IMPROVEMENTS', + textAlign: TextAlign.center, + ), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [Container(child: AddOtherImprovementModal())], + ), + ), + ); + } + return Container(); + }); + } +} diff --git a/lib/screens/passo/Land/edit_land/property_assessment_cont_edit.dart b/lib/screens/passo/Land/edit_land/property_assessment_cont_edit.dart new file mode 100644 index 0000000..efc7768 --- /dev/null +++ b/lib/screens/passo/Land/edit_land/property_assessment_cont_edit.dart @@ -0,0 +1,541 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:form_builder_validators/form_builder_validators.dart'; +import 'package:searchfield/searchfield.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:unit2/bloc/passo/land/land_ext/land_ext_bloc.dart'; +import 'package:unit2/bloc/passo/memoranda/memoranda_bloc.dart'; +import 'package:unit2/bloc/passo/signatories/signatories_bloc.dart'; +import 'package:unit2/model/passo/land_ext.dart'; +import 'package:unit2/model/passo/memoranda.dart'; +import 'package:unit2/model/passo/signatories.dart'; +import 'package:unit2/screens/passo/Land/add_land.dart'; +import 'package:unit2/theme-data.dart/colors.dart'; + +class LandSignatoriesEdit extends StatefulWidget { + Function onSAve; + LandSignatoriesEdit(this.onSAve); + + @override + _LandSignatoriesEdit createState() => _LandSignatoriesEdit(); +} + +class _LandSignatoriesEdit extends State { + bool isTaxable = false; + bool isExempt = false; + final focus = FocusNode(); + String _memoranda = ""; + @override + Widget build(BuildContext context) { + return BlocConsumer( + listener: (context, state) { + // TODO: implement listener + }, + builder: (context, state) { + if (state is LandExtLoaded) { + return BlocConsumer( + listener: (context, state) { + // TODO: implement listener + }, + builder: (context, state) { + if (state is SignatoriesLoaded) { + final signatories = state.signatories; + return BlocConsumer( + listener: (context, state) { + // TODO: implement listener + }, + builder: (context, state) { + if (state is MemorandaLoaded) { + return SingleChildScrollView( + child: Column( + children: [ + Container( + margin: const EdgeInsets.only( + left: 0, top: 20, right: 0, bottom: 10), + child: const Text('PROPERTY ASSESSMENT cont..', + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 18), + textAlign: TextAlign.left), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Row( + children: [ + const Text('Taxable'), + Checkbox( + checkColor: Colors.white, + value: isTaxable, + onChanged: (bool? value) { + setState(() { + isTaxable = value!; + }); + }, + ) + ], + ), + Row( + children: [ + const Text('Exempt'), + Checkbox( + checkColor: Colors.white, + value: isExempt, + onChanged: (bool? value) { + setState(() { + isExempt = value!; + }); + }, + ) + ], + ), + ], + ), + Column( + children: [ + const SizedBox( + height: 20, + ), + const Text( + 'EFFECTIVITY OF ASSESSMENT / REASSESSMENT :', + style: TextStyle(fontWeight: FontWeight.bold), + ), + const SizedBox( + height: 20, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceAround, + children: [ + const Text('Qtr.'), + SizedBox( + width: 70, + height: 25, + child: FormBuilderTextField( + name: 'land_qtr', + validator: + FormBuilderValidators.compose([]), + ), + ), + const SizedBox( + width: 20, + ), + const Text('Yr.'), + SizedBox( + width: 70, + height: 25, + child: FormBuilderTextField( + name: 'land_yr', + validator: + FormBuilderValidators.compose([]), + ), + ), + ], + ), + ], + ), + Container( + margin: const EdgeInsets.only( + left: 0, top: 40, right: 0, bottom: 10), + child: const Text('SIGNATORIES', + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 18), + textAlign: TextAlign.left), + ), + const SizedBox( + height: 30, + ), + Align( + alignment: Alignment.centerLeft, + child: Text( + 'APPRAISED/ASSESSED BY:', + style: TextStyle(fontWeight: FontWeight.bold), + textAlign: TextAlign.start, + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + children: [ + SizedBox( + width: 200, + child: FormBuilderDropdown( + name: 'appraised_by_land', + autofocus: false, + items: signatories + .map((signatories) => + DropdownMenuItem( + value: signatories, + child: Text( + '${signatories.firstname} ${signatories.middlename} ${signatories.lastname}'), + )) + .toList()), + ), + Text('Name'), + ], + ), + const SizedBox( + width: 15, + ), + Column( + children: [ + SizedBox( + width: 100, + child: FormBuilderDateTimePicker( + name: 'app_date_land', + initialEntryMode: + DatePickerEntryMode.calendarOnly, + initialValue: DateTime.now(), + inputType: InputType.date, + + initialTime: + const TimeOfDay(hour: 8, minute: 0), + // locale: const Locale.fromSubtags(languageCode: 'fr'), + ), + ), + Text('Date'), + ], + ), + ], + ), + const SizedBox( + height: 30, + ), + const Align( + alignment: Alignment.centerLeft, + child: Text( + 'RECOMMENDING APPROVAL:', + style: TextStyle(fontWeight: FontWeight.bold), + )), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + children: [ + SizedBox( + width: 200, + child: FormBuilderDropdown( + name: 'rec_approval_land', + autofocus: false, + items: signatories + .map((signatories) => + DropdownMenuItem( + value: signatories, + child: Text( + '${signatories.firstname} ${signatories.middlename} ${signatories.lastname}'), + )) + .toList()), + ), + Text('Name'), + ], + ), + const SizedBox( + width: 15, + ), + Column( + children: [ + SizedBox( + width: 100, + child: FormBuilderDateTimePicker( + name: 'rec_date_land', + initialEntryMode: + DatePickerEntryMode.calendarOnly, + initialValue: DateTime.now(), + inputType: InputType.date, + + initialTime: + const TimeOfDay(hour: 8, minute: 0), + // locale: const Locale.fromSubtags(languageCode: 'fr'), + ), + ), + Text('Date'), + ], + ), + ], + ), + const SizedBox( + height: 30, + ), + const Align( + alignment: Alignment.centerLeft, + child: Text( + 'APPROVED BY:', + style: TextStyle( + fontWeight: FontWeight.bold, + ), + )), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Column( + children: [ + SizedBox( + width: 200, + child: FormBuilderDropdown( + name: 'apprvd_by_land', + autofocus: false, + items: signatories + .map((signatories) => + DropdownMenuItem( + value: signatories, + child: Text( + '${signatories.firstname} ${signatories.middlename} ${signatories.lastname}'), + )) + .toList()), + ), + Text('Name'), + ], + ), + const SizedBox( + width: 15, + ), + Column( + children: [ + SizedBox( + width: 100, + child: FormBuilderDateTimePicker( + name: 'apprvd_by_date_land', + initialEntryMode: + DatePickerEntryMode.calendarOnly, + initialValue: DateTime.now(), + inputType: InputType.date, + + initialTime: + const TimeOfDay(hour: 8, minute: 0), + // locale: const Locale.fromSubtags(languageCode: 'fr'), + ), + ), + Text('Date'), + ], + ), + ], + ), + const SizedBox( + height: 50, + ), + const Align( + alignment: Alignment.centerLeft, + child: Text( + 'MEMORANDA: ', + style: TextStyle( + fontWeight: FontWeight.bold, + ), + )), + SizedBox( + height: 50, + ), + SizedBox( + width: 500, + height: 100, + child: SearchField( + suggestions: state.memorada + .map((Memoranda memoranda) => + SearchFieldListItem( + '${memoranda.memoranda}', + item: + memoranda, // Change: Use individual Memoranda object + child: ListTile( + title: Text( + '${memoranda.memoranda}', + overflow: TextOverflow.ellipsis, + ), + ), + )) + .toList(), + validator: FormBuilderValidators.required( + errorText: "This field is required"), + // searchInputDecoration: + // normalTextFieldStyle( + // "Memoranda", "") + // .copyWith( + // suffixIcon: const Icon( + // Icons.arrow_drop_down), + // ), + // focusNode: focus, + suggestionState: Suggestion.expand, + onSuggestionTap: (memoranda) { + setState(() { + _memoranda = memoranda.item!.memoranda!; + }); + focus.unfocus(); + }, + )), + SizedBox( + height: 30, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Sworn Statement No. :'), + SizedBox( + width: 150, + height: 20, + child: FormBuilderTextField( + name: 'sworn_statement_land', + decoration: InputDecoration(), + validator: FormBuilderValidators.compose([]), + ), + ), + ], + ), + SizedBox( + height: 30, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Date Received:'), + SizedBox( + width: 150, + height: 20, + child: FormBuilderDateTimePicker( + name: 'date_received_land', + initialEntryMode: + DatePickerEntryMode.calendarOnly, + initialValue: DateTime.now(), + inputType: InputType.date, + + initialTime: + const TimeOfDay(hour: 8, minute: 0), + // locale: const Locale.fromSubtags(languageCode: 'fr'), + ), + ), + ], + ), + SizedBox( + height: 30, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Date of Entry in the Rec. of Ass. :'), + SizedBox( + width: 100, + height: 20, + child: FormBuilderDateTimePicker( + name: 'date_of_entry_land', + initialEntryMode: + DatePickerEntryMode.calendarOnly, + initialValue: DateTime.now(), + inputType: InputType.date, + + initialTime: + const TimeOfDay(hour: 8, minute: 0), + // locale: const Locale.fromSubtags(languageCode: 'fr'), + ), + ), + ], + ), + SizedBox( + height: 30, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('By:'), + SizedBox( + width: 150, + height: 20, + child: FormBuilderTextField( + name: 'by_land', + decoration: InputDecoration(), + validator: FormBuilderValidators.compose([]), + ), + ), + ], + ), + SizedBox( + height: 30, + ), + ElevatedButton( + onPressed: () async { + final tempID = + await SharedPreferences.getInstance(); + var ext = LandExt( + landapprDetailsId: + tempID.getInt('landid')! - 1, + taxable: isTaxable, + exempt: isExempt, + qtr: int.parse( + landKey.currentState!.value['land_qtr']), + yr: int.parse( + landKey.currentState!.value['land_yr']), + appraisedbyName: landKey.currentState!.value['appraised_by_land'].firstname + + ' ' + + landKey + .currentState! + .value['appraised_by_land'] + .middlename + + ' ' + + landKey.currentState! + .value['appraised_by_land'].lastname, + appraisedbyDate: landKey + .currentState!.value['app_date_land'], + recommendapprName: landKey + .currentState! + .value['rec_approval_land'] + .firstname + + ' ' + + landKey + .currentState! + .value['rec_approval_land'] + .middlename + + ' ' + + landKey.currentState! + .value['rec_approval_land'].lastname, + recommendapprDate: landKey + .currentState!.value['rec_date_land'], + approvedbyName: landKey.currentState!.value['apprvd_by_land'].firstname + + ' ' + + landKey.currentState!.value['apprvd_by_land'].middlename + + ' ' + + landKey.currentState!.value['apprvd_by_land'].lastname, + approvedbyDate: landKey.currentState!.value['apprvd_by_date_land'], + memoranda: _memoranda, + swornstatementNo: landKey.currentState!.value['sworn_statement_land'], + dateReceived: landKey.currentState!.value['date_received_land'], + entryDateAssessment: landKey.currentState!.value['date_of_entry_land'], + entryDateBy: landKey.currentState!.value['by_land']); + + context.read() + ..add(UpdateLandExt(landext: ext)); + widget.onSAve(); + }, + style: ElevatedButton.styleFrom( + backgroundColor: primary, + foregroundColor: Colors.red), + child: SizedBox( + width: 250, + height: 50, + child: Align( + alignment: Alignment.center, + child: Text( + 'Save', + style: TextStyle( + color: Colors.white, + ), + textAlign: TextAlign.center, + ), + ), + ), + ), + SizedBox( + height: 30, + ), + ], + )); + } + return Container(); + }, + ); + } + return Container(); + }, + ); + } + return Container(); + }, + ); + } +} diff --git a/lib/screens/passo/Land/edit_land/property_assessment_edit.dart b/lib/screens/passo/Land/edit_land/property_assessment_edit.dart new file mode 100644 index 0000000..b009435 --- /dev/null +++ b/lib/screens/passo/Land/edit_land/property_assessment_edit.dart @@ -0,0 +1,245 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:unit2/bloc/passo/land/land_property_assessment/land_property_assessment_bloc.dart'; +import 'package:unit2/screens/passo/Land/add_land/AddPropertyAssessmentModal.dart'; +import 'package:unit2/utils/alerts.dart'; +import 'package:unit2/widgets/passo/custom_button.dart'; + +class LandPropertyAssessmentEditPage extends StatefulWidget { + Function PrevBtn; + Function NextBtn; + LandPropertyAssessmentEditPage(this.PrevBtn, this.NextBtn); + @override + _LandPropertyAssessmentEditPage createState() => + _LandPropertyAssessmentEditPage(); +} + +class _LandPropertyAssessmentEditPage + extends State { + // double _totalMarketValue(items) { + // double total = 0; + // items.forEach((row) { + // total += double.parse(row); + // }); + // return total; + // } + + void deleteItem(int itemId) { + context + .read() + .add(DeleteLandPropertyAssessment(id: itemId)); + } + + @override + Widget build(BuildContext context) { + return BlocConsumer(listener: (context, state) { + // TODO: implement listener + }, builder: (context, state) { + final state = context.watch().state; + if (state is LandPropertyAssessmentLoaded) { + return Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Column( + children: [ + Container( + margin: const EdgeInsets.only( + left: 0, top: 20, right: 0, bottom: 10), + child: const Text('PROPERTY ASSESSMENT', + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 18), + textAlign: TextAlign.left), + ), + Align( + alignment: Alignment.topRight, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.red, + ), + onPressed: () { + context + .read() + .add(ShowLandPropertyAssessment()); + }, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Text('ADD ITEM'), // <-- Text + const SizedBox( + width: 5, + ), + const Icon( + // <-- Icon + Icons.add, + size: 24.0, + ), + ], + ), + ), + ), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: DataTable( + // ignore: prefer_const_literals_to_create_immutables + columns: [ + const DataColumn( + label: Text('Actual Use'), + ), + const DataColumn( + label: Text('Market Value'), + ), + const DataColumn( + label: Text('Assessment Level'), + ), + const DataColumn( + label: Text('Assessed Value'), + ), + const DataColumn( + label: Text('Action'), + ) + ], + rows: state.assessment.map((dataRow) { + return DataRow( + cells: [ + DataCell(Text(dataRow.actualUse!)), + DataCell(Text(dataRow.marketval!)), + DataCell( + Text(dataRow.assessmentLevel! + '%')), + DataCell(Text(dataRow.assessedValue!)), + DataCell(Row( + children: [ + InkWell( + child: Container( + height: 30, + width: 30, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + child: Icon( + Icons.delete, + color: Colors.white, + size: 20.0, + ), + ), + onTap: () { + deleteItem(dataRow.id!); + }, + ), + SizedBox( + width: 10, + ), + InkWell( + child: Container( + height: 30, + width: 30, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + child: Icon( + Icons.edit, + color: Colors.white, + size: 20.0, + ), + ), + onTap: () {}, + ), + ], + )) + ], + ); + }).toList())) + ], + ), + ), + )), + // Padding( + // padding: const EdgeInsets.only(left: 20.0, right: 20.0), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // Text( + // 'Total', + // style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + // ), + // Text( + // NumberFormat.currency(locale: 'en-PH', symbol: "₱") + // .format('1.0'), + // style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + // ) + // ], + // ), + // ), + Padding( + padding: const EdgeInsets.all(15.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + CustomButton( + icon: const Icon(Icons.chevron_left_rounded, + color: Colors.white), + onPressed: () { + { + widget.PrevBtn(); + } + ; + }, + ), + CustomButton( + icon: const Icon(Icons.chevron_right_rounded, + color: Colors.white), + onPressed: () { + { + widget.NextBtn(); + } + ; + }, + ) + ], + ), + ), + ], + ); + } + if (state is LandPropertyAssessmentDeletedState) { + if (state.success) { + WidgetsBinding.instance.addPostFrameCallback((_) { + successAlert(context, "Deletion Successful", + "Extra item has been deleted successfully", () { + Navigator.of(context).pop(); + context + .read() + .add(const LoadLandPropertyAssessment()); + }); + }); + } + } + if (state is ShowAddLandPropertyAssessmentScreen) { + return ConstrainedBox( + constraints: BoxConstraints(maxHeight: 1000.0), + child: AlertDialog( + insetPadding: EdgeInsets.symmetric( + horizontal: 20.0, + vertical: 10.0, + ), + title: Text( + 'ADD PROPERTY ASSESSMENT', + textAlign: TextAlign.center, + ), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [Container(child: AddPropertyAssessmentModal())], + ), + ), + ); + } + return Container(); + }); + } +} diff --git a/lib/screens/passo/Land/edit_land/property_owner_info_edit.dart b/lib/screens/passo/Land/edit_land/property_owner_info_edit.dart new file mode 100644 index 0000000..73fddbf --- /dev/null +++ b/lib/screens/passo/Land/edit_land/property_owner_info_edit.dart @@ -0,0 +1,223 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:unit2/bloc/passo/land/land_property_owner_info/land_property_owner_info_bloc.dart'; +import 'package:unit2/model/passo/land_property_owner.dart'; +import 'package:unit2/screens/passo/Land/add_land.dart'; +import 'package:unit2/widgets/passo/custom_button.dart'; +import 'package:unit2/widgets/passo/custom_formBuilder_fields.dart'; + +GlobalKey landEditKey = GlobalKey(); + +class LandPropertyOwnerInfoEdit extends StatefulWidget { + Function NextBtn; + LandPropertyOwner land; + LandPropertyOwnerInfoEdit(this.NextBtn, this.land); + @override + _LandPropertyOwnerInfoEdit createState() => _LandPropertyOwnerInfoEdit(); +} + +class _LandPropertyOwnerInfoEdit extends State { + final transaction_codes = ['New', 'Revision']; + @override + Widget build(BuildContext context) { + return BlocConsumer( + listener: (context, state) { + // TODO: implement listener + }, + builder: (context, state) { + return FormBuilder( + key: landEditKey, + initialValue: { + 'transaction_code': widget.land.transCode ?? '', + 'td_no': widget.land.tdn ?? '', + 'owner': widget.land.owner ?? '', + 'pin': widget.land.pin ?? '', + 'tin': widget.land.tin ?? '', + 'cloa_no': widget.land.cloaNo ?? '', + 'dated': widget.land.dated ?? '', + 'survey_no': widget.land.surveyNo ?? '', + 'lot_no': widget.land.lotNo ?? '', + 'blk': widget.land.blkNo ?? '', + 'address': widget.land.address ?? '', + 'tel_no': widget.land.telno ?? '', + 'admin': widget.land.adminUser ?? '', + 'admin_tin': widget.land.adminTin ?? '', + 'admin_address': widget.land.adminAddress ?? '', + 'admin_telno': widget.land.adminTelno ?? '', + }, + enabled: true, + onChanged: () { + landEditKey.currentState!.save(); + debugPrint(landEditKey.currentState!.value.toString()); + }, + autovalidateMode: AutovalidateMode.disabled, + skipDisabled: true, + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: const EdgeInsets.only( + left: 0, top: 20, right: 0, bottom: 10), + child: const Text('PROPERTY OWNER INFO', + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 18), + textAlign: TextAlign.left), + ), + const SizedBox(height: 15), + customDropDownField("Transaction Code", "", + "transaction_code", transaction_codes), + customTextField("ARP No./ TD No.", "", "td_no"), + customTextField("Owner", "", "owner"), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + flex: 1, child: customTextField("PIN", "", "pin")), + const SizedBox(width: 10.0), + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: customTextField("TIN", "", "tin")) + ]), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + flex: 1, + child: customTextField( + "OCT/TCT CLOA No.", "", "cloa_no"), + ), + const SizedBox(width: 10.0), + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: customDatTimePicker("Dated", "", "dated")) + ]), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + flex: 1, + child: customTextField("Survey No.", "", "survey_no"), + ), + const SizedBox(width: 10.0), + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: customTextField("Lot No.", "", "lot_no")), + const SizedBox(width: 10.0), + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: customTextField("Blk", "", "blk")), + ]), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + flex: 1, + child: customTextField("Address", "", "address"), + ), + const SizedBox(width: 10.0), + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: customTextField("Tel No.", "", "tel_no")) + ]), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + flex: 1, + child: customTextField( + "Administrator/Beneficial User", "", "admin"), + ), + const SizedBox(width: 10.0), + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: customTextField("TIN", "", "admin_tin")) + ]), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + flex: 1, + child: + customTextField("Address", "", "admin_address"), + ), + const SizedBox(width: 10.0), + Expanded( + // optional flex property if flex is 1 because the default flex is 1 + flex: 1, + child: + customTextField("Tel No.", "", "admin_telno")) + ]), + SizedBox( + height: 30, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CustomButton( + icon: const Icon(Icons.chevron_right, + color: Colors.white), + onPressed: () { + var land = LandPropertyOwner( + id: widget.land.id, + transCode: landEditKey + .currentState!.value['transaction_code'] + .toString(), + tdn: landEditKey.currentState!.value['td_no'], + cloaNo: + landEditKey.currentState!.value['cloa_no'], + dated: landEditKey.currentState!.value['dated'], + assessedById: "1", + assessedByName: "cyril", + dateCreated: + landEditKey.currentState!.value['dated'], + dateModified: + landEditKey.currentState!.value['dated'], + pin: landEditKey.currentState!.value['pin'], + surveyNo: + landEditKey.currentState!.value['survey_no'], + lotNo: landEditKey.currentState!.value['lot_no'], + blkNo: landEditKey.currentState!.value['blk'], + owner: landEditKey.currentState!.value['owner'], + address: + landEditKey.currentState!.value['address'], + telno: landEditKey.currentState!.value['tel_no'], + tin: landEditKey.currentState!.value['tin'], + adminUser: + landEditKey.currentState!.value['admin'], + adminAddress: landEditKey + .currentState!.value['admin_address'], + adminTin: + landEditKey.currentState!.value['admin_tin'], + // faasType: "LAND", + adminTelno: landEditKey + .currentState!.value['admin_telno']); + + context.read().add( + UpdateLandPropertyOwner( + land_edit: land, id: widget.land.id!)); + + widget.NextBtn(); + }, + ) + ], + ), + const SizedBox( + height: 20, + ), + ]), + )), + ); + }, + ); + } +} diff --git a/lib/screens/passo/Land/edit_land/value_adjustments_edit.dart b/lib/screens/passo/Land/edit_land/value_adjustments_edit.dart new file mode 100644 index 0000000..6dabf25 --- /dev/null +++ b/lib/screens/passo/Land/edit_land/value_adjustments_edit.dart @@ -0,0 +1,246 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:unit2/bloc/passo/land/land_value_adjustments/land_value_adjustments_bloc.dart'; +import 'package:unit2/screens/passo/Land/add_land/AddLandValueAdjustmentModal.dart'; +import 'package:unit2/utils/alerts.dart'; +import 'package:unit2/widgets/passo/custom_button.dart'; + +class ValueAdjustmentEditPage extends StatefulWidget { + Function PrevBtn; + Function NextBtn; + ValueAdjustmentEditPage(this.PrevBtn, this.NextBtn); + @override + _ValueAdjustmentEditPage createState() => _ValueAdjustmentEditPage(); +} + +class _ValueAdjustmentEditPage extends State { + // double _totalMarketValue(items) { + // double total = 0; + // items.forEach((row) { + // total += double.parse(row); + // }); + // return total; + // } + + void deleteItem(int itemId) { + context + .read() + .add(DeleteLandValueAdjustments(id: itemId)); + } + + @override + Widget build(BuildContext context) { + return BlocConsumer( + listener: (context, state) { + // TODO: implement listener + }, builder: (context, state) { + final state = context.watch().state; + if (state is LandValueAdjustmentsLoaded) { + return Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Column( + children: [ + Container( + margin: const EdgeInsets.only( + left: 0, top: 20, right: 0, bottom: 10), + child: const Text('VALUE ADJUSTMENTS', + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 18), + textAlign: TextAlign.left), + ), + Align( + alignment: Alignment.topRight, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.red, + ), + onPressed: () { + context + .read() + .add(ShowLandValueAdjustments()); + }, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Text('ADD ITEM'), // <-- Text + const SizedBox( + width: 5, + ), + const Icon( + // <-- Icon + Icons.add, + size: 24.0, + ), + ], + ), + ), + ), + SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: DataTable( + // ignore: prefer_const_literals_to_create_immutables + columns: [ + const DataColumn( + label: Text('Base Market Value'), + ), + const DataColumn( + label: Text('Adjustment Factors'), + ), + const DataColumn( + label: Text('% Adjustment'), + ), + const DataColumn( + label: Text('Value Adjustment'), + ), + const DataColumn( + label: Text('Market Value'), + ), + const DataColumn( + label: Text('Action'), + ) + ], + rows: state.val_adj.map((dataRow) { + return DataRow( + cells: [ + DataCell(Text(dataRow.baseMarketval!)), + DataCell(Text(dataRow.adjustmentFactors!)), + DataCell(Text(dataRow.adjustment!)), + DataCell(Text(dataRow.valueAdjustment!)), + DataCell(Text(dataRow.marketValue!)), + DataCell(Row( + children: [ + InkWell( + child: Container( + height: 30, + width: 30, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + child: Icon( + Icons.delete, + color: Colors.white, + size: 20.0, + ), + ), + onTap: () { + deleteItem(dataRow.id!); + }, + ), + SizedBox( + width: 10, + ), + InkWell( + child: Container( + height: 30, + width: 30, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + child: Icon( + Icons.edit, + color: Colors.white, + size: 20.0, + ), + ), + onTap: () {}, + ), + ], + )) + ], + ); + }).toList())) + ], + ), + ), + )), + // Padding( + // padding: const EdgeInsets.only(left: 20.0, right: 20.0), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // Text( + // 'Total', + // style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + // ), + // Text( + // NumberFormat.currency(locale: 'en-PH', symbol: "₱") + // .format('1.0'), + // style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15), + // ) + // ], + // ), + // ), + Padding( + padding: const EdgeInsets.all(15.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + CustomButton( + icon: const Icon(Icons.chevron_left_rounded, + color: Colors.white), + onPressed: () { + { + widget.PrevBtn(); + } + ; + }, + ), + CustomButton( + icon: const Icon(Icons.chevron_right_rounded, + color: Colors.white), + onPressed: () { + { + widget.NextBtn(); + } + ; + }, + ) + ], + ), + ), + ], + ); + } + if (state is LandValueAdjustmentsDeletedState) { + if (state.success) { + WidgetsBinding.instance.addPostFrameCallback((_) { + successAlert(context, "Deletion Successful", + "Extra item has been deleted successfully", () { + Navigator.of(context).pop(); + context + .read() + .add(const LoadLandValueAdjustments()); + }); + }); + } + } + if (state is ShowAddLandValueAdjustmentsScreen) { + return ConstrainedBox( + constraints: BoxConstraints(maxHeight: 1000.0), + child: AlertDialog( + insetPadding: EdgeInsets.symmetric( + horizontal: 20.0, + vertical: 10.0, + ), + title: Text( + 'ADD VALUE ADJUSTMENTS', + textAlign: TextAlign.center, + ), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [Expanded(child: AddLandValueAdjustmentModal())], + ), + ), + ); + } + return Container(); + }); + } +} diff --git a/lib/screens/passo/land_home .dart b/lib/screens/passo/land_home .dart index 5ee23c1..91e26bc 100644 --- a/lib/screens/passo/land_home .dart +++ b/lib/screens/passo/land_home .dart @@ -18,8 +18,10 @@ import 'package:unit2/bloc/passo/bulding/property_info/property_info_bloc.dart'; import 'package:unit2/bloc/passo/bulding/structural_material/structural_material_bloc.dart'; import 'package:unit2/bloc/passo/bulding/unit_construct/unit_construct_bloc.dart'; import 'package:unit2/bloc/passo/land/land_appraisal/land_appraisal_bloc.dart'; +import 'package:unit2/bloc/passo/land/land_boundaries_edit/land_boundaries_edit_bloc.dart'; import 'package:unit2/bloc/passo/land/land_classification/land_classification_bloc.dart'; import 'package:unit2/bloc/passo/land/land_ext/land_ext_bloc.dart'; +import 'package:unit2/bloc/passo/land/land_location_edit/land_location_edit_bloc.dart'; import 'package:unit2/bloc/passo/land/land_property_assessment/land_property_assessment_bloc.dart'; import 'package:unit2/bloc/passo/land/land_property_owner_info/land_property_owner_info_bloc.dart'; import 'package:unit2/bloc/passo/land/land_subclassification/land_subclassification_bloc.dart'; @@ -37,6 +39,8 @@ import 'package:unit2/bloc/passo/signatories/signatories_bloc.dart'; import 'package:unit2/bloc/user/user_bloc.dart'; import 'package:unit2/model/passo/additional_items.dart'; import 'package:unit2/model/passo/general_description.dart'; +import 'package:unit2/model/passo/land_property_boundaries.dart'; +import 'package:unit2/model/passo/land_property_loc.dart'; import 'package:unit2/model/passo/land_property_owner.dart'; import 'package:unit2/model/passo/land_ref.dart'; import 'package:unit2/model/passo/property_appraisal.dart'; @@ -49,6 +53,7 @@ import 'package:unit2/model/profile/basic_information/primary-information.dart'; import 'package:unit2/screens/passo/Building/add_building.dart'; import 'package:unit2/screens/passo/Building/edit_building.dart'; import 'package:unit2/screens/passo/Land/add_land.dart'; +import 'package:unit2/screens/passo/Land/edit_land.dart'; import 'package:unit2/screens/passo/Test%20Envi/multi_dropdown.dart'; import 'package:unit2/screens/passo/Test%20Envi/speed_dial.dart'; import 'package:unit2/theme-data.dart/colors.dart'; @@ -283,79 +288,72 @@ Card _listCard(LandPropertyOwner property_info, context, index) { padding: const EdgeInsets.all(15.0), child: InkWell( onTap: () async { - // Navigator.push(context, - // MaterialPageRoute(builder: (BuildContext context) { - // return MultiBlocProvider( - // providers: [ - // BlocProvider( - // create: (context) => - // PropertyInfoBloc()..add(LoadPropertyInfo()), - // ), - // BlocProvider( - // create: (context) => - // UnitConstructBloc()..add(LoadUnitConstruct()), - // ), - // BlocProvider( - // create: (context) => - // ClassComponentsBloc()..add(LoadClassComponents()), - // ), - // BlocProvider( - // create: (context) => - // SignatoriesBloc()..add(LoadSignatories())), - // BlocProvider( - // create: (context) => LocationBloc() - // ..add( - // LoadLocation(bldgloc: BldgLoc(), id: property_info.id)), - // ), - // BlocProvider( - // create: (context) => LandrefBloc() - // ..add( - // LoadLandref(landRef: LandRef(), id: property_info.id)), - // ), - // BlocProvider( - // create: (context) => GeneralDescriptionBloc() - // ..add(LoadGenDesc( - // gendesc: GeneralDesc(), id: property_info.id)), - // ), - // BlocProvider( - // create: (context) => AdditionalItemsEditBloc() - // ..add(LoadAdditionalItemsEdit( - // items: const [], - // id: property_info.id)), - // ), - // BlocProvider( - // create: (context) => PropertyAssessmentEditBloc() - // ..add(LoadPropertyAssessmentEdit( - // assessmentsEdit: PropertyAssessmentEdit(), - // id: property_info.id)), - // ), - // BlocProvider( - // create: (context) => PropertyAppraisalEditBloc() - // ..add(LoadPropertyAppraisalEdit( - // appraisalEdit: PropertyAppraisalEdit(), - // id: property_info.id)), - // ), - // BlocProvider( - // create: (context) => - // MunicipalityBloc()..add(LoadMunicipality())), - // BlocProvider( - // create: (context) => - // BarangayBloc()..add(LoadBarangay(id: '01'))), - // BlocProvider( - // create: (context) => MemorandaBloc()..add(LoadMemoranda())), - // BlocProvider( - // create: (context) => StructuralMaterialBloc() - // ..add(LoadStructuralMaterial( - // structure: StructureMaterials(), - // id: property_info.id))), - // ], - // child: EditBuilding( - // index: index, - // faas: property_info, - // title: 'Bldg & Structure Edit', - // ), - // ); - // })); + Navigator.push(context, + MaterialPageRoute(builder: (BuildContext context) { + return MultiBlocProvider( + providers: [ + BlocProvider( + create: (context) => + LandPropertyOwnerInfoBloc()..add(LoadLand())), + BlocProvider( + create: (context) => LandLocationEditBloc() + ..add(LoadLandLocationEdit( + land_loc_edit: LandPropertyLoc(), + id: property_info.id))), + BlocProvider( + create: (context) => LandBoundariesEditBloc() + ..add(LoadLandBoundariesEdit( + land_boundaries_edit: LandPropertyBoundaries(), + id: property_info.id))), + BlocProvider( + create: (context) => + LandAppraisalBloc()..add(LoadLandAppraisal())), + BlocProvider( + create: (context) => LandClassificationBloc() + ..add(LoadLandClassification())), + BlocProvider( + create: (context) => LandSubClassificationBloc() + ..add(LoadLandSubClassification( + cityCode: "1", classCode: 1))), + BlocProvider( + create: (context) => + OtherImprovementsBloc()..add(LoadOtherImprovement())), + BlocProvider( + create: (context) => + TypeOfLocationBloc()..add(LoadTypeOfLocation())), + BlocProvider( + create: (context) => + TypeOfRoadBloc()..add(LoadTypeOfRoad())), + BlocProvider( + create: (context) => LandPropertyAssessmentBloc() + ..add(LoadLandPropertyAssessment())), + BlocProvider( + create: (context) => LandTreesImprovementsBloc() + ..add(LoadLandTreesImprovements())), + BlocProvider( + create: (context) => LandExtBloc()..add(LoadLandExt())), + BlocProvider( + create: (context) => LandValueAdjustmentsBloc() + ..add(LoadLandValueAdjustments())), + BlocProvider( + create: (context) => + SignatoriesBloc()..add(LoadSignatories())), + BlocProvider( + create: (context) => + MunicipalityBloc()..add(LoadMunicipality())), + BlocProvider( + create: (context) => + BarangayBloc()..add(LoadBarangay(id: '01'))), + BlocProvider( + create: (context) => MemorandaBloc()..add(LoadMemoranda())), + ], + child: EditLand( + index: index, + faas: property_info, + title: 'Bldg & Structure Edit', + ), + ); + })); }, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, diff --git a/lib/sevices/passo/land/land_boundaries.dart b/lib/sevices/passo/land/land_boundaries.dart index 969d40c..313c6e2 100644 --- a/lib/sevices/passo/land/land_boundaries.dart +++ b/lib/sevices/passo/land/land_boundaries.dart @@ -56,4 +56,57 @@ class LandBoundariesService { } return response; } + + Future updateEdit(LandPropertyBoundaries data, id) async { + String path = Url.instance.getLandPropertyBoundaries(); + Map headers = { + 'Content-Type': 'application/json; charset=UTF-8', + 'X-Client-Key': xClientKey, + 'X-Client-Secret': xClientKeySecret + }; + Map params = { + "landappr_details_id": id.toString(), + }; + http.Response? response; + try { + response = await Request.instance.putRequest( + path: path, body: data.toJson(), headers: headers, param: params); + } catch (e) { + log(e.toString()); + } + return response; + } + + Future fetchEdit(tempID) async { + String path = Url.instance.getLandPropertyBoundaries(); + Map headers = { + 'Content-Type': 'application/json; charset=UTF-8', + 'X-Client-Key': xClientKey, + 'X-Client-Secret': xClientKeySecret + }; + Map params = { + "landappr_details_id": tempID.toString(), + }; + try { + http.Response response = await Request.instance + .getRequest(param: params, path: path, headers: headers); + + print('LandBoundEdit'); + print(response.body); + + if (response.statusCode == 200) { + final jsonData = jsonDecode(response.body); + final dataList = jsonData['data'] as List; + final result = LandPropertyBoundaries.fromJson( + dataList[0] as Map); + + return result; + } else { + print(response.reasonPhrase); + throw Exception(response.reasonPhrase); + } + } catch (e) { + throw e.toString(); + } + } } diff --git a/lib/sevices/passo/land/land_location.dart b/lib/sevices/passo/land/land_location.dart index 8a2fe5b..c44b301 100644 --- a/lib/sevices/passo/land/land_location.dart +++ b/lib/sevices/passo/land/land_location.dart @@ -55,4 +55,57 @@ class LandLocationService { } return response; } + + Future updateEdit(LandPropertyLoc data, id) async { + String path = Url.instance.getLandPropertyLoc(); + Map headers = { + 'Content-Type': 'application/json; charset=UTF-8', + 'X-Client-Key': xClientKey, + 'X-Client-Secret': xClientKeySecret + }; + Map params = { + "landappr_details_id": id.toString(), + }; + http.Response? response; + try { + response = await Request.instance.putRequest( + path: path, body: data.toJson(), headers: headers, param: params); + } catch (e) { + log(e.toString()); + } + return response; + } + + Future fetchEdit(tempID) async { + String path = Url.instance.getLandPropertyLoc(); + Map headers = { + 'Content-Type': 'application/json; charset=UTF-8', + 'X-Client-Key': xClientKey, + 'X-Client-Secret': xClientKeySecret + }; + Map params = { + "landappr_details_id": tempID.toString(), + }; + try { + http.Response response = await Request.instance + .getRequest(param: params, path: path, headers: headers); + + print('LandLocEdit'); + print(response.body); + + if (response.statusCode == 200) { + final jsonData = jsonDecode(response.body); + final dataList = jsonData['data'] as List; + final result = + LandPropertyLoc.fromJson(dataList[0] as Map); + + return result; + } else { + print(response.reasonPhrase); + throw Exception(response.reasonPhrase); + } + } catch (e) { + throw e.toString(); + } + } } diff --git a/lib/sevices/passo/land/land_property_owner.dart b/lib/sevices/passo/land/land_property_owner.dart index 83798ab..2f788aa 100644 --- a/lib/sevices/passo/land/land_property_owner.dart +++ b/lib/sevices/passo/land/land_property_owner.dart @@ -52,4 +52,24 @@ class LandServices { } return response; } + + Future update(LandPropertyOwner data, id) async { + String path = Url.instance.getLandOwnerInfo(); + Map headers = { + 'Content-Type': 'application/json; charset=UTF-8', + 'X-Client-Key': xClientKey, + 'X-Client-Secret': xClientKeySecret + }; + Map params = { + "id": id.toString(), + }; + http.Response? response; + try { + response = await Request.instance.putRequest( + path: path, body: data.toJson(), headers: headers, param: params); + } catch (e) { + log(e.toString()); + } + return response; + } }