diff --git a/lib/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_bloc.dart b/lib/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_bloc.dart index c4728f8..83a5c1e 100644 --- a/lib/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_bloc.dart +++ b/lib/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_bloc.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:unit2/sevices/profile/non_academic_services.dart'; @@ -7,46 +9,162 @@ import '../../../../model/utils/agency.dart'; import '../../../../model/utils/category.dart'; import '../../../../utils/profile_utilities.dart'; - part 'non_academic_recognition_event.dart'; part 'non_academic_recognition_state.dart'; -class NonAcademicRecognitionBloc extends Bloc { +class NonAcademicRecognitionBloc + extends Bloc { NonAcademicRecognitionBloc() : super(NonAcademicRecognitionInitial()) { - List nonAcademicRecognitions = []; - List agencies = []; - List agencyCategory = []; - ////GET - on((event, emit)async { - emit(NonAcademicRecognitionLoadingState()); - try{ - List recognitions = await NonAcademicRecognitionServices.instance.getNonAcademicRecognition(event.profileId, event.token); - nonAcademicRecognitions = recognitions; - emit(NonAcademicRecognitionLoadedState(nonAcademicRecognition: nonAcademicRecognitions)); - }catch(e){ - emit(NonAcademicRecognitionErrorState(message: e.toString())); - } + List nonAcademicRecognitions = []; + List agencies = []; + List agencyCategory = []; + ////GET + on((event, emit) async { + emit(NonAcademicRecognitionLoadingState()); + try { + if (nonAcademicRecognitions.isEmpty) { + List recognitions = + await NonAcademicRecognitionServices.instance + .getNonAcademicRecognition(event.profileId!, event.token!); + nonAcademicRecognitions = recognitions; + emit(NonAcademicRecognitionLoadedState( + nonAcademicRecognition: nonAcademicRecognitions)); + } else { + emit(NonAcademicRecognitionLoadedState( + nonAcademicRecognition: nonAcademicRecognitions)); + } + } catch (e) { + emit(NonAcademicRecognitionErrorState(message: e.toString())); + } + }); + + ////LOAD + on((event,emit){ + nonAcademicRecognitions = event.nonAcademicRecognitions; + emit(NonAcademicRecognitionLoadedState(nonAcademicRecognition: nonAcademicRecognitions)); }); ////SHOW ADD FORM - on((event, emit)async{ + on( + (event, emit) async { emit(NonAcademicRecognitionLoadingState()); - try{ - if(agencies.isEmpty){ - List newAgencies = await ProfileUtilities.instance.getAgecies(); - agencies = newAgencies; + try { + if (agencies.isEmpty) { + List newAgencies = + await ProfileUtilities.instance.getAgecies(); + agencies = newAgencies; } - if(agencyCategory.isEmpty){ - ListnewAgencyCategories = await ProfileUtilities.instance.agencyCategory(); - agencyCategory = newAgencyCategories; - } - emit(AddNonAcademeRecognitionState(agencies: agencies, agencyCategories: agencyCategory)); - }catch(e){ + if (agencyCategory.isEmpty) { + List newAgencyCategories = + await ProfileUtilities.instance.agencyCategory(); + agencyCategory = newAgencyCategories; + } + emit(AddNonAcademeRecognitionState( + agencies: agencies, agencyCategories: agencyCategory)); + } catch (e) { emit(NonAcademicRecognitionErrorState(message: e.toString())); } - },); - ////ADD - on((event,emit){ - emit(NonAcademicRecognitionLoadingState()); - }); + }, + ); + ////SHOW EDIT FORM + on((event, emit) async { + emit(NonAcademicRecognitionLoadingState()); + try { + if (agencies.isEmpty) { + List newAgencies = + await ProfileUtilities.instance.getAgecies(); + agencies = newAgencies; + } + if (agencyCategory.isEmpty) { + List newAgencyCategories = + await ProfileUtilities.instance.agencyCategory(); + agencyCategory = newAgencyCategories; + } + emit(EditNonAcademeRecognitionState( + agencies: agencies, + agencyCategories: agencyCategory, + nonAcademicRecognition: event.nonAcademicRecognition)); + } catch (e) { + emit(NonAcademicRecognitionErrorState(message: e.toString())); + } + }); + ////ADD + on((event, emit) async { + emit(NonAcademicRecognitionLoadingState()); + try { + Map status = + await NonAcademicRecognitionServices.instance.add( + token: event.token, + profileId: event.profileId, + nonAcademicRecognition: event.nonAcademicRecognition); + if (status['success']) { + NonAcademicRecognition nonAcademicRecognition = + NonAcademicRecognition.fromJson(status['data']); + nonAcademicRecognitions.add(nonAcademicRecognition); + emit(NonAcademeRecognitionAddedState( + response: status, + nonAcademicRecognition: nonAcademicRecognitions)); + } else { + emit(NonAcademeRecognitionAddedState( + response: status, + nonAcademicRecognition: nonAcademicRecognitions)); + } + } catch (e) { + emit(NonAcademicRecognitionErrorState(message: e.toString())); + } + }); +////EDIT + on((event, emit) async { + emit(NonAcademicRecognitionLoadingState()); + try { + Map status = + await NonAcademicRecognitionServices.instance.update( + nonAcademicRecognition: event.nonAcademicRecognition, + profileId: event.profileId, + token: event.token); + if (status['success']) { + NonAcademicRecognition newNonAcademeRecognition = + NonAcademicRecognition.fromJson(status['data']); + nonAcademicRecognitions.removeWhere( + (element) => element.id == event.nonAcademicRecognition.id); + nonAcademicRecognitions.add(newNonAcademeRecognition); + emit(NonAcademeRecognitionEditedState( + nonAcademicRecognitions: nonAcademicRecognitions, + response: status)); + }else{ + emit(NonAcademeRecognitionEditedState( + nonAcademicRecognitions: nonAcademicRecognitions, + response: status)); + } + } catch (e) { + emit(NonAcademicRecognitionErrorState(message: e.toString())); + } + }); + + ////DELETE + on((event, emit) async { + emit(NonAcademicRecognitionLoadingState()); + try { + final bool success = await NonAcademicRecognitionServices.instance + .delete( + title: event.nonAcademicRecognition.title!, + id: event.nonAcademicRecognition.id!, + token: event.token, + profileId: event.profileId); + if (success) { + event.nonAcademicRecognitions.removeWhere( + (element) => element.id == event.nonAcademicRecognition.id); + nonAcademicRecognitions = event.nonAcademicRecognitions; + emit(NonAcademeRecognitionDeletedState( + nonAcademicRecognitions: nonAcademicRecognitions, + success: success)); + } else { + emit(NonAcademeRecognitionDeletedState( + nonAcademicRecognitions: nonAcademicRecognitions, + success: success)); + } + } catch (e) { + emit(NonAcademicRecognitionErrorState(message: e.toString())); + } + }); } } diff --git a/lib/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_event.dart b/lib/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_event.dart index 793ddd3..fdb2c6d 100644 --- a/lib/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_event.dart +++ b/lib/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_event.dart @@ -8,11 +8,9 @@ abstract class NonAcademicRecognitionEvent extends Equatable { } //// GET EVENT class GetNonAcademicRecognition extends NonAcademicRecognitionEvent{ - final int profileId; - final String token; - const GetNonAcademicRecognition({required this.profileId, required this.token}); - @override - List get props => [profileId,token]; + final int? profileId; + final String? token; + const GetNonAcademicRecognition({ this.profileId, this.token}); } ////LOAD EVENT class LoadNonAcademeRecognition extends NonAcademicRecognitionEvent{ @@ -27,6 +25,14 @@ class ShowAddNonAcademeRecognitionForm extends NonAcademicRecognitionEvent{ } +//// SHOW EDIT FORM +class ShowEditNonAcademicRecognitionForm extends NonAcademicRecognitionEvent{ + final NonAcademicRecognition nonAcademicRecognition; + const ShowEditNonAcademicRecognitionForm({required this.nonAcademicRecognition}); + @override + List get props => [nonAcademicRecognition]; +} + //// ADD EVENT class AddNonAcademeRecognition extends NonAcademicRecognitionEvent{ final int profileId; @@ -35,18 +41,27 @@ class AddNonAcademeRecognition extends NonAcademicRecognitionEvent{ const AddNonAcademeRecognition({required this.nonAcademicRecognition, required this.profileId, required this.token}); @override List get props => [nonAcademicRecognition,profileId,token]; +} +//// EDIT EVENT +class EditNonAcademeRecognition extends NonAcademicRecognitionEvent{ + final NonAcademicRecognition nonAcademicRecognition; + final String token; + final int profileId; + const EditNonAcademeRecognition({required this.nonAcademicRecognition, required this.profileId, required this.token}); + @override + List get props => [nonAcademicRecognition,profileId,token]; } //// DELETE EVENT class DeleteNonAcademeRecognition extends NonAcademicRecognitionEvent{ final int profileId; final String token; - final int id; - final String title; - const DeleteNonAcademeRecognition({required this.id,required this.profileId, required this.title,required this.token}); + final List nonAcademicRecognitions; + final NonAcademicRecognition nonAcademicRecognition; + const DeleteNonAcademeRecognition({required this.nonAcademicRecognitions, required this.nonAcademicRecognition,required this.profileId,required this.token}); @override - List get props => [profileId,token,id,title]; + List get props => [profileId,token,nonAcademicRecognition,nonAcademicRecognitions]; } diff --git a/lib/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_state.dart b/lib/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_state.dart index dbb737b..f09e17e 100644 --- a/lib/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_state.dart +++ b/lib/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_state.dart @@ -2,60 +2,78 @@ part of 'non_academic_recognition_bloc.dart'; abstract class NonAcademicRecognitionState extends Equatable { const NonAcademicRecognitionState(); - + @override List get props => []; } class NonAcademicRecognitionInitial extends NonAcademicRecognitionState {} - ////LOADING STATE -class NonAcademicRecognitionLoadingState extends NonAcademicRecognitionState{ +class NonAcademicRecognitionLoadingState extends NonAcademicRecognitionState {} -} ////LOADED STATE -class NonAcademicRecognitionLoadedState extends NonAcademicRecognitionState{ - final List nonAcademicRecognition; - const NonAcademicRecognitionLoadedState({required this.nonAcademicRecognition}); - @override - List get props => []; -} -////DELETED STATE -class NonAcademeRecognitionDeletedState extends NonAcademicRecognitionState{ - final List nonAcademicRecognition; - final bool success; - const NonAcademeRecognitionDeletedState({required this.nonAcademicRecognition, required this.success}); - @override - List get props => [nonAcademicRecognition,success]; -} - -////ADDED STATE -class NonAcademeRecognitionAddedState extends NonAcademicRecognitionState{ - final List nonAcademicRecognition; - final Map response; - const NonAcademeRecognitionAddedState({required this.nonAcademicRecognition, required this.response}); - @override - List get props => [nonAcademicRecognition,response]; -} - -////ADDING STATE -class AddNonAcademeRecognitionState extends NonAcademicRecognitionState{ - final List agencies; -final List agencyCategories; -const AddNonAcademeRecognitionState({required this.agencies, required this.agencyCategories}); - @override - List get props => [agencies,agencyCategories]; - -} - - - -////ERROR STATE -class NonAcademicRecognitionErrorState extends NonAcademicRecognitionState{ - final String message; - const NonAcademicRecognitionErrorState({required this.message}); - +class NonAcademicRecognitionLoadedState extends NonAcademicRecognitionState { + final List nonAcademicRecognition; + const NonAcademicRecognitionLoadedState( + {required this.nonAcademicRecognition}); + @override + List get props => []; +} + +////DELETED STATE +class NonAcademeRecognitionDeletedState extends NonAcademicRecognitionState { + final List nonAcademicRecognitions; + final bool success; + const NonAcademeRecognitionDeletedState( + {required this.nonAcademicRecognitions, required this.success}); + @override + List get props => [nonAcademicRecognitions, success]; +} + +class NonAcademeRecognitionEditedState extends NonAcademicRecognitionState{ + final List nonAcademicRecognitions; + final Map response; + const NonAcademeRecognitionEditedState( + {required this.nonAcademicRecognitions, required this.response}); + @override + List get props => [nonAcademicRecognitions, response]; +} + +////ADDED STATE +class NonAcademeRecognitionAddedState extends NonAcademicRecognitionState { + final List nonAcademicRecognition; + final Map response; + const NonAcademeRecognitionAddedState( + {required this.nonAcademicRecognition, required this.response}); + @override + List get props => [nonAcademicRecognition, response]; +} + +////ADDING STATE +class AddNonAcademeRecognitionState extends NonAcademicRecognitionState { + final List agencies; + final List agencyCategories; + const AddNonAcademeRecognitionState( + {required this.agencies, required this.agencyCategories}); + @override + List get props => [agencies, agencyCategories]; +} + +class EditNonAcademeRecognitionState extends NonAcademicRecognitionState { + final List agencies; + final List agencyCategories; + final NonAcademicRecognition nonAcademicRecognition; + const EditNonAcademeRecognitionState({required this.agencies, required this.agencyCategories,required this.nonAcademicRecognition}); + @override + List get props => [agencies, agencyCategories,nonAcademicRecognition]; +} + +////ERROR STATE +class NonAcademicRecognitionErrorState extends NonAcademicRecognitionState { + final String message; + const NonAcademicRecognitionErrorState({required this.message}); + @override List get props => []; } diff --git a/lib/bloc/profile/references/references_bloc.dart b/lib/bloc/profile/references/references_bloc.dart index 78f089b..5c2b2f8 100644 --- a/lib/bloc/profile/references/references_bloc.dart +++ b/lib/bloc/profile/references/references_bloc.dart @@ -142,7 +142,7 @@ class ReferencesBloc extends Bloc { on((event, emit) async { emit(const ReferencesErrorState( message: "Something went wrong. Please try again")); - //// ADD REFERENCES EVENT + //// EDIT REFERENCES EVENT });on((event,emit)async{ emit(ReferencesLoadingState()); Map status =await ReferencesServices.instace.update(ref: event.reference, token: event.token, profileId: event.profileId); diff --git a/lib/screens/profile/components/other_information/non_academic/add_modal.dart b/lib/screens/profile/components/other_information/non_academic/add_modal.dart index 856f105..08793bd 100644 --- a/lib/screens/profile/components/other_information/non_academic/add_modal.dart +++ b/lib/screens/profile/components/other_information/non_academic/add_modal.dart @@ -1,6 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/src/widgets/framework.dart'; -import 'package:flutter/src/widgets/placeholder.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:fluttericon/font_awesome_icons.dart'; @@ -18,6 +16,7 @@ import '../../../../../model/utils/category.dart'; import '../../../../../theme-data.dart/box_shadow.dart'; import '../../../../../theme-data.dart/btn-style.dart'; import '../../../../../theme-data.dart/colors.dart'; +import '../../../../../utils/text_container.dart'; class AddNonAcademicRecognitionScreen extends StatefulWidget { const AddNonAcademicRecognitionScreen({super.key}); @@ -48,9 +47,12 @@ class _AddNonAcademicRecognitionScreenState return BlocBuilder( builder: (context, state) { if (state is UserLoggedIn) { + token = state.userData!.user!.login!.token; + profileId = state.userData!.user!.login!.user!.profileId!; return BlocBuilder( builder: (context, state) { if (state is ProfileLoaded) { + return BlocBuilder( builder: (context, state) { @@ -58,7 +60,9 @@ class _AddNonAcademicRecognitionScreenState return SizedBox( height: blockSizeVertical * 90, child: SingleChildScrollView( - child: FormBuilder(child: Padding( + child: FormBuilder( + key: _formKey, + child: Padding( padding: const EdgeInsets.symmetric(vertical: 25,horizontal: 18), child: Column( children: [ @@ -321,7 +325,38 @@ class _AddNonAcademicRecognitionScreenState : const SizedBox()), ], ); - }) + }), + const SizedBox( + height: 24, + ), + SizedBox( + height: 60, + width: double.infinity, + child: ElevatedButton( + style: mainBtnStyle(primary, + Colors.transparent, second), + onPressed: () { + + if (_formKey.currentState! + .saveAndValidate()) { + String title = _formKey.currentState!.value['title']; + + if(selectedAgency?.privateEntity != null){ + newAgency = selectedAgency; + }else{ + newAgency = Agency( + id: selectedAgency?.id, + name: selectedAgency!.name, + category: + selectedCategory, + privateEntity: isPrivate); + } + nonAcademicRecognition = NonAcademicRecognition(id: null, title:title,presenter: newAgency ); + context.read().add(AddNonAcademeRecognition(nonAcademicRecognition: nonAcademicRecognition!, profileId: profileId!, token: token!)); + } + }, + child: const Text(submit)), + ) ], ), )), diff --git a/lib/screens/profile/components/other_information/non_academic/edit_modal.dart b/lib/screens/profile/components/other_information/non_academic/edit_modal.dart new file mode 100644 index 0000000..3d43d3c --- /dev/null +++ b/lib/screens/profile/components/other_information/non_academic/edit_modal.dart @@ -0,0 +1,410 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:fluttericon/font_awesome_icons.dart'; +import 'package:form_builder_validators/form_builder_validators.dart'; +import 'package:searchfield/searchfield.dart'; +import 'package:unit2/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_bloc.dart'; +import 'package:unit2/bloc/profile/profile_bloc.dart'; +import 'package:unit2/bloc/user/user_bloc.dart'; +import 'package:unit2/model/profile/other_information/non_acedimic_recognition.dart'; +import 'package:unit2/theme-data.dart/form-style.dart'; +import 'package:unit2/utils/global.dart'; + +import '../../../../../model/utils/agency.dart'; +import '../../../../../model/utils/category.dart'; +import '../../../../../theme-data.dart/box_shadow.dart'; +import '../../../../../theme-data.dart/btn-style.dart'; +import '../../../../../theme-data.dart/colors.dart'; +import '../../../../../utils/text_container.dart'; + +class EditNonAcademicRecognitionScreen extends StatefulWidget { + const EditNonAcademicRecognitionScreen({super.key}); + + @override + State createState() => + _EditNonAcademicRecognitionScreenState(); +} + +class _EditNonAcademicRecognitionScreenState + extends State { + bool showAgencyCategory = false; + final agencyFocusNode = FocusNode(); + + final agencyCategoryFocusNode = FocusNode(); + final addAgencyController = TextEditingController(); + Agency? selectedAgency; + Category? selectedCategory; + Agency? newAgency; + bool showIsPrivateRadio = false; + bool? isPrivate = false; + NonAcademicRecognition? nonAcademicRecognition; + final oldAgencyController = TextEditingController(); + final _formKey = GlobalKey(); + int? profileId; + String? token; + @override + Widget build(BuildContext context) { + return BlocBuilder( + builder: (context, state) { + if (state is UserLoggedIn) { + token = state.userData!.user!.login!.token; + profileId = state.userData!.user!.login!.user!.profileId!; + return BlocBuilder( + builder: (context, state) { + if (state is ProfileLoaded) { + return BlocBuilder( + builder: (context, state) { + if (state is EditNonAcademeRecognitionState) { + oldAgencyController.text = + state.nonAcademicRecognition.presenter!.name!; + selectedAgency = state.nonAcademicRecognition.presenter; + selectedCategory = + state.nonAcademicRecognition.presenter!.category; + return SizedBox( + height: blockSizeVertical * 90, + child: SingleChildScrollView( + child: FormBuilder( + key: _formKey, + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 25, horizontal: 18), + child: Column( + children: [ + FormBuilderTextField( + name: 'title', + initialValue: + state.nonAcademicRecognition.title, + decoration: normalTextFieldStyle( + "Recognition / Award Title *", + "Recognition / Award Title"), + validator: + FormBuilderValidators.required( + errorText: + "this field is required"), + ), + const SizedBox( + height: 12, + ), + StatefulBuilder( + builder: (context, setState) { + //// AGENCY SEARCHFIELD + return Column( + children: [ + SearchField( + controller: oldAgencyController, + itemHeight: 70, + suggestions: state.agencies + .map((Agency agency) => + SearchFieldListItem( + agency.name!, + item: agency, + child: ListTile( + title: Text( + agency.name! + .toUpperCase(), + overflow: + TextOverflow + .ellipsis, + ), + subtitle: Text(agency + .privateEntity == + true + ? "Private" + : agency.privateEntity == + false + ? "Government" + : ""), + ))) + .toList(), + + validator: FormBuilderValidators + .required( + errorText: + "This field is required"), + focusNode: agencyFocusNode, + searchInputDecoration: + normalTextFieldStyle( + "Agency *", "") + .copyWith( + suffixIcon: + const Icon(Icons + .arrow_drop_down)), + ////agency suggestion tap + onSuggestionTap: (agency) { + setState(() { + selectedAgency = agency.item; + agencyFocusNode.unfocus(); + if (selectedAgency + ?.category == + null) { + showAgencyCategory = true; + showIsPrivateRadio = true; + } else { + showAgencyCategory = false; + showIsPrivateRadio = false; + } + }); + }, + emptyWidget: Container( + decoration: box1(), + height: 100, + child: Column( + mainAxisAlignment: + MainAxisAlignment + .center, + crossAxisAlignment: + CrossAxisAlignment + .center, + children: [ + const SizedBox( + height: 20, + ), + const Text( + "No result found..."), + const SizedBox( + height: 10, + ), + TextButton( + //// Add agency onpressed + onPressed: () { + showDialog( + context: + context, + builder: + (BuildContext + context) { + return AlertDialog( + title: const Text( + "Add Agency?"), + content: + SizedBox( + height: + 130, + child: + Column( + children: [ + TextFormField( + controller: + addAgencyController, + decoration: + normalTextFieldStyle("", ""), + ), + const SizedBox( + height: + 12, + ), + SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton( + style: mainBtnStyle(primary, Colors.transparent, second), + //// onpressed + onPressed: () { + setState(() { + newAgency = Agency(id: null, name: addAgencyController.text.toUpperCase(), category: null, privateEntity: null); + state.agencies.insert(0, newAgency!); + addAgencyController.clear(); + Navigator.pop(context); + }); + }, + child: const Text("Add"))), + ], + ), + ), + ); + }); + }, + child: const Text( + "Add position")) + ]), + ), + ), + const SizedBox( + height: 8, + ), + SizedBox( + child: showAgencyCategory + ? SearchField( + focusNode: + agencyCategoryFocusNode, + itemHeight: 70, + suggestions: state + .agencyCategories + .map((Category + category) => + SearchFieldListItem( + category + .name!, + item: + category, + child: + ListTile( + title: Text( + category + .name!), + subtitle: Text(category + .industryClass! + .name!), + ))) + .toList(), + emptyWidget: Container( + height: 100, + decoration: box1(), + child: const Center( + child: Text( + "No result found ...")), + ), + ////agency controller suggestion tap + onSuggestionTap: + (agencyCategory) { + setState(() { + selectedCategory = + agencyCategory + .item; + + agencyCategoryFocusNode + .unfocus(); + }); + }, + searchInputDecoration: + normalTextFieldStyle( + "Category *", + "") + .copyWith( + suffixIcon: + const Icon( + Icons + .arrow_drop_down)), + validator: + FormBuilderValidators + .required( + errorText: + "This field is required"), + ) + : const SizedBox(), + ), + + ////PRVIATE SECTOR + SizedBox( + child: showIsPrivateRadio + ? FormBuilderRadioGroup( + decoration: + InputDecoration( + border: + InputBorder.none, + label: Row( + children: [ + Text( + "Is this private sector? ", + style: Theme.of( + context) + .textTheme + .headlineSmall! + .copyWith( + fontSize: + 24), + ), + const Icon(FontAwesome + .help_circled) + ], + ), + ), + + ////onvhange private sector + onChanged: (value) { + setState(() { + if (value + .toString() == + "YES") { + isPrivate = true; + } else { + isPrivate = false; + } + }); + }, + + name: 'isPrivate', + validator: + FormBuilderValidators + .required( + errorText: + "This field is required"), + options: ["YES", "NO"] + .map((lang) => + FormBuilderFieldOption( + value: + lang)) + .toList( + growable: + false), + ) + : const SizedBox()), + ], + ); + }), + const SizedBox( + height: 24, + ), + SizedBox( + height: 60, + width: double.infinity, + child: ElevatedButton( + style: mainBtnStyle(primary, + Colors.transparent, second), + onPressed: () { + if (_formKey.currentState! + .saveAndValidate()) { + String title = _formKey + .currentState! + .value['title']; + + if (selectedAgency + ?.privateEntity != + null) { + newAgency = selectedAgency; + } else { + newAgency = Agency( + id: selectedAgency?.id, + name: + selectedAgency!.name, + category: + selectedCategory, + privateEntity: isPrivate); + } + nonAcademicRecognition = + NonAcademicRecognition( + id: state.nonAcademicRecognition.id, + title: title, + presenter: newAgency); + context + .read< + NonAcademicRecognitionBloc>() + .add(EditNonAcademeRecognition( + nonAcademicRecognition: + nonAcademicRecognition!, + profileId: profileId!, + token: token!)); + } + }, + child: const Text(submit)), + ) + ], + ), + )), + )); + } + return Container(); + }, + ); + } + return Container(); + }, + ); + } + return Container(); + }, + ); + } +} diff --git a/lib/screens/profile/components/other_information/non_academic_recognition_screen.dart b/lib/screens/profile/components/other_information/non_academic_recognition_screen.dart index 06e4b9b..56bac7f 100644 --- a/lib/screens/profile/components/other_information/non_academic_recognition_screen.dart +++ b/lib/screens/profile/components/other_information/non_academic_recognition_screen.dart @@ -1,3 +1,4 @@ +import 'package:app_popup_menu/app_popup_menu.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_progress_hud/flutter_progress_hud.dart'; @@ -5,6 +6,7 @@ import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:unit2/bloc/profile/profile_bloc.dart'; import 'package:unit2/bloc/user/user_bloc.dart'; import 'package:unit2/screens/profile/components/other_information/non_academic/add_modal.dart'; +import 'package:unit2/screens/profile/components/other_information/non_academic/edit_modal.dart'; import 'package:unit2/theme-data.dart/box_shadow.dart'; import 'package:unit2/theme-data.dart/colors.dart'; import 'package:unit2/utils/global.dart'; @@ -13,6 +15,7 @@ import 'package:unit2/widgets/Leadings/add_leading.dart'; import 'package:unit2/widgets/empty_data.dart'; import '../../../../bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_bloc.dart'; +import '../../../../utils/alerts.dart'; class NonAcademicRecognitionScreen extends StatelessWidget { const NonAcademicRecognitionScreen({ @@ -28,9 +31,13 @@ class NonAcademicRecognitionScreen extends StatelessWidget { title: const Text(nonAcademicRecTitle), centerTitle: true, backgroundColor: primary, - actions: [AddLeading(onPressed: () { - context.read().add(ShowAddNonAcademeRecognitionForm()); - })], + actions: [ + AddLeading(onPressed: () { + context + .read() + .add(ShowAddNonAcademeRecognitionForm()); + }) + ], ), body: ProgressHUD( padding: const EdgeInsets.all(24), @@ -39,7 +46,7 @@ class NonAcademicRecognitionScreen extends StatelessWidget { child: BlocBuilder( builder: (context, state) { if (state is UserLoggedIn) { - token = state.userData!.user!.login!.token; + token = state.userData!.user!.login!.token; profileId = state.userData!.user!.login!.user!.profileId!; return BlocBuilder( builder: (context, state) { @@ -52,10 +59,72 @@ class NonAcademicRecognitionScreen extends StatelessWidget { progress!.showWithText("Please wait..."); } if (state is NonAcademicRecognitionLoadedState || - state is NonAcademicRecognitionErrorState || state is AddNonAcademeRecognitionState) { + state is NonAcademicRecognitionErrorState || + state is AddNonAcademeRecognitionState || state is EditNonAcademeRecognitionState || state is NonAcademeRecognitionEditedState) { final progress = ProgressHUD.of(context); progress!.dismiss(); } + ////ADDED STATE + if (state is NonAcademeRecognitionAddedState) { + if (state.response['success']) { + successAlert(context, "Adding Successfull!", + state.response['message'], () { + Navigator.of(context).pop(); + context + .read() + .add(const GetNonAcademicRecognition()); + }); + } else { + errorAlert(context, "Adding Failed", + "Something went wrong. Please try again.", + () { + Navigator.of(context).pop(); + context + .read() + .add(const GetNonAcademicRecognition()); + }); + } + } + ////DELETED STATE + if (state is NonAcademeRecognitionDeletedState) { + if (state.success) { + successAlert(context, "Deletion Successfull", + "Work has been deleted successfully", () { + Navigator.of(context).pop(); + context + .read() + .add(const GetNonAcademicRecognition()); + }); + } else { + errorAlert(context, "Deletion Failed", + "Error deleting Work History", () { + Navigator.of(context).pop(); + context + .read() + .add(const GetNonAcademicRecognition()); + }); + } + } + ////EDITED STATE + if (state is NonAcademeRecognitionEditedState) { + if (state.response['success']) { + successAlert(context, "Update Successfull", + state.response['message'], () { + Navigator.of(context).pop(); + context + .read() + .add( LoadNonAcademeRecognition(nonAcademicRecognitions: state.nonAcademicRecognitions)); + }); + } else { + errorAlert(context, "Update Failed", + state.response['message'], () { + Navigator.of(context).pop(); + context + .read() + .add(LoadNonAcademeRecognition(nonAcademicRecognitions: state.nonAcademicRecognitions)); + }); + } + } }, builder: (context, state) { if (state is NonAcademicRecognitionLoadedState) { @@ -103,12 +172,57 @@ class NonAcademicRecognitionScreen extends StatelessWidget { Text(presenter), ], )), - IconButton( - onPressed: () {}, - icon: const Icon( - Icons.more_vert, - color: Colors.grey, - )) + AppPopupMenu( + offset: const Offset(-10, -10), + elevation: 3, + onSelected: (value) { + + ////delete non academic recognition-= = = = = = = = =>> + if (value == 1) { + confirmAlert(context, () { + context + .read< + NonAcademicRecognitionBloc>() + .add(DeleteNonAcademeRecognition( + nonAcademicRecognition: + state + .nonAcademicRecognition[ + index], + profileId: + profileId!, + nonAcademicRecognitions: + state + .nonAcademicRecognition, + token: token!)); + }, "Delete?", + "Confirm Delete?"); + } + if (value == 2) { + context + .read< + NonAcademicRecognitionBloc>() + .add(ShowEditNonAcademicRecognitionForm( + nonAcademicRecognition: + state.nonAcademicRecognition[ + index])); + } + }, + menuItems: [ + popMenuItem( + text: "Delete", + value: 1, + icon: Icons.delete), + popMenuItem( + text: "Edit", + value: 2, + icon: Icons.delete), + ], + icon: const Icon( + Icons.more_vert, + color: Colors.grey, + ), + tooltip: "Options", + ) ], ), ), @@ -123,8 +237,11 @@ class NonAcademicRecognitionScreen extends StatelessWidget { message: "You don't have any Non Academic Recognition added. Please click + to add"); } - }if(state is AddNonAcademeRecognitionState){ + } + if (state is AddNonAcademeRecognitionState) { return const AddNonAcademicRecognitionScreen(); + }if(state is EditNonAcademeRecognitionState){ + return const EditNonAcademicRecognitionScreen(); } return Container(); }, @@ -140,3 +257,22 @@ class NonAcademicRecognitionScreen extends StatelessWidget { )); } } + +PopupMenuItem popMenuItem({String? text, int? value, IconData? icon}) { + return PopupMenuItem( + value: value, + child: Row( + children: [ + Icon( + icon, + ), + const SizedBox( + width: 10, + ), + Text( + text!, + ), + ], + ), + ); +} diff --git a/lib/screens/profile/components/references_screen.dart b/lib/screens/profile/components/references_screen.dart index b7eb2f4..495bf3a 100644 --- a/lib/screens/profile/components/references_screen.dart +++ b/lib/screens/profile/components/references_screen.dart @@ -212,10 +212,7 @@ class ReferencesScreen extends StatelessWidget { offset: const Offset(-10, -10), elevation: 3, onSelected: (value) { - final progress = - ProgressHUD.of(context); - progress!.showWithText( - "Loading..."); + ////delete eligibilty-= = = = = = = = =>> if (value == 2) { confirmAlert(context, () { diff --git a/lib/sevices/profile/non_academic_services.dart b/lib/sevices/profile/non_academic_services.dart index 46f2b32..fb08bf8 100644 --- a/lib/sevices/profile/non_academic_services.dart +++ b/lib/sevices/profile/non_academic_services.dart @@ -36,7 +36,7 @@ class NonAcademicRecognitionServices { } } catch (e) { throw e.toString(); -} + } return nonAcademicRecognitions; } @@ -75,8 +75,42 @@ class NonAcademicRecognitionServices { return statusResponse; } -////DELETE + ////UPDATE + Future> update( + {required NonAcademicRecognition nonAcademicRecognition, + required int profileId, + required String token}) async { + String authToken = "Token $token"; + String path = "${Url.instance.getNonAcademicRecognition()}$profileId/"; + Map headers = { + 'Content-Type': 'application/json; charset=UTF-8', + 'Authorization': authToken + }; + Map statusResponse = {}; + Map body = { + "id": nonAcademicRecognition.id, + "title": nonAcademicRecognition.title, + "presenter_id": nonAcademicRecognition.presenter?.id, + "_presenterName": nonAcademicRecognition.presenter!.name, + "_presenterCatId": nonAcademicRecognition.presenter!.category!.id, + "_privateEntity": nonAcademicRecognition.presenter!.privateEntity + }; + try { + http.Response response = await Request.instance + .putRequest(path: path, headers: headers, body: body, param: {}); + if (response.statusCode == 200) { + Map data = jsonDecode(response.body); + statusResponse = data; + } else { + statusResponse.addAll({'success': false}); + } + } catch (e) { + throw e.toString(); + } + return statusResponse; + } +////DELETE Future delete( {required String title, required int id, diff --git a/pubspec.lock b/pubspec.lock index 2a90114..e2e4eda 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -257,6 +257,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + filter_list: + dependency: "direct main" + description: + name: filter_list + sha256: "2d80d6d19beb7847c1176e8bf6fe06d302b23eb7d1bf48c231dd730409ff9b4d" + url: "https://pub.dev" + source: hosted + version: "1.0.2" fixnum: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index c2bbe76..ddcc03c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -71,6 +71,7 @@ dependencies: app_popup_menu: ^1.0.0 modal_progress_hud_nsn: ^0.3.0 searchfield: ^0.7.5 + filter_list: ^1.0.2 dev_dependencies: