From f2b378e33afc213582583383f2cac557d94263a3 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 29 May 2022 17:44:36 +0300 Subject: [PATCH 1/7] dynamic forms cont. --- lib/classes/consts.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index a95e5b4..ca8e2f0 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -1,7 +1,7 @@ class ApiConsts { //static String baseUrl = "http://10.200.204.20:2801/"; // Local server - static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server - // static String baseUrl = "https://hmgwebservices.com"; // Live server + // static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server + static String baseUrl = "https://hmgwebservices.com"; // Live server static String baseUrlServices = baseUrl + "/Services/"; // server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/"; From dadaeed10e791069e79c13fd84e816cbe34fee4f Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 29 May 2022 17:45:07 +0300 Subject: [PATCH 2/7] dynamic forms cont. --- lib/api/my_attendance_api_client.dart | 28 ++- lib/config/routes.dart | 12 +- .../get_open_missing_swipes_list_model.dart | 1 - .../get_set_values_request_model.dart | 32 +++ lib/models/generic_response_model.dart | 16 +- .../get_eit_dff_structure_list_model.dart | 94 +++++++- lib/ui/landing/widget/services_widget.dart | 15 +- .../add_work_from_home_screen.dart | 91 -------- .../dynamic_screens/dynamic_input_screen.dart | 221 ++++++++++++++++++ .../dynamic_listview_screen.dart} | 29 ++- .../my_attendance/my_attendance_screen.dart | 4 +- .../dynamic_textfield_widget.dart | 108 +++++++++ 12 files changed, 511 insertions(+), 140 deletions(-) create mode 100644 lib/models/dyanmic_forms/get_set_values_request_model.dart delete mode 100644 lib/ui/my_attendance/add_work_from_home_screen.dart create mode 100644 lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart rename lib/ui/my_attendance/{work_from_home_screen.dart => dynamic_screens/dynamic_listview_screen.dart} (81%) create mode 100644 lib/widgets/dynamic_forms/dynamic_textfield_widget.dart diff --git a/lib/api/my_attendance_api_client.dart b/lib/api/my_attendance_api_client.dart index 7831006..f49aa1e 100644 --- a/lib/api/my_attendance_api_client.dart +++ b/lib/api/my_attendance_api_client.dart @@ -2,13 +2,9 @@ import 'dart:async'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/consts.dart'; -import 'package:mohem_flutter_app/models/basic_member_information_model.dart'; -import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart'; -import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart'; -import 'package:mohem_flutter_app/models/member_login_list_model.dart'; import 'api_client.dart'; @@ -29,13 +25,33 @@ class MyAttendanceApiClient { }, url, postParams); } - Future?> getEitDffStructure(String pFunctionName) async { + Future getEitDffStructure(String pFunctionName) async { String url = "${ApiConsts.erpRest}GET_EIT_DFF_STRUCTURE"; Map postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E", "P_FUNCTION_NAME": pFunctionName}; postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); - return responseData.getEITDFFStructureList ?? []; + return responseData; + }, url, postParams); + } + + Future getValueSetValues(String pSegmentName, String pDescFlexContextCode, String pDescFlexName, List> list) async { + String url = "${ApiConsts.erpRest}GET_VALUE_SET_VALUES"; + Map postParams = { + "P_SELECTED_RESP_ID": -999, + "P_MENU_TYPE": "E", + "P_PAGE_LIMIT": 1000, + "P_PAGE_NUM": 1, + "P_PARENT_VALUE": null, + "P_SEGMENT_NAME": pSegmentName, + "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, + "P_DESC_FLEX_NAME": pDescFlexName, + "GetValueSetValuesTBL": list, + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getValueSetValuesList!.first; }, url, postParams); } } diff --git a/lib/config/routes.dart b/lib/config/routes.dart index c7abd27..a31d24c 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -6,9 +6,9 @@ import 'package:mohem_flutter_app/ui/login/login_screen.dart'; import 'package:mohem_flutter_app/ui/login/new_password_screen.dart'; import 'package:mohem_flutter_app/ui/login/verify_last_login_screen.dart'; import 'package:mohem_flutter_app/ui/login/verify_login_screen.dart'; -import 'package:mohem_flutter_app/ui/my_attendance/add_work_from_home_screen.dart'; +import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/my_attendance_screen.dart'; -import 'package:mohem_flutter_app/ui/my_attendance/work_from_home_screen.dart'; +import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/item_history_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/itg_detail_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/worklist_detail_screen.dart'; @@ -35,8 +35,8 @@ class AppRoutes { static const String itemHistory = "/itemHistory"; static const String myAttendance = "/myAttendance"; - static const String workFromHome = "/workFromHome"; - static const String addWorkFromHome = "/addWorkFromHome"; + static const String dynamicScreen = "/dynamicScreen"; + static const String addDynamicInput = "/addDynamicInput"; static final Map routes = { login: (context) => LoginScreen(), @@ -54,7 +54,7 @@ class AppRoutes { itemHistory: (context) => ItemHistoryScreen(), myAttendance: (context) => MyAttendanceScreen(), - workFromHome: (context) => WorkFromHomeScreen(), - addWorkFromHome: (context) => AddWorkFromHomeScreen(), + dynamicScreen: (context) => DynamicListViewScreen(), + addDynamicInput: (context) => DynamicInputScreen(), }; } diff --git a/lib/models/dashboard/get_open_missing_swipes_list_model.dart b/lib/models/dashboard/get_open_missing_swipes_list_model.dart index 86ac6a9..8554637 100644 --- a/lib/models/dashboard/get_open_missing_swipes_list_model.dart +++ b/lib/models/dashboard/get_open_missing_swipes_list_model.dart @@ -1,4 +1,3 @@ - class GetOpenMissingSwipesList { GetOpenMissingSwipesList({ this.pOpenMissingSwipes, diff --git a/lib/models/dyanmic_forms/get_set_values_request_model.dart b/lib/models/dyanmic_forms/get_set_values_request_model.dart new file mode 100644 index 0000000..82bc05a --- /dev/null +++ b/lib/models/dyanmic_forms/get_set_values_request_model.dart @@ -0,0 +1,32 @@ +class GetSetValuesRequestModel { + String? sEGMENTNAME; + String? vALUECOLUMNNAME; + String? dESCRIPTION; + String? iDCOLUMNNAME; + String? fLEXVALUESETNAME; + + GetSetValuesRequestModel( + {this.sEGMENTNAME, + this.vALUECOLUMNNAME, + this.dESCRIPTION, + this.iDCOLUMNNAME, + this.fLEXVALUESETNAME}); + + GetSetValuesRequestModel.fromJson(Map json) { + sEGMENTNAME = json['SEGMENT_NAME']; + vALUECOLUMNNAME = json['VALUE_COLUMN_NAME']; + dESCRIPTION = json['DESCRIPTION']; + iDCOLUMNNAME = json['ID_COLUMN_NAME']; + fLEXVALUESETNAME = json['FLEX_VALUE_SET_NAME']; + } + + Map toJson() { + final Map data = new Map(); + data['SEGMENT_NAME'] = this.sEGMENTNAME; + data['VALUE_COLUMN_NAME'] = this.vALUECOLUMNNAME; + data['DESCRIPTION'] = this.dESCRIPTION; + data['ID_COLUMN_NAME'] = this.iDCOLUMNNAME; + data['FLEX_VALUE_SET_NAME'] = this.fLEXVALUESETNAME; + return data; + } +} diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index 3f3e3b7..ecad452 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -168,7 +168,7 @@ class GenericResponseModel { List? getVacationRulesList; List? getVaccinationOnHandList; List? getVaccinationsList; - List? getValueSetValuesList; + List? getValueSetValuesList; List? getWorkList; String? hRCertificateTemplate; String? imgURLsList; @@ -760,7 +760,13 @@ class GenericResponseModel { getVacationRulesList = json['GetVacationRulesList']; getVaccinationOnHandList = json['GetVaccinationOnHandList']; getVaccinationsList = json['GetVaccinationsList']; - getValueSetValuesList = json['GetValueSetValuesList']; + + if (json['GetValueSetValuesList'] != null) { + getValueSetValuesList = []; + json['GetValueSetValuesList'].forEach((v) { + getValueSetValuesList!.add(ESERVICESVS.fromJson(v)); + }); + } if (json['GetWorkList'] != null) { getWorkList = []; @@ -1113,12 +1119,12 @@ class GenericResponseModel { data['GetVacationRulesList'] = this.getVacationRulesList; data['GetVaccinationOnHandList'] = this.getVaccinationOnHandList; data['GetVaccinationsList'] = this.getVaccinationsList; - data['GetValueSetValuesList'] = this.getValueSetValuesList; - + if (getValueSetValuesList != null) { + data['GetValueSetValuesList'] = getValueSetValuesList!.map((v) => v.toJson()).toList(); + } if (getWorkList != null) { data['GetWorkList'] = getWorkList!.map((v) => v.toJson()).toList(); } - data['HRCertificateTemplate'] = this.hRCertificateTemplate; data['ImgURLsList'] = this.imgURLsList; data['InsertApInv'] = this.insertApInv; diff --git a/lib/models/get_eit_dff_structure_list_model.dart b/lib/models/get_eit_dff_structure_list_model.dart index 93f6b60..d559794 100644 --- a/lib/models/get_eit_dff_structure_list_model.dart +++ b/lib/models/get_eit_dff_structure_list_model.dart @@ -4,7 +4,7 @@ class GetEITDFFStructureList { String? cHILDSEGMENTSDV; List? cHILDSEGMENTSDVSplited; String? cHILDSEGMENTSVS; - String? cHILDSEGMENTSVSSplited; + List? cHILDSEGMENTSVSSplited; String? dEFAULTTYPE; String? dEFAULTVALUE; String? dESCFLEXCONTEXTCODE; @@ -13,7 +13,7 @@ class GetEITDFFStructureList { String? dISPLAYFLAG; String? eNABLEDFLAG; ESERVICESDV? eSERVICESDV; - List? eSERVICESVS; + List? eSERVICESVS; String? fLEXVALUESETNAME; String? fORMATTYPE; String? fORMATTYPEDSP; @@ -28,7 +28,7 @@ class GetEITDFFStructureList { String? pARENTSEGMENTSDV; List? pARENTSEGMENTSDVSplited; String? pARENTSEGMENTSVS; - List? pARENTSEGMENTSVSSplitedVS; + List? pARENTSEGMENTSVSSplitedVS; String? rEADONLY; String? rEQUIREDFLAG; String? sEGMENTNAME; @@ -38,6 +38,7 @@ class GetEITDFFStructureList { String? uSEDFLAG; String? vALIDATIONTYPE; String? vALIDATIONTYPEDSP; + String? fieldAnswer; GetEITDFFStructureList( {this.aLPHANUMERICALLOWEDFLAG, @@ -78,15 +79,19 @@ class GetEITDFFStructureList { this.uPPERCASEONLYFLAG, this.uSEDFLAG, this.vALIDATIONTYPE, - this.vALIDATIONTYPEDSP}); + this.vALIDATIONTYPEDSP, + this.fieldAnswer}); GetEITDFFStructureList.fromJson(Map json) { + print("----------------=============================="); + print("----------------:$json"); aLPHANUMERICALLOWEDFLAG = json['ALPHANUMERIC_ALLOWED_FLAG']; aPPLICATIONCOLUMNNAME = json['APPLICATION_COLUMN_NAME']; cHILDSEGMENTSDV = json['CHILD_SEGMENTS_DV']; cHILDSEGMENTSDVSplited = json['CHILD_SEGMENTS_DV_Splited'] == null ? [] : json['CHILD_SEGMENTS_DV_Splited'].cast(); cHILDSEGMENTSVS = json['CHILD_SEGMENTS_VS']; - cHILDSEGMENTSVSSplited = json['CHILD_SEGMENTS_VS_Splited']; + cHILDSEGMENTSVSSplited = json['CHILD_SEGMENTS_VS_Splited'] == null ? [] : json['CHILD_SEGMENTS_VS_Splited'].cast(); + dEFAULTTYPE = json['DEFAULT_TYPE']; dEFAULTVALUE = json['DEFAULT_VALUE']; dESCFLEXCONTEXTCODE = json['DESC_FLEX_CONTEXT_CODE']; @@ -95,12 +100,21 @@ class GetEITDFFStructureList { dISPLAYFLAG = json['DISPLAY_FLAG']; eNABLEDFLAG = json['ENABLED_FLAG']; eSERVICESDV = json['E_SERVICES_DV'] != null ? new ESERVICESDV.fromJson(json['E_SERVICES_DV']) : null; + // if (json['E_SERVICES_VS'] != null) { + // eSERVICESVS = []; + // json['E_SERVICES_VS'].forEach((v) { + // eSERVICESVS!.add(v); + // }); + // } if (json['E_SERVICES_VS'] != null) { - eSERVICESVS = []; + eSERVICESVS = []; json['E_SERVICES_VS'].forEach((v) { - eSERVICESVS!.add(v); + eSERVICESVS!.add(new ESERVICESVS.fromJson(v)); }); + } else { + eSERVICESVS = []; } + fLEXVALUESETNAME = json['FLEX_VALUE_SET_NAME']; fORMATTYPE = json['FORMAT_TYPE']; fORMATTYPEDSP = json['FORMAT_TYPE_DSP']; @@ -120,10 +134,11 @@ class GetEITDFFStructureList { }); } pARENTSEGMENTSVS = json['PARENT_SEGMENTS_VS']; + if (json['PARENT_SEGMENTS_VS_SplitedVS'] != null) { - pARENTSEGMENTSVSSplitedVS = []; + pARENTSEGMENTSVSSplitedVS = []; json['PARENT_SEGMENTS_VS_SplitedVS'].forEach((v) { - pARENTSEGMENTSVSSplitedVS!.add(v); + pARENTSEGMENTSVSSplitedVS!.add(new PARENTSEGMENTSVSSplitedVS.fromJson(v)); }); } rEADONLY = json['READ_ONLY']; @@ -156,8 +171,11 @@ class GetEITDFFStructureList { data['E_SERVICES_DV'] = this.eSERVICESDV!.toJson(); } if (this.eSERVICESVS != null) { - data['E_SERVICES_VS'] = this.eSERVICESVS!.toList(); + data['E_SERVICES_VS'] = this.eSERVICESVS!.map((v) => v.toJson()).toList(); } + // if (this.eSERVICESVS != null) { + // data['E_SERVICES_VS'] = this.eSERVICESVS!.toList(); + // } data['FLEX_VALUE_SET_NAME'] = this.fLEXVALUESETNAME; data['FORMAT_TYPE'] = this.fORMATTYPE; data['FORMAT_TYPE_DSP'] = this.fORMATTYPEDSP; @@ -175,8 +193,9 @@ class GetEITDFFStructureList { } data['PARENT_SEGMENTS_VS'] = this.pARENTSEGMENTSVS; if (this.pARENTSEGMENTSVSSplitedVS != null) { - data['PARENT_SEGMENTS_VS_SplitedVS'] = this.pARENTSEGMENTSVSSplitedVS!.toList(); + data['PARENT_SEGMENTS_VS_SplitedVS'] = this.pARENTSEGMENTSVSSplitedVS!.map((v) => v.toJson()).toList(); } + data['READ_ONLY'] = this.rEADONLY; data['REQUIRED_FLAG'] = this.rEQUIREDFLAG; data['SEGMENT_NAME'] = this.sEGMENTNAME; @@ -215,6 +234,40 @@ class ESERVICESDV { } } +class ESERVICESVS { + String? dESCRIPTION; + int? fROMROWNUM; + String? iDCOLUMNNAME; + int? nOOFROWS; + int? rOWNUM; + int? tOROWNUM; + String? vALUECOLUMNNAME; + + ESERVICESVS({this.dESCRIPTION, this.fROMROWNUM, this.iDCOLUMNNAME, this.nOOFROWS, this.rOWNUM, this.tOROWNUM, this.vALUECOLUMNNAME}); + + ESERVICESVS.fromJson(Map json) { + dESCRIPTION = json['DESCRIPTION']; + fROMROWNUM = json['FROM_ROW_NUM']; + iDCOLUMNNAME = json['ID_COLUMN_NAME']; + nOOFROWS = json['NO_OF_ROWS']; + rOWNUM = json['ROW_NUM']; + tOROWNUM = json['TO_ROW_NUM']; + vALUECOLUMNNAME = json['VALUE_COLUMN_NAME']; + } + + Map toJson() { + final Map data = new Map(); + data['DESCRIPTION'] = this.dESCRIPTION; + data['FROM_ROW_NUM'] = this.fROMROWNUM; + data['ID_COLUMN_NAME'] = this.iDCOLUMNNAME; + data['NO_OF_ROWS'] = this.nOOFROWS; + data['ROW_NUM'] = this.rOWNUM; + data['TO_ROW_NUM'] = this.tOROWNUM; + data['VALUE_COLUMN_NAME'] = this.vALUECOLUMNNAME; + return data; + } +} + class PARENTSEGMENTSDVSplited { String? isRequired; String? name; @@ -233,3 +286,22 @@ class PARENTSEGMENTSDVSplited { return data; } } + +class PARENTSEGMENTSVSSplitedVS { + String? isRequired; + String? name; + + PARENTSEGMENTSVSSplitedVS({this.isRequired, this.name}); + + PARENTSEGMENTSVSSplitedVS.fromJson(Map json) { + isRequired = json['IsRequired']; + name = json['Name']; + } + + Map toJson() { + final Map data = new Map(); + data['IsRequired'] = this.isRequired; + data['Name'] = this.name; + return data; + } +} diff --git a/lib/ui/landing/widget/services_widget.dart b/lib/ui/landing/widget/services_widget.dart index 8af4849..f69776c 100644 --- a/lib/ui/landing/widget/services_widget.dart +++ b/lib/ui/landing/widget/services_widget.dart @@ -18,13 +18,13 @@ class ServicesWidget extends StatelessWidget { List namesT = [LocaleKeys.monthlyAttendance.tr(), LocaleKeys.workFromHome.tr(), LocaleKeys.ticketRequest.tr(), LocaleKeys.monthlyAttendance.tr()]; List iconT = [ "assets/images/monthly_attendance.svg", - "assets/images/work_from_home.svg", + "assets/images/dynamic_screens.svg", "assets/images/ticket_request.svg", - "assets/images/work_from_home.svg", - "assets/images/work_from_home.svg", - "assets/images/work_from_home.svg", - "assets/images/work_from_home.svg", - "assets/images/work_from_home.svg" + "assets/images/dynamic_screens.svg", + "assets/images/dynamic_screens.svg", + "assets/images/dynamic_screens.svg", + "assets/images/dynamic_screens.svg", + "assets/images/dynamic_screens.svg" ]; return Consumer( @@ -108,7 +108,8 @@ class ServicesWidget extends StatelessWidget { } void handleOnPress(context, GetMenuEntriesList menuEntry) { - if (menuEntry.menuName == "HMG_OTL_SS") { + print(menuEntry.menuName); + if (menuEntry.menuName == "HMG_OTL_SS" || menuEntry.menuName == "HMG_PT_OTL_SS") { Navigator.pushNamed(context, AppRoutes.myAttendance); } else { Utils.showToast("In Progress"); diff --git a/lib/ui/my_attendance/add_work_from_home_screen.dart b/lib/ui/my_attendance/add_work_from_home_screen.dart deleted file mode 100644 index 108a0b8..0000000 --- a/lib/ui/my_attendance/add_work_from_home_screen.dart +++ /dev/null @@ -1,91 +0,0 @@ -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; -import 'package:mohem_flutter_app/classes/utils.dart'; -import 'package:mohem_flutter_app/extensions/int_extensions.dart'; -import 'package:mohem_flutter_app/extensions/string_extensions.dart'; -import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; -import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; -import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; -import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; -import 'package:mohem_flutter_app/widgets/button/default_button.dart'; - -class AddWorkFromHomeScreen extends StatefulWidget { - AddWorkFromHomeScreen({Key? key}) : super(key: key); - - @override - _AddWorkFromHomeScreenState createState() { - return _AddWorkFromHomeScreenState(); - } -} - -class _AddWorkFromHomeScreenState extends State { - List? getEitDffStructureList; - String? callingFunction; - - @override - void initState() { - super.initState(); - } - - void getTransactionsStructure() async { - try { - Utils.showLoading(context); - getEitDffStructureList = await MyAttendanceApiClient().getEitDffStructure(callingFunction!); - getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG == "Y").toList(); - Utils.hideLoading(context); - setState(() {}); - } catch (ex) { - Utils.hideLoading(context); - Utils.handleException(ex, context, null); - } - } - - @override - void dispose() { - super.dispose(); - } - - @override - Widget build(BuildContext context) { - if (callingFunction == null) { - callingFunction = "HMG_OTL_WFH_EIT_SS"; // ModalRoute.of(context)!.settings.arguments as WorkListResponseModel; - getTransactionsStructure(); - } - return Scaffold( - backgroundColor: Colors.white, - appBar: AppBarWidget( - context, - title: LocaleKeys.workFromHome.tr(), - ), - body: Column( - children: [ - (getEitDffStructureList == null - ? const SizedBox() - : (getEitDffStructureList!.isEmpty - ? LocaleKeys.noDataAvailable.tr().toText16().center - : ListView.separated( - physics: const BouncingScrollPhysics(), - padding: EdgeInsets.all(21), - itemBuilder: (cxt, int parentIndex) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [], - ).objectContainerView(), - separatorBuilder: (cxt, index) => 12.height, - itemCount: getEitDffStructureList!.length))) - .expanded, - // 12.height, - DefaultButton( - LocaleKeys.next.tr(), - (getEitDffStructureList ?? []).isEmpty - ? null - : () => { - //Navigator.of(context).pushNamed(LOGIN_TYPE) - }, - ).insideContainer, - ], - ), - ); - } -} diff --git a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart new file mode 100644 index 0000000..6fe23ae --- /dev/null +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -0,0 +1,221 @@ +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/dyanmic_forms/get_set_values_request_model.dart'; +import 'package:mohem_flutter_app/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; +import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; +import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; + +class DynamicInputScreen extends StatefulWidget { + DynamicInputScreen({Key? key}) : super(key: key); + + @override + _DynamicInputScreenState createState() { + return _DynamicInputScreenState(); + } +} + +class _DynamicInputScreenState extends State { + GenericResponseModel? genericResponseModel; + List? getEitDffStructureList; + DynamicListViewParams? dynamicParams; + + @override + void initState() { + super.initState(); + } + + void getTransactionsStructure() async { + try { + Utils.showLoading(context); + genericResponseModel = await MyAttendanceApiClient().getEitDffStructure(dynamicParams!.dynamicId); + getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? []; + //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void calGetValueSetValues(GetEITDFFStructureList structureList) async { + try { + Utils.showLoading(context); + String segmentId = structureList.cHILDSEGMENTSVS!; + List filteredList = getEitDffStructureList?.where((element) => element.cHILDSEGMENTSVS == segmentId).toList() ?? []; + List> values = filteredList + .map((e) => GetSetValuesRequestModel( + sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) + .toJson()) + .toList(); + ESERVICESVS genericResponseModel = await MyAttendanceApiClient().getValueSetValues(structureList.cHILDSEGMENTSVS!, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); + + int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS); + getEitDffStructureList![index].eSERVICESVS!.add(genericResponseModel); + // getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? []; + //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + if (dynamicParams == null) { + dynamicParams = ModalRoute.of(context)!.settings.arguments as DynamicListViewParams; + getTransactionsStructure(); + } + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: dynamicParams!.title, + ), + body: Column( + children: [ + (getEitDffStructureList == null + ? const SizedBox() + : (getEitDffStructureList!.isEmpty + ? LocaleKeys.noDataAvailable.tr().toText16().center + : ListView.separated( + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.all(21), + itemBuilder: (cxt, int parentIndex) => parseDynamicFormatType(getEitDffStructureList![parentIndex], parentIndex), + separatorBuilder: (cxt, index) => 0.height, + itemCount: getEitDffStructureList!.length))) + .expanded, + // 12.height, + DefaultButton( + LocaleKeys.next.tr(), + (getEitDffStructureList ?? []).isEmpty + ? null + : () => { + //Navigator.of(context).pushNamed(LOGIN_TYPE) + }, + ).insideContainer, + ], + ), + ); + } + + Widget parseDynamicFormatType(GetEITDFFStructureList model, int index) { + if (model.dISPLAYFLAG != "N") { + } else { + return const SizedBox(); + } + + if (model.fORMATTYPE == "C") { + if (model.eSERVICESVS?.isNotEmpty ?? false) { + return PopupMenuButton( + child: DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.eSERVICESDV?.pIDCOLUMNNAME ?? "", + isEnable: false, + isPopup: true, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < model.eSERVICESVS!.length; i++) PopupMenuItem(child: Text(model.eSERVICESVS![i].vALUECOLUMNNAME!), value: i), + ], + onSelected: (int index) { + + ESERVICESDV eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: model.eSERVICESVS![index].vALUECOLUMNNAME, + pRETURNMSG: "null", + pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, + pVALUECOLUMNNAME: model.eSERVICESVS![index].vALUECOLUMNNAME); + + print(model.eSERVICESVS![index].toJson()); + }); + } + + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.eSERVICESDV?.pIDCOLUMNNAME ?? "", + isReadOnly: model.rEADONLY == "Y", + onChange: (text) { + model.fieldAnswer = text; + }, + ).paddingOnly(bottom: 12); + } else if (model.fORMATTYPE == "X") { + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.eSERVICESDV?.pIDCOLUMNNAME ?? (getEitDffStructureList![index].fieldAnswer ?? ""), + suffixIconData: Icons.calendar_today, + isEnable: false, + onTap: () async { + DateTime date = await _selectDate(context); + DateTime date1 = DateTime(date.year, date.month, date.day); + getEitDffStructureList![index].fieldAnswer = date.toString(); + ESERVICESDV eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), + pRETURNMSG: "null", + pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, + pVALUECOLUMNNAME: DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + getEitDffStructureList![index].eSERVICESDV = eservicesdv; + setState(() {}); + if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + calGetValueSetValues(model); + } + }, + ).paddingOnly(bottom: 12); + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [], + ).objectContainerView(); + } + + DateTime selectedDate = DateTime.now(); + + Future _selectDate(BuildContext context) async { + DateTime time = selectedDate; + if (!Platform.isIOS) { + await showCupertinoModalPopup( + context: context, + builder: (cxt) => Container( + height: 250, + color: Colors.white, + child: CupertinoDatePicker( + backgroundColor: Colors.white, + mode: CupertinoDatePickerMode.date, + onDateTimeChanged: (value) { + if (value != null && value != selectedDate) { + time = value; + } + }, + initialDateTime: selectedDate, + ), + ), + ); + } else { + final DateTime? picked = + await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101)); + if (picked != null && picked != selectedDate) { + time = picked; + } + } + return time; + } +} diff --git a/lib/ui/my_attendance/work_from_home_screen.dart b/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart similarity index 81% rename from lib/ui/my_attendance/work_from_home_screen.dart rename to lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart index cff2594..ccf4222 100644 --- a/lib/ui/my_attendance/work_from_home_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart @@ -12,19 +12,24 @@ import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; -class WorkFromHomeScreen extends StatefulWidget { - WorkFromHomeScreen({Key? key}) : super(key: key); +class DynamicListViewParams { + String title; + String dynamicId; + DynamicListViewParams(this.title, this.dynamicId); +} + +class DynamicListViewScreen extends StatefulWidget { + DynamicListViewScreen({Key? key}) : super(key: key); @override - _WorkFromHomeScreenState createState() { - return _WorkFromHomeScreenState(); + _DynamicListViewScreenState createState() { + return _DynamicListViewScreenState(); } } -class _WorkFromHomeScreenState extends State { +class _DynamicListViewScreenState extends State { List? getEITTransactionList; - String? callingFunction; - + DynamicListViewParams? dynamicParams; @override void initState() { super.initState(); @@ -33,7 +38,7 @@ class _WorkFromHomeScreenState extends State { void getTransactions() async { try { Utils.showLoading(context); - getEITTransactionList = await MyAttendanceApiClient().getEitTransaction(callingFunction!); + getEITTransactionList = await MyAttendanceApiClient().getEitTransaction(dynamicParams!.dynamicId); Utils.hideLoading(context); setState(() {}); } catch (ex) { @@ -49,8 +54,8 @@ class _WorkFromHomeScreenState extends State { @override Widget build(BuildContext context) { - if (callingFunction == null) { - callingFunction = "HMG_OTL_WFH_EIT_SS"; // ModalRoute.of(context)!.settings.arguments as WorkListResponseModel; + if (dynamicParams == null) { + dynamicParams = ModalRoute.of(context)!.settings.arguments as DynamicListViewParams; getTransactions(); } @@ -58,7 +63,7 @@ class _WorkFromHomeScreenState extends State { backgroundColor: Colors.white, appBar: AppBarWidget( context, - title: LocaleKeys.workFromHome.tr(), + title: dynamicParams!.title, ), body: getEITTransactionList == null ? const SizedBox() @@ -91,7 +96,7 @@ class _WorkFromHomeScreenState extends State { ), child: const Icon(Icons.add, color: Colors.white, size: 30), ).onPress(() { - Navigator.pushNamed(context, AppRoutes.addWorkFromHome); + Navigator.pushNamed(context, AppRoutes.addDynamicInput,arguments: dynamicParams); }), ); } diff --git a/lib/ui/my_attendance/my_attendance_screen.dart b/lib/ui/my_attendance/my_attendance_screen.dart index f171577..2b74c98 100644 --- a/lib/ui/my_attendance/my_attendance_screen.dart +++ b/lib/ui/my_attendance/my_attendance_screen.dart @@ -7,6 +7,7 @@ import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; class MyAttendanceScreen extends StatelessWidget { @@ -29,6 +30,7 @@ class MyAttendanceScreen extends StatelessWidget { "assets/images/pdf.svg", LocaleKeys.missingSwipes.tr(), ).onPress(() { + Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.missingSwipes.tr(), "HMG_OTL_MISSING_SWIPE_EIT_SS")); }), 12.height, @@ -36,7 +38,7 @@ class MyAttendanceScreen extends StatelessWidget { "assets/images/pdf.svg", LocaleKeys.workFromHome.tr(), ).onPress(() { - Navigator.pushNamed(context, AppRoutes.workFromHome); + Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.workFromHome.tr(), "HMG_OTL_WFH_EIT_SS")); }), 12.height, itemView( diff --git a/lib/widgets/dynamic_forms/dynamic_textfield_widget.dart b/lib/widgets/dynamic_forms/dynamic_textfield_widget.dart new file mode 100644 index 0000000..23404ca --- /dev/null +++ b/lib/widgets/dynamic_forms/dynamic_textfield_widget.dart @@ -0,0 +1,108 @@ +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; + +class DynamicTextFieldWidget extends StatelessWidget { + final String labelText; + final String hintText; + // final TextEditingController controller; + final VoidCallback? onTap; + final IconData? suffixIconData; + final bool isEnable; + final bool isReadOnly; + final bool isPopup; + final int? lines; + final bool isInputTypeNum; + final bool isObscureText; + final bool isBackgroundEnable; + final void Function(String)? onChange; + + DynamicTextFieldWidget(this.labelText, this.hintText, //this.controller, + {this.isObscureText = false, + this.onTap, + this.suffixIconData, + this.isEnable = true, + this.isReadOnly = false, + this.isPopup = false, + this.lines = 1, + this.onChange, + this.isInputTypeNum = false, + this.isBackgroundEnable = false}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.only(left: 16, right: 16, bottom: 15, top: 15), + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + color: isReadOnly ? MyColors.lightGreyEFColor : Colors.white, + border: Border.all( + color: MyColors.lightGreyEFColor, + width: 1, + ), + ), + child: InkWell( + onTap: onTap, + child: Row( + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + labelText, + style: const TextStyle( + fontSize: 11, + fontWeight: FontWeight.w600, + color: Color(0xff2B353E), + letterSpacing: -0.44, + ), + ), + TextField( + enabled: isEnable, + scrollPadding: EdgeInsets.zero, readOnly: isReadOnly, + keyboardType: isInputTypeNum ? TextInputType.number : TextInputType.text, + //controller: controller, + maxLines: lines, + obscuringCharacter: "*", + obscureText: isObscureText, + onChanged: onChange, + style: const TextStyle( + fontSize: 14, + height: 21 / 14, + fontWeight: FontWeight.w400, + color: Color(0xff2B353E), + letterSpacing: -0.44, + ), + decoration: InputDecoration( + isDense: true, + hintText: hintText, + fillColor: isReadOnly ? MyColors.borderColor : null, + hintStyle: const TextStyle( + fontSize: 14, + height: 21 / 14, + fontWeight: FontWeight.w400, + color: Color(0xff575757), + letterSpacing: -0.56, + ), + // suffixIconConstraints: const BoxConstraints(minWidth: 50), + // suffixIcon: suffixIconData == null ? null : Icon(suffixIconData, color: MyColors.darkTextColor), + // suffixIcon: suffixTap == null ? null : IconButton(icon: Icon(suffixIconData, color: MyColors.darkTextColor), onPressed: suffixTap), + contentPadding: EdgeInsets.zero, + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + ), + ], + ), + ), + if (isPopup) const Icon(Icons.keyboard_arrow_down_outlined, color: MyColors.darkTextColor), + if (onTap != null) Icon(suffixIconData ?? Icons.keyboard_arrow_down_outlined, color: MyColors.darkTextColor), + ], + ), + ), + ); + } +} From b5a5399b95ea486fa8085d7b8625840220c9a5f9 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Thu, 2 Jun 2022 11:54:02 +0300 Subject: [PATCH 3/7] profile --- assets/images/basic-details.svg | 9 ++ assets/images/contact-details.svg | 5 + assets/images/family-members.svg | 3 + assets/images/personal-info.svg | 14 +++ assets/langs/en-US.json | 7 +- lib/api/profile_api_client.dart | 21 +++-- lib/classes/consts.dart | 4 +- lib/models/profile_menu.model.dart | 4 +- lib/ui/profile/basic_details.dart | 78 ++++++++++++++- lib/ui/profile/personal_info.dart | 94 +++++++++---------- lib/ui/screens/profile/profile_screen.dart | 74 ++++++++++++--- .../screens/profile/widgets/profile_info.dart | 14 ++- lib/widgets/bottom_sheet.dart | 39 ++++++++ lib/widgets/radio/show_radio.dart | 5 +- pubspec.yaml | 2 +- 15 files changed, 280 insertions(+), 93 deletions(-) create mode 100644 assets/images/basic-details.svg create mode 100644 assets/images/contact-details.svg create mode 100644 assets/images/family-members.svg create mode 100644 assets/images/personal-info.svg diff --git a/assets/images/basic-details.svg b/assets/images/basic-details.svg new file mode 100644 index 0000000..215f00b --- /dev/null +++ b/assets/images/basic-details.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/contact-details.svg b/assets/images/contact-details.svg new file mode 100644 index 0000000..c9ac5a5 --- /dev/null +++ b/assets/images/contact-details.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/family-members.svg b/assets/images/family-members.svg new file mode 100644 index 0000000..eca7dd5 --- /dev/null +++ b/assets/images/family-members.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/personal-info.svg b/assets/images/personal-info.svg new file mode 100644 index 0000000..9daf5ad --- /dev/null +++ b/assets/images/personal-info.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index dd2d2a4..9097f9e 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -236,16 +236,15 @@ "month": "Month", "day": "Day", "completingYear": "We appreciate you for completing the service of", - "address" : "Address", + "address": "Address", "phoneNumber": "Phone Number", "businessGroup": "Business", "Payroll": "Payroll", "civilIdentityNumber": "Civil Identity Number", - "dateOfBirth" : "Date of Birth", + "dateOfBirth": "Date of Birth", "maritalStatus ": "Marital Status ", "fullName": "Full Name", - "remove": "remove", - "update": "update", + "remove": "Remove", "profile": { "reset_password": { "label": "Reset Password", diff --git a/lib/api/profile_api_client.dart b/lib/api/profile_api_client.dart index 9d9056e..bb6a900 100644 --- a/lib/api/profile_api_client.dart +++ b/lib/api/profile_api_client.dart @@ -1,5 +1,3 @@ - - import 'dart:async'; import 'package:mohem_flutter_app/app_state/app_state.dart'; @@ -18,12 +16,11 @@ class ProfileApiClient { factory ProfileApiClient() => _instance; - Future> getEmployeeContacts() async { String url = "${ApiConsts.erpRest}GET_EMPLOYEE_CONTACTS"; Map postParams = { - "P_MENU_TYPE": "E", - "P_SELECTED_RESP_ID": -999, + "P_MENU_TYPE": "E", + "P_SELECTED_RESP_ID": -999, }; postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { @@ -32,7 +29,7 @@ class ProfileApiClient { }, url, postParams); } - Future> getEmployeeBasicDetails() async { + Future> getEmployeeBasicDetails() async { String url = "${ApiConsts.erpRest}GET_EMPLOYEE_BASIC_DETAILS"; Map postParams = { "P_MENU_TYPE": "E", @@ -70,4 +67,14 @@ class ProfileApiClient { return responseData.getEmployeeAddressList ?? []; }, url, postParams); } -} \ No newline at end of file + + Future updateEmpImage(img) async { + String url = "${ApiConsts.erpRest}UPDATE_EMPLOYEE_IMAGE"; + Map postParams = {"P_MENU_TYPE": "E", "P_SELECTED_RESP_ID": -999, "P_IMAGE": img}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + // GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return json['UpdateEmployeeImageList']; + }, url, postParams); + } +} diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index ca8e2f0..e9e3c86 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -1,7 +1,7 @@ class ApiConsts { //static String baseUrl = "http://10.200.204.20:2801/"; // Local server - // static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server - static String baseUrl = "https://hmgwebservices.com"; // Live server + static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server + //static String baseUrl = "https://hmgwebservices.com"; // Live server static String baseUrlServices = baseUrl + "/Services/"; // server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/"; diff --git a/lib/models/profile_menu.model.dart b/lib/models/profile_menu.model.dart index 4593f9c..c26ee7f 100644 --- a/lib/models/profile_menu.model.dart +++ b/lib/models/profile_menu.model.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; class ProfileMenu { final String name; - final IconData icon; + final String icon; final String route; - ProfileMenu({this.name = '', this.icon = Icons.home, this.route = ''}); + ProfileMenu({this.name = '', this.icon = '', this.route = ''}); } diff --git a/lib/ui/profile/basic_details.dart b/lib/ui/profile/basic_details.dart index e229918..5110fae 100644 --- a/lib/ui/profile/basic_details.dart +++ b/lib/ui/profile/basic_details.dart @@ -11,6 +11,7 @@ import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/ui/profile/profile.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; +import 'package:mohem_flutter_app/widgets/radio/show_radio.dart'; class BasicDetails extends StatefulWidget { const BasicDetails({Key? key}) : super(key: key); @@ -150,9 +151,82 @@ class _BasicDetailsState extends State { ], ), child: DefaultButton(LocaleKeys.update.tr(), () async { - // context.setLocale(const Locale("en", "US")); // to change Loacle - Profile(); + showAlertDialog(context); }).insideContainer, ); } + + showAlertDialog(BuildContext context) { + dynamic changeOrNew = 1; + Widget cancelButton = TextButton( + child: Text("Cancel"), + onPressed: () { + Navigator.pop(context); + }, + ); + Widget continueButton = TextButton( + child: Text("Next"), + onPressed: () {}, + ); + StatefulBuilder alert = StatefulBuilder(builder: (context, setState) { + return AlertDialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10.0))), + title: Text("Confirm"), + content: Builder(builder: (context) { + // Get available height and width of the build area of this widget. Make a choice depending on the size. + var height = MediaQuery.of(context).size.height * .5; + return Container( + height: height, + child: Column(children: [ + Text( + "Select the type of change you want to make.", + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + Divider(), + Column( + children: [ + ListTile( + title: Text("correct or complete the current details"), + leading: Radio( + value: 1, + groupValue: changeOrNew, + onChanged: (value) { + setState(() { + changeOrNew = int.parse(value.toString()); + }); + }, + activeColor: Colors.green, + ), + ), + ListTile( + title: Text("Enter new Information because of a real change to the current details (e.g because of a change in marital status)"), + leading: Radio( + value: 2, + groupValue: changeOrNew, + onChanged: (value) { + setState(() { + changeOrNew = int.parse(value.toString()); + }); + }, + activeColor: Colors.green, + ), + ), + ], + ) + ])); + }), + actions: [ + cancelButton, + continueButton, + ], + ); + }); + + showDialog( + context: context, + builder: (BuildContext context) { + return alert; + }, + ); + } } diff --git a/lib/ui/profile/personal_info.dart b/lib/ui/profile/personal_info.dart index b136141..0ad9e2f 100644 --- a/lib/ui/profile/personal_info.dart +++ b/lib/ui/profile/personal_info.dart @@ -1,17 +1,12 @@ - -import 'package:easy_localization/src/public_ext.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:mohem_flutter_app/api/profile_api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; -import 'package:mohem_flutter_app/classes/utils.dart'; -import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; -import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart'; -import 'package:mohem_flutter_app/ui/profile/profile.dart'; + import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; @@ -37,29 +32,30 @@ class _PesonalInfoState extends State { List getEmployeeBasicDetailsList = []; - @override void initState() { super.initState(); memberInformationList = AppState().memberInformationList!; - } - Widget build(BuildContext context) { return Scaffold( appBar: AppBarWidget( context, title: LocaleKeys.profile_personalInformation.tr(), ), - backgroundColor: MyColors.backgroundColor, - bottomSheet:footer(), - body: Column( - children: [ - Container( + backgroundColor: MyColors.backgroundColor, + // bottomSheet:footer(), + body: Column( + children: [ + Container( width: double.infinity, - margin: EdgeInsets.only(top: 28, left: 26, right: 26,), - padding: EdgeInsets.only(left: 14, right: 14,top: 13, bottom: 20), + margin: EdgeInsets.only( + top: 28, + left: 26, + right: 26, + ), + padding: EdgeInsets.only(left: 14, right: 14, top: 13, bottom: 20), height: 350, decoration: BoxDecoration( boxShadow: [ @@ -70,40 +66,39 @@ class _PesonalInfoState extends State { offset: Offset(0, 3), ), ], - color: Colors.white, - borderRadius: BorderRadius.circular(10.0), + color: Colors.white, + borderRadius: BorderRadius.circular(10.0), ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.category.tr().toText13(color: MyColors.lightGrayColor), - "${memberInformationList!.eMPLOYMENTCATEGORYMEANING}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - LocaleKeys.address.tr().toText13(color: MyColors.lightGrayColor), - "${memberInformationList!.lOCATIONNAME}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - LocaleKeys.phoneNumber.tr().toText13(color: MyColors.lightGrayColor), - "${memberInformationList!.eMPLOYEEMOBILENUMBER}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - LocaleKeys.businessGroup.tr().toText13(color: MyColors.lightGrayColor), - "${memberInformationList!.bUSINESSGROUPNAME}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - LocaleKeys.Payroll.tr().toText13(color: MyColors.lightGrayColor), - "${memberInformationList!.pAYROLLNAME}".toText16(isBold: true, color: MyColors.blackColor), - ] - ), + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + LocaleKeys.category.tr().toText13(color: MyColors.lightGrayColor), + "${memberInformationList!.eMPLOYMENTCATEGORYMEANING}".toText16(isBold: true, color: MyColors.blackColor), + SizedBox( + height: 20, ), - ], - ) - - ); + LocaleKeys.address.tr().toText13(color: MyColors.lightGrayColor), + "${memberInformationList!.lOCATIONNAME}".toText16(isBold: true, color: MyColors.blackColor), + SizedBox( + height: 20, + ), + LocaleKeys.phoneNumber.tr().toText13(color: MyColors.lightGrayColor), + "${memberInformationList!.eMPLOYEEMOBILENUMBER}".toText16(isBold: true, color: MyColors.blackColor), + SizedBox( + height: 20, + ), + LocaleKeys.businessGroup.tr().toText13(color: MyColors.lightGrayColor), + "${memberInformationList!.bUSINESSGROUPNAME}".toText16(isBold: true, color: MyColors.blackColor), + SizedBox( + height: 20, + ), + LocaleKeys.Payroll.tr().toText13(color: MyColors.lightGrayColor), + "${memberInformationList!.pAYROLLNAME}".toText16(isBold: true, color: MyColors.blackColor), + ]), + ), + ], + )); } - footer(){ + footer() { return Container( decoration: BoxDecoration( // borderRadius: BorderRadius.circular(10), @@ -112,10 +107,7 @@ class _PesonalInfoState extends State { BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), ], ), - child: DefaultButton(LocaleKeys.update.tr(), () async { - // context.setLocale(const Locale("en", "US")); // to change Loacle - Profile(); - }).insideContainer, + child: DefaultButton(LocaleKeys.update.tr(), () async {}).insideContainer, ); } } diff --git a/lib/ui/screens/profile/profile_screen.dart b/lib/ui/screens/profile/profile_screen.dart index f1c0f8f..c1be51e 100644 --- a/lib/ui/screens/profile/profile_screen.dart +++ b/lib/ui/screens/profile/profile_screen.dart @@ -1,7 +1,8 @@ import 'dart:ui'; - +import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; @@ -9,6 +10,7 @@ import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/ui/screens/profile/widgets/header.dart'; import 'package:mohem_flutter_app/ui/screens/profile/widgets/profile_panel.dart'; +import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; class ProfileScreen extends StatefulWidget { const ProfileScreen({Key? key}) : super(key: key); @@ -19,8 +21,8 @@ class ProfileScreen extends StatefulWidget { class _ProfileScreenState extends State { late MemberInformationListModel memberInformationList; - - List getEmployeeBasicDetailsList = []; + final ImagePicker _picker = ImagePicker(); + //List getEmployeeBasicDetailsList = []; @override void initState() { @@ -65,6 +67,9 @@ class _ProfileScreenState extends State { color: Colors.white, )), InkWell( + onTap: () { + startImageSheet(); + }, child: Container( padding: EdgeInsets.only(left: 10, right: 10, top: 5, bottom: 5), decoration: BoxDecoration(borderRadius: BorderRadius.circular(15), color: Colors.black.withOpacity(.3)), @@ -84,18 +89,61 @@ class _ProfileScreenState extends State { ])); } - void getEmployeeBasicDetails() async { - try { + startImageSheet() { + showMyBottomSheet(context, + child: Column( + children: [ + Container( + padding: EdgeInsets.only(left: 20, right: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [Text('OK'), Text('CANCEL')], + )), + BottomSheetItem( + onTap: () { + openGallery(false); + }, + title: 'Open Gallery', + icon: Icons.browse_gallery_outlined, + ), + BottomSheetItem( + onTap: () { + openGallery(true); + }, + title: 'Open Camera', + icon: Icons.camera, + ) + ], + )); + } + + void openGallery(bool isCamera) async { + final XFile? image = await _picker.pickImage(source: isCamera ? ImageSource.camera : ImageSource.gallery); + + if (image != null) { + String img = base64.encode(await image!.readAsBytes()); Utils.showLoading(context); - getEmployeeBasicDetailsList = await ProfileApiClient().getEmployeeBasicDetails(); - Utils.hideLoading(context); - //basicDetails(); - print("getEmployeeBasicDetailsList.length"); - print(getEmployeeBasicDetailsList.length); - setState(() {}); - } catch (ex) { + dynamic empImageUpdteResp = await ProfileApiClient().updateEmpImage(img); Utils.hideLoading(context); - Utils.handleException(ex, context, null); + if (empImageUpdteResp['P_RETURN_STATUS'] == 'S') { + setState(() { + memberInformationList.eMPLOYEEIMAGE = img; + }); + } } } + // void getEmployeeBasicDetails() async { + // try { + // Utils.showLoading(context); + // getEmployeeBasicDetailsList = await ProfileApiClient().getEmployeeBasicDetails(); + // Utils.hideLoading(context); + // //basicDetails(); + // print("getEmployeeBasicDetailsList.length"); + // print(getEmployeeBasicDetailsList.length); + // setState(() {}); + // } catch (ex) { + // Utils.hideLoading(context); + // Utils.handleException(ex, context, null); + // } + // } } diff --git a/lib/ui/screens/profile/widgets/profile_info.dart b/lib/ui/screens/profile/widgets/profile_info.dart index 1141fcf..8919924 100644 --- a/lib/ui/screens/profile/widgets/profile_info.dart +++ b/lib/ui/screens/profile/widgets/profile_info.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart'; @@ -12,10 +13,10 @@ class ProfileInFo extends StatelessWidget { String data = '.'; double sliderValue = 75; List menu = [ - ProfileMenu(name: LocaleKeys.profile_personalInformation.tr(), icon: Icons.info, route: AppRoutes.personalInfo), - ProfileMenu(name: LocaleKeys.profile_basicDetails.tr(), icon: Icons.contacts, route: AppRoutes.basicDetails), - ProfileMenu(name: LocaleKeys.profile_contactDetails.tr(), icon: Icons.location_on, route: AppRoutes.contactDetails), - ProfileMenu(name: LocaleKeys.profile_familyDetails.tr(), icon: Icons.reduce_capacity_sharp, route: AppRoutes.familyMembers), + ProfileMenu(name: LocaleKeys.profile_personalInformation.tr(), icon: 'personal-info.svg', route: AppRoutes.personalInfo), + ProfileMenu(name: LocaleKeys.profile_basicDetails.tr(), icon: 'basic-details.svg', route: AppRoutes.basicDetails), + ProfileMenu(name: LocaleKeys.profile_contactDetails.tr(), icon: 'contact-details.svg', route: AppRoutes.contactDetails), + ProfileMenu(name: LocaleKeys.profile_familyDetails.tr(), icon: 'family-members.svg', route: AppRoutes.familyMembers), ]; @override Widget build(BuildContext context) { @@ -103,10 +104,7 @@ class ProfileInFo extends StatelessWidget { Navigator.pushNamed(context, obj.route); }, child: ListTile( - leading: Icon( - obj.icon, - color: Color(0xff2BB8A6), - ), + leading: SvgPicture.asset('assets/images/' + obj.icon), title: Text(obj.name), trailing: Icon(Icons.arrow_forward), ), diff --git a/lib/widgets/bottom_sheet.dart b/lib/widgets/bottom_sheet.dart index a44fd7b..f0bf3f8 100644 --- a/lib/widgets/bottom_sheet.dart +++ b/lib/widgets/bottom_sheet.dart @@ -39,3 +39,42 @@ showMyBottomSheet(BuildContext context, {required Widget child}) { }, ); } + +class BottomSheetItem extends StatelessWidget { + final Function onTap; + final IconData icon; + final String title; + final Color color; + + const BottomSheetItem({Key? key, required this.onTap, required this.title, required this.icon, this.color = Colors.black}) : super(key: key); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + if (onTap != null) { + Navigator.pop(context); + onTap(); + } + }, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 18.0, vertical: 18.0), + child: Row( + children: [ + if (icon != null) + Icon( + icon, + color: color, + size: 18.0, + ), + if (icon != null) SizedBox(width: 24.0), + Text( + title ?? "", + style: TextStyle(color: color), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/radio/show_radio.dart b/lib/widgets/radio/show_radio.dart index fda5bf9..65e0e36 100644 --- a/lib/widgets/radio/show_radio.dart +++ b/lib/widgets/radio/show_radio.dart @@ -7,8 +7,7 @@ import 'package:mohem_flutter_app/extensions/int_extensions.dart'; class ShowRadio extends StatelessWidget { String title, value, groupValue; - ShowRadio( - {required this.title, required this.value, required this.groupValue}); + ShowRadio({required this.title, required this.value, required this.groupValue}); @override Widget build(BuildContext context) { @@ -34,7 +33,7 @@ class ShowRadio extends StatelessWidget { ), ), 12.width, - title.toText12(isBold: true) + title.toText12(isBold: true, maxLine: 2) ], ); } diff --git a/pubspec.yaml b/pubspec.yaml index 8afdae3..b613514 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -54,7 +54,7 @@ dependencies: flutter_countdown_timer: ^4.1.0 nfc_manager: ^3.1.1 uuid: ^3.0.6 - + image_picker: ^0.8.5+3 # maps google_maps_flutter: ^2.0.2 google_maps_utils: ^1.4.0+1 From 8f80bbb9dbb2094efbc5c3fcffba8fcfc72fc7ee Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Wed, 8 Jun 2022 10:27:35 +0300 Subject: [PATCH 4/7] profile dynamic forms --- lib/api/profile_api_client.dart | 41 +++ lib/config/routes.dart | 4 + lib/models/generic_response_model.dart | 22 +- .../basic_details_cols_structions.dart | 83 +++++ .../profile/basic_details_dff_structure.dart | 187 +++++++++++ lib/models/profile_menu.model.dart | 5 +- lib/ui/attendance/monthly_attendance.dart | 1 - .../dynamic_screens/dynamic_input_screen.dart | 1 - .../dynamic_listview_screen.dart | 7 +- lib/ui/profile/basic_details.dart | 13 +- .../dynamic_screens/dynamic_input_screen.dart | 299 ++++++++++++++++++ .../dynamic_listview_screen.dart | 105 ++++++ lib/ui/screens/profile/profile_screen.dart | 16 +- .../screens/profile/widgets/profile_info.dart | 18 +- 14 files changed, 771 insertions(+), 31 deletions(-) create mode 100644 lib/models/profile/basic_details_cols_structions.dart create mode 100644 lib/models/profile/basic_details_dff_structure.dart create mode 100644 lib/ui/profile/dynamic_screens/dynamic_input_screen.dart create mode 100644 lib/ui/profile/dynamic_screens/dynamic_listview_screen.dart diff --git a/lib/api/profile_api_client.dart b/lib/api/profile_api_client.dart index bb6a900..7f783f2 100644 --- a/lib/api/profile_api_client.dart +++ b/lib/api/profile_api_client.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; import 'package:mohem_flutter_app/models/get_employee_address_model.dart'; import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; @@ -77,4 +78,44 @@ class ProfileApiClient { return json['UpdateEmployeeImageList']; }, url, postParams); } + + Future getDffStructure(String pFunctionName, String uRL, String requestType) async { + String url = ApiConsts.erpRest + uRL; + Map postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E", "P_FUNCTION_NAME": pFunctionName, "P_REQUEST_TYPE": requestType}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData; + }, url, postParams); + } + + Future getColStructure(String pFunctionName, String uRL, String requestType) async { + String url = ApiConsts.erpRest + uRL; + Map postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E", "P_FUNCTION_NAME": pFunctionName, "P_REQUEST_TYPE": requestType}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData; + }, url, postParams); + } + + Future getValueSetValues(String pSegmentName, String pDescFlexContextCode, String pDescFlexName, List> list) async { + String url = "${ApiConsts.erpRest}GET_VALUE_SET_VALUES"; + Map postParams = { + "P_SELECTED_RESP_ID": -999, + "P_MENU_TYPE": "E", + "P_PAGE_LIMIT": 1000, + "P_PAGE_NUM": 1, + "P_PARENT_VALUE": null, + "P_SEGMENT_NAME": pSegmentName, + "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, + "P_DESC_FLEX_NAME": pDescFlexName, + "GetValueSetValuesTBL": list, + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getValueSetValuesList!.first; + }, url, postParams); + } } diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 20acd28..a9007cb 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -8,6 +8,7 @@ import 'package:mohem_flutter_app/ui/login/verify_last_login_screen.dart'; import 'package:mohem_flutter_app/ui/login/verify_login_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/my_attendance_screen.dart'; +import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_screen.dart'; // import 'package:mohem_flutter_app/ui/my_attendance/work_from_home_screen.dart'; import 'package:mohem_flutter_app/ui/screens/eit/add_eit.dart'; import 'package:mohem_flutter_app/ui/screens/profile/profile_screen.dart'; @@ -53,6 +54,8 @@ class AppRoutes { static const String addDynamicInput = "/addDynamicInput"; //profile + + static const String addDynamicInputProfile = 'addDynamicInputProfile'; //Attendance static const String attendance = "/attendance"; static const String monthlyAttendance = "/monthlyAttendance"; @@ -106,5 +109,6 @@ class AppRoutes { familyMembers: (context) => FamilyMembers(), dynamicScreen: (context) => DynamicListViewScreen(), addDynamicInput: (context) => DynamicInputScreen(), + addDynamicInputProfile: (context) => DynamicInputScreenProfile(), }; } diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index 366489c..92eb6db 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -23,6 +23,8 @@ import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart'; import 'package:mohem_flutter_app/models/member_login_list_model.dart'; import 'package:mohem_flutter_app/models/notification_action_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart'; +import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart'; +import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart'; import 'package:mohem_flutter_app/models/subordinates_on_leaves_model.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; @@ -97,8 +99,8 @@ class GenericResponseModel { List? getApprovesList; List? getAttachementList; GetAttendanceTracking? getAttendanceTrackingList; - List? getBasicDetColsStructureList; - List? getBasicDetDffStructureList; + List? getBasicDetColsStructureList; + List? getBasicDetDffStructureList; List? getBasicDetNtfBodyList; List? getCEICollectionNotificationBodyList; List? getCEIDFFStructureList; @@ -623,9 +625,19 @@ class GenericResponseModel { }); } getAttendanceTrackingList = json["GetAttendanceTrackingList"] == null ? null : GetAttendanceTracking.fromMap(json["GetAttendanceTrackingList"]); - getBasicDetColsStructureList = json['GetBasicDetColsStructureList']; - getBasicDetDffStructureList = json['GetBasicDetDffStructureList']; - + if (json['GetBasicDetColsStructureList'] != null) { + getBasicDetColsStructureList = []; + json['GetBasicDetColsStructureList'].forEach((v) { + getBasicDetColsStructureList!.add(new GetBasicDetColsStructureList.fromJson(v)); + }); + } + // getBasicDetDffStructureList = json['GetBasicDetDffStructureList']; + if (json['GetBasicDetDffStructureList'] != null) { + getBasicDetDffStructureList = []; + json['GetBasicDetDffStructureList'].forEach((v) { + getBasicDetDffStructureList!.add(new GetBasicDetDffStructureList.fromJson(v)); + }); + } if (json['GetBasicDetNtfBodyList'] != null) { getBasicDetNtfBodyList = []; json['GetBasicDetNtfBodyList'].forEach((v) { diff --git a/lib/models/profile/basic_details_cols_structions.dart b/lib/models/profile/basic_details_cols_structions.dart new file mode 100644 index 0000000..2094a3c --- /dev/null +++ b/lib/models/profile/basic_details_cols_structions.dart @@ -0,0 +1,83 @@ +class GetBasicDetColsStructureList { + String? aPPLICATIONCOLUMNNAME; + String? dATATYPE; + String? dISPLAYFLAG; + int? mAXIMUMSIZE; + String? oBJECTNAME; + String? oBJECTTYPE; + List? objectValuesList; + String? rEQUIREDFLAG; + String? sEGMENTPROMPT; + int? sEGMENTSEQNUM; + String? fieldAnswer; + GetBasicDetColsStructureList({ + this.aPPLICATIONCOLUMNNAME, + this.dATATYPE, + this.dISPLAYFLAG, + this.mAXIMUMSIZE, + this.oBJECTNAME, + this.oBJECTTYPE, + this.objectValuesList, + this.rEQUIREDFLAG, + this.sEGMENTPROMPT, + this.sEGMENTSEQNUM, + this.fieldAnswer, + }); + + GetBasicDetColsStructureList.fromJson(Map json) { + aPPLICATIONCOLUMNNAME = json['APPLICATION_COLUMN_NAME']; + dATATYPE = json['DATATYPE']; + dISPLAYFLAG = json['DISPLAY_FLAG']; + mAXIMUMSIZE = json['MAXIMUM_SIZE']; + oBJECTNAME = json['OBJECT_NAME']; + oBJECTTYPE = json['OBJECT_TYPE']; + if (json['ObjectValuesList'] != null) { + objectValuesList = []; + json['ObjectValuesList'].forEach((v) { + objectValuesList!.add(new ObjectValuesList.fromJson(v)); + }); + } + rEQUIREDFLAG = json['REQUIRED_FLAG']; + sEGMENTPROMPT = json['SEGMENT_PROMPT']; + sEGMENTSEQNUM = json['SEGMENT_SEQ_NUM']; + } + + Map toJson() { + final Map data = new Map(); + data['APPLICATION_COLUMN_NAME'] = this.aPPLICATIONCOLUMNNAME; + data['DATATYPE'] = this.dATATYPE; + data['DISPLAY_FLAG'] = this.dISPLAYFLAG; + data['MAXIMUM_SIZE'] = this.mAXIMUMSIZE; + data['OBJECT_NAME'] = this.oBJECTNAME; + data['OBJECT_TYPE'] = this.oBJECTTYPE; + if (this.objectValuesList != null) { + data['ObjectValuesList'] = this.objectValuesList!.map((v) => v.toJson()).toList(); + } + data['REQUIRED_FLAG'] = this.rEQUIREDFLAG; + data['SEGMENT_PROMPT'] = this.sEGMENTPROMPT; + data['SEGMENT_SEQ_NUM'] = this.sEGMENTSEQNUM; + return data; + } +} + +class ObjectValuesList { + String? cODE; + String? dESCRIPTION; + String? mEANING; + + ObjectValuesList({this.cODE, this.dESCRIPTION, this.mEANING}); + + ObjectValuesList.fromJson(Map json) { + cODE = json['CODE']; + dESCRIPTION = json['DESCRIPTION']; + mEANING = json['MEANING']; + } + + Map toJson() { + final Map data = new Map(); + data['CODE'] = this.cODE; + data['DESCRIPTION'] = this.dESCRIPTION; + data['MEANING'] = this.mEANING; + return data; + } +} diff --git a/lib/models/profile/basic_details_dff_structure.dart b/lib/models/profile/basic_details_dff_structure.dart new file mode 100644 index 0000000..45bf406 --- /dev/null +++ b/lib/models/profile/basic_details_dff_structure.dart @@ -0,0 +1,187 @@ +import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; + +class GetBasicDetDffStructureList { + String? aLPHANUMERICALLOWEDFLAG; + String? aPPLICATIONCOLUMNNAME; + String? cHILDSEGMENTSVS; + Null? cHILDSEGMENTSVSSplited; + String? dEFAULTTYPE; + String? dEFAULTVALUE; + String? dESCFLEXCONTEXTCODE; + String? dESCFLEXCONTEXTNAME; + String? dESCFLEXNAME; + String? dISPLAYFLAG; + String? eNABLEDFLAG; + ESERVICESDV? eSERVICESDV; + List? eSERVICESVS; + String? fLEXVALUESETNAME; + String? fORMATTYPE; + String? fORMATTYPEDSP; + bool? isEmptyOption; + String? lONGLISTFLAG; + int? mAXIMUMSIZE; + String? mAXIMUMVALUE; + String? mINIMUMVALUE; + String? mOBILEENABLED; + String? nUMBERPRECISION; + String? nUMERICMODEENABLEDFLAG; + String? pARENTSEGMENTSDV; + List? pARENTSEGMENTSDVSplited; + String? pARENTSEGMENTSVS; + List? pARENTSEGMENTSVSSplitedVS; + String? rEADONLY; + String? rEQUIREDFLAG; + String? sEGMENTNAME; + String? sEGMENTPROMPT; + int? sEGMENTSEQNUM; + String? uPPERCASEONLYFLAG; + String? uSEDFLAG; + String? vALIDATIONTYPE; + String? vALIDATIONTYPEDSP; + String? fieldAnswer; + + GetBasicDetDffStructureList( + {this.aLPHANUMERICALLOWEDFLAG, + this.aPPLICATIONCOLUMNNAME, + this.cHILDSEGMENTSVS, + this.cHILDSEGMENTSVSSplited, + this.dEFAULTTYPE, + this.dEFAULTVALUE, + this.dESCFLEXCONTEXTCODE, + this.dESCFLEXCONTEXTNAME, + this.dESCFLEXNAME, + this.dISPLAYFLAG, + this.eNABLEDFLAG, + this.eSERVICESDV, + this.eSERVICESVS, + this.fLEXVALUESETNAME, + this.fORMATTYPE, + this.fORMATTYPEDSP, + this.isEmptyOption, + this.lONGLISTFLAG, + this.mAXIMUMSIZE, + this.mAXIMUMVALUE, + this.mINIMUMVALUE, + this.mOBILEENABLED, + this.nUMBERPRECISION, + this.nUMERICMODEENABLEDFLAG, + this.pARENTSEGMENTSDV, + this.pARENTSEGMENTSDVSplited, + this.pARENTSEGMENTSVS, + this.pARENTSEGMENTSVSSplitedVS, + this.rEADONLY, + this.rEQUIREDFLAG, + this.sEGMENTNAME, + this.sEGMENTPROMPT, + this.sEGMENTSEQNUM, + this.uPPERCASEONLYFLAG, + this.uSEDFLAG, + this.vALIDATIONTYPE, + this.vALIDATIONTYPEDSP, + this.fieldAnswer}); + + GetBasicDetDffStructureList.fromJson(Map json) { + aLPHANUMERICALLOWEDFLAG = json['ALPHANUMERIC_ALLOWED_FLAG']; + aPPLICATIONCOLUMNNAME = json['APPLICATION_COLUMN_NAME']; + cHILDSEGMENTSVS = json['CHILD_SEGMENTS_VS']; + cHILDSEGMENTSVSSplited = json['CHILD_SEGMENTS_VS_Splited']; + dEFAULTTYPE = json['DEFAULT_TYPE']; + dEFAULTVALUE = json['DEFAULT_VALUE']; + dESCFLEXCONTEXTCODE = json['DESC_FLEX_CONTEXT_CODE']; + dESCFLEXCONTEXTNAME = json['DESC_FLEX_CONTEXT_NAME']; + dESCFLEXNAME = json['DESC_FLEX_NAME']; + dISPLAYFLAG = json['DISPLAY_FLAG']; + eNABLEDFLAG = json['ENABLED_FLAG']; + eSERVICESDV = json['E_SERVICES_DV'] != null ? ESERVICESDV.fromJson(json['E_SERVICES_DV']) : null; + if (json['E_SERVICES_VS'] != null) { + eSERVICESVS = []; + json['E_SERVICES_VS'].forEach((v) { + eSERVICESVS!.add(ESERVICESVS.fromJson(v)); + }); + } + fLEXVALUESETNAME = json['FLEX_VALUE_SET_NAME']; + fORMATTYPE = json['FORMAT_TYPE']; + fORMATTYPEDSP = json['FORMAT_TYPE_DSP']; + isEmptyOption = json['IsEmptyOption']; + lONGLISTFLAG = json['LONGLIST_FLAG']; + mAXIMUMSIZE = json['MAXIMUM_SIZE']; + mAXIMUMVALUE = json['MAXIMUM_VALUE']; + mINIMUMVALUE = json['MINIMUM_VALUE']; + mOBILEENABLED = json['MOBILE_ENABLED']; + nUMBERPRECISION = json['NUMBER_PRECISION']; + nUMERICMODEENABLEDFLAG = json['NUMERIC_MODE_ENABLED_FLAG']; + pARENTSEGMENTSDV = json['PARENT_SEGMENTS_DV']; + if (json['PARENT_SEGMENTS_DV_Splited'] != null) { + pARENTSEGMENTSDVSplited = []; + json['PARENT_SEGMENTS_DV_Splited'].forEach((v) { + pARENTSEGMENTSDVSplited!.add((v)); + }); + } + pARENTSEGMENTSVS = json['PARENT_SEGMENTS_VS']; + if (json['PARENT_SEGMENTS_VS_SplitedVS'] != null) { + pARENTSEGMENTSVSSplitedVS = []; + json['PARENT_SEGMENTS_VS_SplitedVS'].forEach((v) { + pARENTSEGMENTSVSSplitedVS!.add(v); + }); + } + rEADONLY = json['READ_ONLY']; + rEQUIREDFLAG = json['REQUIRED_FLAG']; + sEGMENTNAME = json['SEGMENT_NAME']; + sEGMENTPROMPT = json['SEGMENT_PROMPT']; + sEGMENTSEQNUM = json['SEGMENT_SEQ_NUM']; + uPPERCASEONLYFLAG = json['UPPERCASE_ONLY_FLAG']; + uSEDFLAG = json['USED_FLAG']; + vALIDATIONTYPE = json['VALIDATION_TYPE']; + vALIDATIONTYPEDSP = json['VALIDATION_TYPE_DSP']; + } + + Map toJson() { + final Map data = Map(); + data['ALPHANUMERIC_ALLOWED_FLAG'] = this.aLPHANUMERICALLOWEDFLAG; + data['APPLICATION_COLUMN_NAME'] = this.aPPLICATIONCOLUMNNAME; + data['CHILD_SEGMENTS_VS'] = this.cHILDSEGMENTSVS; + data['CHILD_SEGMENTS_VS_Splited'] = this.cHILDSEGMENTSVSSplited; + data['DEFAULT_TYPE'] = this.dEFAULTTYPE; + data['DEFAULT_VALUE'] = this.dEFAULTVALUE; + data['DESC_FLEX_CONTEXT_CODE'] = this.dESCFLEXCONTEXTCODE; + data['DESC_FLEX_CONTEXT_NAME'] = this.dESCFLEXCONTEXTNAME; + data['DESC_FLEX_NAME'] = this.dESCFLEXNAME; + data['DISPLAY_FLAG'] = this.dISPLAYFLAG; + data['ENABLED_FLAG'] = this.eNABLEDFLAG; + if (this.eSERVICESDV != null) { + data['E_SERVICES_DV'] = this.eSERVICESDV!.toJson(); + } + if (this.eSERVICESVS != null) { + data['E_SERVICES_VS'] = this.eSERVICESVS!.map((v) => v.toJson()).toList(); + } + data['FLEX_VALUE_SET_NAME'] = this.fLEXVALUESETNAME; + data['FORMAT_TYPE'] = this.fORMATTYPE; + data['FORMAT_TYPE_DSP'] = this.fORMATTYPEDSP; + data['IsEmptyOption'] = this.isEmptyOption; + data['LONGLIST_FLAG'] = this.lONGLISTFLAG; + data['MAXIMUM_SIZE'] = this.mAXIMUMSIZE; + data['MAXIMUM_VALUE'] = this.mAXIMUMVALUE; + data['MINIMUM_VALUE'] = this.mINIMUMVALUE; + data['MOBILE_ENABLED'] = this.mOBILEENABLED; + data['NUMBER_PRECISION'] = this.nUMBERPRECISION; + data['NUMERIC_MODE_ENABLED_FLAG'] = this.nUMERICMODEENABLEDFLAG; + data['PARENT_SEGMENTS_DV'] = this.pARENTSEGMENTSDV; + if (this.pARENTSEGMENTSDVSplited != null) { + data['PARENT_SEGMENTS_DV_Splited'] = this.pARENTSEGMENTSDVSplited!.map((v) => v).toList(); + } + data['PARENT_SEGMENTS_VS'] = this.pARENTSEGMENTSVS; + if (this.pARENTSEGMENTSVSSplitedVS != null) { + data['PARENT_SEGMENTS_VS_SplitedVS'] = this.pARENTSEGMENTSVSSplitedVS!.map((v) => v).toList(); + } + data['READ_ONLY'] = this.rEADONLY; + data['REQUIRED_FLAG'] = this.rEQUIREDFLAG; + data['SEGMENT_NAME'] = this.sEGMENTNAME; + data['SEGMENT_PROMPT'] = this.sEGMENTPROMPT; + data['SEGMENT_SEQ_NUM'] = this.sEGMENTSEQNUM; + data['UPPERCASE_ONLY_FLAG'] = this.uPPERCASEONLYFLAG; + data['USED_FLAG'] = this.uSEDFLAG; + data['VALIDATION_TYPE'] = this.vALIDATIONTYPE; + data['VALIDATION_TYPE_DSP'] = this.vALIDATIONTYPEDSP; + return data; + } +} diff --git a/lib/models/profile_menu.model.dart b/lib/models/profile_menu.model.dart index c26ee7f..c1b77b7 100644 --- a/lib/models/profile_menu.model.dart +++ b/lib/models/profile_menu.model.dart @@ -5,5 +5,8 @@ class ProfileMenu { final String name; final String icon; final String route; - ProfileMenu({this.name = '', this.icon = '', this.route = ''}); + final String dynamicUrl; + final String functionName; + final String requestID; + ProfileMenu({this.name = '', this.icon = '', this.route = '', this.dynamicUrl = '', this.functionName = '', this.requestID = ''}); } diff --git a/lib/ui/attendance/monthly_attendance.dart b/lib/ui/attendance/monthly_attendance.dart index 7391211..fa531a3 100644 --- a/lib/ui/attendance/monthly_attendance.dart +++ b/lib/ui/attendance/monthly_attendance.dart @@ -718,7 +718,6 @@ class _MonthlyAttendanceState extends State { ); } - List _getDataSource() { final List meetings = []; return meetings; diff --git a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart index 6fe23ae..114c53c 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -137,7 +137,6 @@ class _DynamicInputScreenState extends State { for (int i = 0; i < model.eSERVICESVS!.length; i++) PopupMenuItem(child: Text(model.eSERVICESVS![i].vALUECOLUMNNAME!), value: i), ], onSelected: (int index) { - ESERVICESDV eservicesdv = ESERVICESDV( pIDCOLUMNNAME: model.eSERVICESVS![index].vALUECOLUMNNAME, pRETURNMSG: "null", diff --git a/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart b/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart index ccf4222..37ba465 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart @@ -15,7 +15,10 @@ import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; class DynamicListViewParams { String title; String dynamicId; - DynamicListViewParams(this.title, this.dynamicId); + String uRL; + String requestID; + String colsURL; + DynamicListViewParams(this.title, this.dynamicId, {this.uRL = 'GET_EIT_DFF_STRUCTURE', this.requestID = '', this.colsURL = ''}); } class DynamicListViewScreen extends StatefulWidget { @@ -96,7 +99,7 @@ class _DynamicListViewScreenState extends State { ), child: const Icon(Icons.add, color: Colors.white, size: 30), ).onPress(() { - Navigator.pushNamed(context, AppRoutes.addDynamicInput,arguments: dynamicParams); + Navigator.pushNamed(context, AppRoutes.addDynamicInput, arguments: dynamicParams); }), ); } diff --git a/lib/ui/profile/basic_details.dart b/lib/ui/profile/basic_details.dart index 5110fae..0faa885 100644 --- a/lib/ui/profile/basic_details.dart +++ b/lib/ui/profile/basic_details.dart @@ -3,11 +3,13 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; +import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/ui/profile/profile.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; @@ -45,7 +47,7 @@ class _BasicDetailsState extends State { basicDetails(); print("getEmployeeBasicDetailsList.length"); print(getEmployeeBasicDetailsList.length); - setState(() {}); + // setState(() {}); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); @@ -166,7 +168,9 @@ class _BasicDetailsState extends State { ); Widget continueButton = TextButton( child: Text("Next"), - onPressed: () {}, + onPressed: () { + continueDynamicForms(); + }, ); StatefulBuilder alert = StatefulBuilder(builder: (context, setState) { return AlertDialog( @@ -229,4 +233,9 @@ class _BasicDetailsState extends State { }, ); } + + void continueDynamicForms() { + Navigator.pushNamed(context, AppRoutes.addDynamicInputProfile, + arguments: DynamicListViewParams(LocaleKeys.profile_basicDetails.tr(), 'HR_PERINFO_SS', uRL: 'GET_BASIC_DET_DFF_STRUCTURE', requestID: 'BASIC_DETAILS')); + } } diff --git a/lib/ui/profile/dynamic_screens/dynamic_input_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_input_screen.dart new file mode 100644 index 0000000..0ee9fb5 --- /dev/null +++ b/lib/ui/profile/dynamic_screens/dynamic_input_screen.dart @@ -0,0 +1,299 @@ +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; +import 'package:mohem_flutter_app/api/profile_api_client.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/dyanmic_forms/get_set_values_request_model.dart'; +import 'package:mohem_flutter_app/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; +import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart'; +import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart'; +import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; +import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; + +class DynamicInputScreenProfile extends StatefulWidget { + DynamicInputScreenProfile({Key? key}) : super(key: key); + + @override + _DynamicInputScreenState createState() { + return _DynamicInputScreenState(); + } +} + +class _DynamicInputScreenState extends State { + GenericResponseModel? genericResponseModel; + List? getBasicDetDffStructureList; + List? getBasicDetColsStructureList; + DynamicListViewParams? dynamicParams; + + @override + void initState() { + super.initState(); + } + + void getTransactionsStructure() async { + try { + Utils.showLoading(context); + genericResponseModel = await ProfileApiClient().getDffStructure(dynamicParams!.dynamicId, dynamicParams!.uRL, dynamicParams!.requestID); + getBasicDetDffStructureList = genericResponseModel?.getBasicDetDffStructureList ?? []; + //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); + + genericResponseModel = await ProfileApiClient().getColStructure(dynamicParams!.dynamicId, 'GET_BASIC_DET_COLS_STRUCTURE', dynamicParams!.requestID); + getBasicDetColsStructureList = genericResponseModel?.getBasicDetColsStructureList ?? []; + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void calGetValueSetValues(GetBasicDetDffStructureList structureList) async { + try { + Utils.showLoading(context); + String segmentId = structureList.cHILDSEGMENTSVS!; + List filteredList = getBasicDetDffStructureList?.where((element) => element.cHILDSEGMENTSVS == segmentId).toList() ?? []; + List> values = filteredList + .map((e) => GetSetValuesRequestModel( + sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) + .toJson()) + .toList(); + ESERVICESVS genericResponseModel = await MyAttendanceApiClient().getValueSetValues(structureList.cHILDSEGMENTSVS!, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); + + int index = getBasicDetDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS); + getBasicDetDffStructureList![index].eSERVICESVS!.add(genericResponseModel); + // getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? []; + //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + if (dynamicParams == null) { + dynamicParams = ModalRoute.of(context)!.settings.arguments as DynamicListViewParams; + getTransactionsStructure(); + } + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: dynamicParams!.title, + ), + body: Column( + children: [ + (getBasicDetDffStructureList == null + ? const SizedBox() + : (getBasicDetDffStructureList!.isEmpty + ? LocaleKeys.noDataAvailable.tr().toText16().center + : ListView.separated( + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.all(21), + itemBuilder: (BuildContext cxt, int parentIndex) { + if (parentIndex < getBasicDetColsStructureList!.length) { + return parseDynamicFormatTypeCols(getBasicDetColsStructureList![parentIndex], parentIndex); + } else { + int count = parentIndex - getBasicDetColsStructureList!.length; + return parseDynamicFormatType(getBasicDetDffStructureList![count], count); + } + }, + separatorBuilder: (cxt, index) => 0.height, + itemCount: getBasicDetColsStructureList!.length + getBasicDetDffStructureList!.length))) + .expanded, + // 12.height, + DefaultButton( + LocaleKeys.next.tr(), + (getBasicDetDffStructureList ?? []).isEmpty + ? null + : () => { + //Navigator.of(context).pushNamed(LOGIN_TYPE) + }, + ).insideContainer, + ], + ), + ); + } + + Widget parseDynamicFormatType(GetBasicDetDffStructureList model, int index) { + if (model.dISPLAYFLAG != "N") { + } else { + return const SizedBox(); + } + + if (model.fORMATTYPE == "C") { + if (model.eSERVICESVS?.isNotEmpty ?? false) { + return PopupMenuButton( + child: DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.eSERVICESDV?.pIDCOLUMNNAME ?? "", + isEnable: false, + isPopup: true, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < model.eSERVICESVS!.length; i++) PopupMenuItem(child: Text(model.eSERVICESVS![i].vALUECOLUMNNAME!), value: i), + ], + onSelected: (int index) { + ESERVICESDV eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: model.eSERVICESVS![index].vALUECOLUMNNAME, + pRETURNMSG: "null", + pRETURNSTATUS: getBasicDetDffStructureList![index].dEFAULTVALUE, + pVALUECOLUMNNAME: model.eSERVICESVS![index].vALUECOLUMNNAME); + + print(model.eSERVICESVS![index].toJson()); + }); + } + + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.eSERVICESDV?.pIDCOLUMNNAME ?? "", + isReadOnly: model.rEADONLY == "Y", + onChange: (text) { + model.fieldAnswer = text; + }, + ).paddingOnly(bottom: 12); + } else if (model.fORMATTYPE == "X") { + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.eSERVICESDV?.pIDCOLUMNNAME ?? (getBasicDetDffStructureList![index].fieldAnswer ?? ""), + suffixIconData: Icons.calendar_today, + isEnable: false, + onTap: () async { + DateTime date = await _selectDate(context); + DateTime date1 = DateTime(date.year, date.month, date.day); + getBasicDetDffStructureList![index].fieldAnswer = date.toString(); + ESERVICESDV eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), + pRETURNMSG: "null", + pRETURNSTATUS: getBasicDetDffStructureList![index].dEFAULTVALUE, + pVALUECOLUMNNAME: DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + getBasicDetDffStructureList![index].eSERVICESDV = eservicesdv; + setState(() {}); + if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { + calGetValueSetValues(model); + } + }, + ).paddingOnly(bottom: 12); + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [], + ).objectContainerView(); + } + + Widget parseDynamicFormatTypeCols(GetBasicDetColsStructureList model, int index) { + if (model.dISPLAYFLAG != "N") { + } else { + return const SizedBox(); + } + + if (model.dATATYPE == "VARCHAR2") { + if (model.objectValuesList?.isNotEmpty ?? false) { + return PopupMenuButton( + child: DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + "", //model.aPPLICATIONCOLUMNNAME ?? "", + isEnable: false, + isPopup: true, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < model.objectValuesList!.length; i++) PopupMenuItem(child: Text(model.objectValuesList![i].mEANING!), value: i), + ], + onSelected: (int index) { + ESERVICESDV eservicesdv = + ESERVICESDV(pIDCOLUMNNAME: model.objectValuesList![index].dESCRIPTION, pRETURNMSG: "null", pRETURNSTATUS: model.oBJECTNAME, pVALUECOLUMNNAME: model.aPPLICATIONCOLUMNNAME); + }); + } + + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.fieldAnswer ?? "", + //model.aPPLICATIONCOLUMNNAME ?? "", + //"", + isReadOnly: false, + onChange: (text) { + model.fieldAnswer = text; + }, + ).paddingOnly(bottom: 12); + } else if (model.dATATYPE == "DATE") { + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.aPPLICATIONCOLUMNNAME ?? (getBasicDetColsStructureList![index].fieldAnswer ?? ""), + suffixIconData: Icons.calendar_today, + isEnable: false, + onTap: () async { + DateTime date = await _selectDate(context); + DateTime date1 = DateTime(date.year, date.month, date.day); + getBasicDetDffStructureList![index].fieldAnswer = date.toString(); + ESERVICESDV eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), + pRETURNMSG: "null", + pRETURNSTATUS: getBasicDetDffStructureList![index].dEFAULTVALUE, + pVALUECOLUMNNAME: DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + getBasicDetDffStructureList![index].eSERVICESDV = eservicesdv; + setState(() {}); + // if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { + // calGetValueSetValues(model); + // } + }, + ).paddingOnly(bottom: 12); + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [], + ).objectContainerView(); + } + + DateTime selectedDate = DateTime.now(); + + Future _selectDate(BuildContext context) async { + DateTime time = selectedDate; + if (!Platform.isIOS) { + await showCupertinoModalPopup( + context: context, + builder: (cxt) => Container( + height: 250, + color: Colors.white, + child: CupertinoDatePicker( + backgroundColor: Colors.white, + mode: CupertinoDatePickerMode.date, + onDateTimeChanged: (value) { + if (value != null && value != selectedDate) { + time = value; + } + }, + initialDateTime: selectedDate, + ), + ), + ); + } else { + final DateTime? picked = + await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101)); + if (picked != null && picked != selectedDate) { + time = picked; + } + } + return time; + } +} diff --git a/lib/ui/profile/dynamic_screens/dynamic_listview_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_listview_screen.dart new file mode 100644 index 0000000..5ba4109 --- /dev/null +++ b/lib/ui/profile/dynamic_screens/dynamic_listview_screen.dart @@ -0,0 +1,105 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; + +class DynamicListViewParams { + String title; + String dynamicId; + String uRL; + String requestID; + DynamicListViewParams(this.title, this.dynamicId, {this.uRL = 'GET_EIT_DFF_STRUCTURE', this.requestID = ''}); +} + +class DynamicListViewScreen extends StatefulWidget { + DynamicListViewScreen({Key? key}) : super(key: key); + + @override + _DynamicListViewScreenState createState() { + return _DynamicListViewScreenState(); + } +} + +class _DynamicListViewScreenState extends State { + List? getEITTransactionList; + DynamicListViewParams? dynamicParams; + @override + void initState() { + super.initState(); + } + + void getTransactions() async { + try { + Utils.showLoading(context); + getEITTransactionList = await MyAttendanceApiClient().getEitTransaction(dynamicParams!.dynamicId); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + if (dynamicParams == null) { + dynamicParams = ModalRoute.of(context)!.settings.arguments as DynamicListViewParams; + getTransactions(); + } + + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: dynamicParams!.title, + ), + body: getEITTransactionList == null + ? const SizedBox() + : (getEITTransactionList!.isEmpty + ? LocaleKeys.noDataAvailable.tr().toText16().center + : ListView.separated( + physics: const BouncingScrollPhysics(), + padding: EdgeInsets.all(21), + itemBuilder: (cxt, int parentIndex) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + for (int t = 0; t < (getEITTransactionList![parentIndex].collectionTransaction ?? []).length; t++) + if (getEITTransactionList![parentIndex].collectionTransaction![t].dISPLAYFLAG == "Y") + ItemDetailView( + getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTPROMPT!, getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTVALUEDSP ?? ""), + ], + ).objectContainerView(), + separatorBuilder: (cxt, index) => 12.height, + itemCount: getEITTransactionList!.length)), + floatingActionButton: Container( + height: 50, + width: 50, + decoration: const BoxDecoration( + shape: BoxShape.circle, + gradient: LinearGradient(transform: GradientRotation(.83), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [ + MyColors.gradiantEndColor, + MyColors.gradiantStartColor, + ]), + ), + child: const Icon(Icons.add, color: Colors.white, size: 30), + ).onPress(() { + Navigator.pushNamed(context, AppRoutes.addDynamicInput, arguments: dynamicParams); + }), + ); + } +} diff --git a/lib/ui/screens/profile/profile_screen.dart b/lib/ui/screens/profile/profile_screen.dart index c1be51e..76f8a20 100644 --- a/lib/ui/screens/profile/profile_screen.dart +++ b/lib/ui/screens/profile/profile_screen.dart @@ -22,7 +22,7 @@ class ProfileScreen extends StatefulWidget { class _ProfileScreenState extends State { late MemberInformationListModel memberInformationList; final ImagePicker _picker = ImagePicker(); - //List getEmployeeBasicDetailsList = []; + List getEmployeeBasicDetailsList = []; @override void initState() { @@ -132,18 +132,4 @@ class _ProfileScreenState extends State { } } } - // void getEmployeeBasicDetails() async { - // try { - // Utils.showLoading(context); - // getEmployeeBasicDetailsList = await ProfileApiClient().getEmployeeBasicDetails(); - // Utils.hideLoading(context); - // //basicDetails(); - // print("getEmployeeBasicDetailsList.length"); - // print(getEmployeeBasicDetailsList.length); - // setState(() {}); - // } catch (ex) { - // Utils.hideLoading(context); - // Utils.handleException(ex, context, null); - // } - // } } diff --git a/lib/ui/screens/profile/widgets/profile_info.dart b/lib/ui/screens/profile/widgets/profile_info.dart index 8919924..6f30b7a 100644 --- a/lib/ui/screens/profile/widgets/profile_info.dart +++ b/lib/ui/screens/profile/widgets/profile_info.dart @@ -6,6 +6,8 @@ import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:mohem_flutter_app/models/profile_menu.model.dart'; +import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart'; +import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; class ProfileInFo extends StatelessWidget { ProfileInFo(this.memberInfo); @@ -13,10 +15,14 @@ class ProfileInFo extends StatelessWidget { String data = '.'; double sliderValue = 75; List menu = [ - ProfileMenu(name: LocaleKeys.profile_personalInformation.tr(), icon: 'personal-info.svg', route: AppRoutes.personalInfo), - ProfileMenu(name: LocaleKeys.profile_basicDetails.tr(), icon: 'basic-details.svg', route: AppRoutes.basicDetails), - ProfileMenu(name: LocaleKeys.profile_contactDetails.tr(), icon: 'contact-details.svg', route: AppRoutes.contactDetails), - ProfileMenu(name: LocaleKeys.profile_familyDetails.tr(), icon: 'family-members.svg', route: AppRoutes.familyMembers), + ProfileMenu(name: LocaleKeys.profile_personalInformation.tr(), icon: 'personal-info.svg', route: AppRoutes.personalInfo, dynamicUrl: ''), + ProfileMenu( + name: LocaleKeys.profile_basicDetails.tr(), + icon: 'basic-details.svg', + route: AppRoutes.basicDetails, + ), + ProfileMenu(name: LocaleKeys.profile_contactDetails.tr(), icon: 'contact-details.svg', route: AppRoutes.contactDetails, dynamicUrl: ''), + ProfileMenu(name: LocaleKeys.profile_familyDetails.tr(), icon: 'family-members.svg', route: AppRoutes.familyMembers, dynamicUrl: ''), ]; @override Widget build(BuildContext context) { @@ -101,7 +107,11 @@ class ProfileInFo extends StatelessWidget { Widget rowItem(obj, context) { return InkWell( onTap: () { + //if (obj.dynamicUrl == '') { Navigator.pushNamed(context, obj.route); + // } else { + // Navigator.pushNamed(context, AppRoutes.addDynamicInputProfile, arguments: DynamicListViewParams(obj.name, obj.functionName, uRL: obj.dynamicUrl, requestID: obj.requestID)); + //} }, child: ListTile( leading: SvgPicture.asset('assets/images/' + obj.icon), From c4096bd44dc35a9d423b604e4f8a22c6a0404f2d Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 8 Jun 2022 12:33:42 +0300 Subject: [PATCH 5/7] improvements --- lib/config/routes.dart | 2 +- .../basic_details_cols_structions.dart | 6 +- .../profile/basic_details_dff_structure.dart | 5 +- lib/ui/profile/basic_details.dart | 9 +- ...dart => dynamic_input_profile_screen.dart} | 107 +++++++++++------- 5 files changed, 78 insertions(+), 51 deletions(-) rename lib/ui/profile/dynamic_screens/{dynamic_input_screen.dart => dynamic_input_profile_screen.dart} (72%) diff --git a/lib/config/routes.dart b/lib/config/routes.dart index a9007cb..e377b8a 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -8,7 +8,7 @@ import 'package:mohem_flutter_app/ui/login/verify_last_login_screen.dart'; import 'package:mohem_flutter_app/ui/login/verify_login_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/my_attendance_screen.dart'; -import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_screen.dart'; +import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart'; // import 'package:mohem_flutter_app/ui/my_attendance/work_from_home_screen.dart'; import 'package:mohem_flutter_app/ui/screens/eit/add_eit.dart'; import 'package:mohem_flutter_app/ui/screens/profile/profile_screen.dart'; diff --git a/lib/models/profile/basic_details_cols_structions.dart b/lib/models/profile/basic_details_cols_structions.dart index 2094a3c..dceacd6 100644 --- a/lib/models/profile/basic_details_cols_structions.dart +++ b/lib/models/profile/basic_details_cols_structions.dart @@ -1,3 +1,5 @@ +import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; + class GetBasicDetColsStructureList { String? aPPLICATIONCOLUMNNAME; String? dATATYPE; @@ -9,7 +11,7 @@ class GetBasicDetColsStructureList { String? rEQUIREDFLAG; String? sEGMENTPROMPT; int? sEGMENTSEQNUM; - String? fieldAnswer; + GetEmployeeBasicDetailsList? userBasicDetail; GetBasicDetColsStructureList({ this.aPPLICATIONCOLUMNNAME, this.dATATYPE, @@ -21,7 +23,7 @@ class GetBasicDetColsStructureList { this.rEQUIREDFLAG, this.sEGMENTPROMPT, this.sEGMENTSEQNUM, - this.fieldAnswer, + this.userBasicDetail, }); GetBasicDetColsStructureList.fromJson(Map json) { diff --git a/lib/models/profile/basic_details_dff_structure.dart b/lib/models/profile/basic_details_dff_structure.dart index 45bf406..db3312e 100644 --- a/lib/models/profile/basic_details_dff_structure.dart +++ b/lib/models/profile/basic_details_dff_structure.dart @@ -1,4 +1,5 @@ import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; +import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; class GetBasicDetDffStructureList { String? aLPHANUMERICALLOWEDFLAG; @@ -38,7 +39,7 @@ class GetBasicDetDffStructureList { String? uSEDFLAG; String? vALIDATIONTYPE; String? vALIDATIONTYPEDSP; - String? fieldAnswer; + GetEmployeeBasicDetailsList? userBasicDetail; GetBasicDetDffStructureList( {this.aLPHANUMERICALLOWEDFLAG, @@ -78,7 +79,7 @@ class GetBasicDetDffStructureList { this.uSEDFLAG, this.vALIDATIONTYPE, this.vALIDATIONTYPEDSP, - this.fieldAnswer}); + this.userBasicDetail}); GetBasicDetDffStructureList.fromJson(Map json) { aLPHANUMERICALLOWEDFLAG = json['ALPHANUMERIC_ALLOWED_FLAG']; diff --git a/lib/ui/profile/basic_details.dart b/lib/ui/profile/basic_details.dart index 0faa885..4733777 100644 --- a/lib/ui/profile/basic_details.dart +++ b/lib/ui/profile/basic_details.dart @@ -4,16 +4,12 @@ import 'package:mohem_flutter_app/api/profile_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/config/routes.dart'; -import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; -import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; -import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; -import 'package:mohem_flutter_app/ui/profile/profile.dart'; +import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; -import 'package:mohem_flutter_app/widgets/radio/show_radio.dart'; class BasicDetails extends StatefulWidget { const BasicDetails({Key? key}) : super(key: key); @@ -236,6 +232,7 @@ class _BasicDetailsState extends State { void continueDynamicForms() { Navigator.pushNamed(context, AppRoutes.addDynamicInputProfile, - arguments: DynamicListViewParams(LocaleKeys.profile_basicDetails.tr(), 'HR_PERINFO_SS', uRL: 'GET_BASIC_DET_DFF_STRUCTURE', requestID: 'BASIC_DETAILS')); + arguments: DynamicProfileParams(LocaleKeys.profile_basicDetails.tr(), 'HR_PERINFO_SS', + uRL: 'GET_BASIC_DET_DFF_STRUCTURE', requestID: 'BASIC_DETAILS', getEmployeeBasicDetailsList: getEmployeeBasicDetailsList)); } } diff --git a/lib/ui/profile/dynamic_screens/dynamic_input_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart similarity index 72% rename from lib/ui/profile/dynamic_screens/dynamic_input_screen.dart rename to lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart index 0ee9fb5..6ce01bc 100644 --- a/lib/ui/profile/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart @@ -13,6 +13,7 @@ import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/dyanmic_forms/get_set_values_request_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; +import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; @@ -20,6 +21,18 @@ import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; +class DynamicProfileParams { + String title; + String dynamicId; + String uRL; + String requestID; + String colsURL; + List? getEmployeeBasicDetailsList; + + DynamicProfileParams(this.title, this.dynamicId, + {this.uRL = 'GET_EIT_DFF_STRUCTURE', this.requestID = '', this.colsURL = '', this.getEmployeeBasicDetailsList = const []}); +} + class DynamicInputScreenProfile extends StatefulWidget { DynamicInputScreenProfile({Key? key}) : super(key: key); @@ -33,7 +46,7 @@ class _DynamicInputScreenState extends State { GenericResponseModel? genericResponseModel; List? getBasicDetDffStructureList; List? getBasicDetColsStructureList; - DynamicListViewParams? dynamicParams; + DynamicProfileParams? dynamicParams; @override void initState() { @@ -45,10 +58,16 @@ class _DynamicInputScreenState extends State { Utils.showLoading(context); genericResponseModel = await ProfileApiClient().getDffStructure(dynamicParams!.dynamicId, dynamicParams!.uRL, dynamicParams!.requestID); getBasicDetDffStructureList = genericResponseModel?.getBasicDetDffStructureList ?? []; - //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); + + getBasicDetDffStructureList?.forEach((element) { + element.userBasicDetail = dynamicParams!.getEmployeeBasicDetailsList!.singleWhere((userDetail) => userDetail.aPPLICATIONCOLUMNNAME == element.aPPLICATIONCOLUMNNAME); + }); genericResponseModel = await ProfileApiClient().getColStructure(dynamicParams!.dynamicId, 'GET_BASIC_DET_COLS_STRUCTURE', dynamicParams!.requestID); getBasicDetColsStructureList = genericResponseModel?.getBasicDetColsStructureList ?? []; + getBasicDetColsStructureList?.forEach((element) { + element.userBasicDetail = dynamicParams!.getEmployeeBasicDetailsList!.singleWhere((userDetail) => userDetail.aPPLICATIONCOLUMNNAME == element.aPPLICATIONCOLUMNNAME); + }); Utils.hideLoading(context); setState(() {}); } catch (ex) { @@ -89,7 +108,7 @@ class _DynamicInputScreenState extends State { @override Widget build(BuildContext context) { if (dynamicParams == null) { - dynamicParams = ModalRoute.of(context)!.settings.arguments as DynamicListViewParams; + dynamicParams = ModalRoute.of(context)!.settings.arguments as DynamicProfileParams; getTransactionsStructure(); } return Scaffold( @@ -100,23 +119,33 @@ class _DynamicInputScreenState extends State { ), body: Column( children: [ - (getBasicDetDffStructureList == null + (getBasicDetDffStructureList == null && getBasicDetColsStructureList == null ? const SizedBox() - : (getBasicDetDffStructureList!.isEmpty + : (getBasicDetDffStructureList!.isEmpty && getBasicDetColsStructureList!.isEmpty ? LocaleKeys.noDataAvailable.tr().toText16().center - : ListView.separated( + : ListView( physics: const BouncingScrollPhysics(), padding: const EdgeInsets.all(21), - itemBuilder: (BuildContext cxt, int parentIndex) { - if (parentIndex < getBasicDetColsStructureList!.length) { - return parseDynamicFormatTypeCols(getBasicDetColsStructureList![parentIndex], parentIndex); - } else { - int count = parentIndex - getBasicDetColsStructureList!.length; - return parseDynamicFormatType(getBasicDetDffStructureList![count], count); - } - }, - separatorBuilder: (cxt, index) => 0.height, - itemCount: getBasicDetColsStructureList!.length + getBasicDetDffStructureList!.length))) + children: [ + ListView.separated( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemBuilder: (BuildContext cxt, int parentIndex) { + return parseDynamicFormatTypeCols(getBasicDetColsStructureList![parentIndex], parentIndex); + }, + separatorBuilder: (cxt, index) => 0.height, + itemCount: getBasicDetColsStructureList!.length), + 12.height, + ListView.separated( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemBuilder: (BuildContext cxt, int parentIndex) { + return parseDynamicFormatType(getBasicDetDffStructureList![parentIndex], parentIndex); + }, + separatorBuilder: (cxt, index) => 0.height, + itemCount: getBasicDetDffStructureList!.length), + ], + ))) .expanded, // 12.height, DefaultButton( @@ -143,21 +172,16 @@ class _DynamicInputScreenState extends State { return PopupMenuButton( child: DynamicTextFieldWidget( (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), - model.eSERVICESDV?.pIDCOLUMNNAME ?? "", + model.userBasicDetail?.sEGMENTVALUEDSP ?? "", isEnable: false, isPopup: true, ).paddingOnly(bottom: 12), itemBuilder: (_) => >[ for (int i = 0; i < model.eSERVICESVS!.length; i++) PopupMenuItem(child: Text(model.eSERVICESVS![i].vALUECOLUMNNAME!), value: i), ], - onSelected: (int index) { - ESERVICESDV eservicesdv = ESERVICESDV( - pIDCOLUMNNAME: model.eSERVICESVS![index].vALUECOLUMNNAME, - pRETURNMSG: "null", - pRETURNSTATUS: getBasicDetDffStructureList![index].dEFAULTVALUE, - pVALUECOLUMNNAME: model.eSERVICESVS![index].vALUECOLUMNNAME); - - print(model.eSERVICESVS![index].toJson()); + onSelected: (int popupIndex) { + getBasicDetDffStructureList![index].userBasicDetail!.sEGMENTVALUEDSP = model.eSERVICESVS![popupIndex].vALUECOLUMNNAME!; + setState(() {}); }); } @@ -166,19 +190,20 @@ class _DynamicInputScreenState extends State { model.eSERVICESDV?.pIDCOLUMNNAME ?? "", isReadOnly: model.rEADONLY == "Y", onChange: (text) { - model.fieldAnswer = text; + getBasicDetDffStructureList![index].userBasicDetail!.sEGMENTVALUEDSP = text; + }, ).paddingOnly(bottom: 12); } else if (model.fORMATTYPE == "X") { return DynamicTextFieldWidget( (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), - model.eSERVICESDV?.pIDCOLUMNNAME ?? (getBasicDetDffStructureList![index].fieldAnswer ?? ""), + model.eSERVICESDV?.pIDCOLUMNNAME ?? (getBasicDetDffStructureList![index].userBasicDetail?.sEGMENTVALUEDSP ?? ""), suffixIconData: Icons.calendar_today, isEnable: false, onTap: () async { DateTime date = await _selectDate(context); DateTime date1 = DateTime(date.year, date.month, date.day); - getBasicDetDffStructureList![index].fieldAnswer = date.toString(); + getBasicDetDffStructureList![index].userBasicDetail!.sEGMENTVALUEDSP = date.toString(); ESERVICESDV eservicesdv = ESERVICESDV( pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), pRETURNMSG: "null", @@ -211,45 +236,47 @@ class _DynamicInputScreenState extends State { return PopupMenuButton( child: DynamicTextFieldWidget( (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), - "", //model.aPPLICATIONCOLUMNNAME ?? "", + model.userBasicDetail?.sEGMENTVALUEDSP ?? "", isEnable: false, isPopup: true, ).paddingOnly(bottom: 12), itemBuilder: (_) => >[ for (int i = 0; i < model.objectValuesList!.length; i++) PopupMenuItem(child: Text(model.objectValuesList![i].mEANING!), value: i), ], - onSelected: (int index) { + onSelected: (int popupIndex) { ESERVICESDV eservicesdv = ESERVICESDV(pIDCOLUMNNAME: model.objectValuesList![index].dESCRIPTION, pRETURNMSG: "null", pRETURNSTATUS: model.oBJECTNAME, pVALUECOLUMNNAME: model.aPPLICATIONCOLUMNNAME); + getBasicDetDffStructureList![index].userBasicDetail!.sEGMENTVALUEDSP = model.objectValuesList![popupIndex].dESCRIPTION!; + setState(() {}); }); } return DynamicTextFieldWidget( (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), - model.fieldAnswer ?? "", + model.userBasicDetail?.sEGMENTVALUEDSP ?? "", //model.aPPLICATIONCOLUMNNAME ?? "", //"", isReadOnly: false, onChange: (text) { - model.fieldAnswer = text; + getBasicDetColsStructureList![index].userBasicDetail!.sEGMENTVALUEDSP = text; }, ).paddingOnly(bottom: 12); } else if (model.dATATYPE == "DATE") { return DynamicTextFieldWidget( (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), - model.aPPLICATIONCOLUMNNAME ?? (getBasicDetColsStructureList![index].fieldAnswer ?? ""), + model.aPPLICATIONCOLUMNNAME ?? (getBasicDetColsStructureList![index].userBasicDetail?.sEGMENTVALUEDSP ?? ""), suffixIconData: Icons.calendar_today, isEnable: false, onTap: () async { DateTime date = await _selectDate(context); DateTime date1 = DateTime(date.year, date.month, date.day); - getBasicDetDffStructureList![index].fieldAnswer = date.toString(); - ESERVICESDV eservicesdv = ESERVICESDV( - pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), - pRETURNMSG: "null", - pRETURNSTATUS: getBasicDetDffStructureList![index].dEFAULTVALUE, - pVALUECOLUMNNAME: DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); - getBasicDetDffStructureList![index].eSERVICESDV = eservicesdv; + getBasicDetColsStructureList![index].userBasicDetail?.sEGMENTVALUEDSP = date.toString(); + // ESERVICESDV eservicesdv = ESERVICESDV( + // pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), + // pRETURNMSG: "null", + // pRETURNSTATUS: getBasicDetDffStructureList![index].dEFAULTVALUE, + // pVALUECOLUMNNAME: DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + // getBasicDetDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); // if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { // calGetValueSetValues(model); From 979879a28622c927077eb9e60d28feeb715294c8 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Thu, 9 Jun 2022 10:48:13 +0300 Subject: [PATCH 6/7] phone number is progress --- lib/api/profile_api_client.dart | 14 ++ lib/models/generic_response_model.dart | 12 +- .../profile/phone_number_types_modek.dart | 21 +++ lib/ui/profile/basic_details.dart | 2 +- lib/ui/profile/contact_details.dart | 176 ++++++++++++------ lib/ui/profile/phone_numbers.dart | 115 ++++++++++++ 6 files changed, 277 insertions(+), 63 deletions(-) create mode 100644 lib/models/profile/phone_number_types_modek.dart create mode 100644 lib/ui/profile/phone_numbers.dart diff --git a/lib/api/profile_api_client.dart b/lib/api/profile_api_client.dart index 7f783f2..3e254b4 100644 --- a/lib/api/profile_api_client.dart +++ b/lib/api/profile_api_client.dart @@ -8,6 +8,7 @@ import 'package:mohem_flutter_app/models/get_employee_address_model.dart'; import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; import 'package:mohem_flutter_app/models/get_employee_phones_model.dart'; +import 'package:mohem_flutter_app/models/profile/phone_number_types_modek.dart'; import 'api_client.dart'; class ProfileApiClient { @@ -118,4 +119,17 @@ class ProfileApiClient { return responseData.getValueSetValuesList!.first; }, url, postParams); } + + Future> getPhoneNumberTypes() async { + String url = "${ApiConsts.erpRest}GET_OBJECT_VALUES"; + Map postParams = { + "P_MENU_TYPE": "E", + "P_SELECTED_RESP_ID": -999, + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getObjectValuesList ?? []; + }, url, postParams); + } } diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index 92eb6db..fa65b1f 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -25,6 +25,7 @@ import 'package:mohem_flutter_app/models/notification_action_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart'; +import 'package:mohem_flutter_app/models/profile/phone_number_types_modek.dart'; import 'package:mohem_flutter_app/models/subordinates_on_leaves_model.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; @@ -139,7 +140,7 @@ class GenericResponseModel { List? getMoNotificationBodyList; List? getNotificationButtonsList; List? getNotificationReassignModeList; - List? getObjectValuesList; + List? getObjectValuesList; GetOpenMissingSwipesList? getOpenMissingSwipesList; List? getOpenNotificationsList; List? getOpenNotificationsNumList; @@ -736,8 +737,13 @@ class GenericResponseModel { }); } - getNotificationReassignModeList = json['GetNotificationReassignModeList']; - getObjectValuesList = json['GetObjectValuesList']; + if (json['GetObjectValuesList'] != null) { + getObjectValuesList = []; + json['GetObjectValuesList'].forEach((v) { + getObjectValuesList!.add(new GetPhoneNumberTypesModel.fromJson(v)); + }); + } + getOpenMissingSwipesList = json["GetOpenMissingSwipesList"] == null ? null : GetOpenMissingSwipesList.fromJson(json["GetOpenMissingSwipesList"]); getOpenNotificationsList = json["GetOpenNotificationsList"] == null ? null : List.from(json["GetOpenNotificationsList"].map((x) => GetOpenNotificationsList.fromMap(x))); getOpenNotificationsNumList = json['GetOpenNotificationsNumList']; diff --git a/lib/models/profile/phone_number_types_modek.dart b/lib/models/profile/phone_number_types_modek.dart new file mode 100644 index 0000000..47b8a35 --- /dev/null +++ b/lib/models/profile/phone_number_types_modek.dart @@ -0,0 +1,21 @@ +class GetPhoneNumberTypesModel { + String? cODE; + String? dESCRIPTION; + String? mEANING; + + GetPhoneNumberTypesModel({this.cODE, this.dESCRIPTION, this.mEANING}); + + GetPhoneNumberTypesModel.fromJson(Map json) { + cODE = json['CODE']; + dESCRIPTION = json['DESCRIPTION']; + mEANING = json['MEANING']; + } + + Map toJson() { + final Map data = new Map(); + data['CODE'] = this.cODE; + data['DESCRIPTION'] = this.dESCRIPTION; + data['MEANING'] = this.mEANING; + return data; + } +} diff --git a/lib/ui/profile/basic_details.dart b/lib/ui/profile/basic_details.dart index 4733777..8a316fd 100644 --- a/lib/ui/profile/basic_details.dart +++ b/lib/ui/profile/basic_details.dart @@ -43,7 +43,7 @@ class _BasicDetailsState extends State { basicDetails(); print("getEmployeeBasicDetailsList.length"); print(getEmployeeBasicDetailsList.length); - // setState(() {}); + setState(() {}); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); diff --git a/lib/ui/profile/contact_details.dart b/lib/ui/profile/contact_details.dart index 32f0ce8..d36b19a 100644 --- a/lib/ui/profile/contact_details.dart +++ b/lib/ui/profile/contact_details.dart @@ -1,7 +1,3 @@ - - - - import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart'; @@ -14,6 +10,7 @@ import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_employee_address_model.dart'; import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_phones_model.dart'; +import 'package:mohem_flutter_app/ui/profile/phone_numbers.dart'; import 'package:mohem_flutter_app/ui/profile/profile.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; @@ -39,15 +36,17 @@ class _ContactDetailsState extends State { @override void initState() { super.initState(); + getEmployeePhones(); - getEmployeeAddress(); + setState(() {}); } void getEmployeePhones() async { try { Utils.showLoading(context); getEmployeePhonesList = await ProfileApiClient().getEmployeePhones(); + getEmployeeAddress(); Utils.hideLoading(context); setState(() {}); } catch (ex) { @@ -68,8 +67,6 @@ class _ContactDetailsState extends State { } } - - Widget build(BuildContext context) { return Scaffold( appBar: AppBarWidget( @@ -77,14 +74,17 @@ class _ContactDetailsState extends State { title: LocaleKeys.profile_contactDetails.tr(), ), backgroundColor: MyColors.backgroundColor, - bottomSheet:footer(), - body: Column( - children: [ - Container( + bottomSheet: footer(), + body: Column(children: [ + Container( width: double.infinity, - margin: EdgeInsets.only(top: 28, left: 26, right: 26,), - padding: EdgeInsets.only(left: 14, right: 14,top: 13, bottom: 20), - height: 150, + margin: EdgeInsets.only( + top: 20, + left: 26, + right: 26, + ), + padding: EdgeInsets.only(left: 14, right: 14, top: 5, bottom: 20), + height: 200, decoration: BoxDecoration( boxShadow: [ BoxShadow( @@ -97,22 +97,48 @@ class _ContactDetailsState extends State { color: Colors.white, borderRadius: BorderRadius.circular(10.0), ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, children: [ - "${getEmployeePhonesList[0].pHONETYPEMEANING}".toText13(color: MyColors.lightGrayColor), - "${getEmployeePhonesList[0].pHONENUMBER}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - "${getEmployeePhonesList[1].pHONETYPEMEANING}".toText13(color: MyColors.lightGrayColor), - "${getEmployeePhonesList[1].pHONENUMBER}".toText16(isBold: true, color: MyColors.blackColor), - ] + IconButton( + icon: Icon( + Icons.edit_location_alt_outlined, + size: 20, + ), + onPressed: () { + updatePhone(); + }, + ) + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: getEmployeePhonesList + .map((e) => Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + "${e.pHONETYPEMEANING}".toText13(color: MyColors.lightGrayColor), + "${e.pHONENUMBER}".toText16(isBold: true, color: MyColors.blackColor), + ])) + .toList()) + ]) + + // [ + // "${getEmployeePhonesList[0].pHONETYPEMEANING}".toText13(color: MyColors.lightGrayColor), + // "${getEmployeePhonesList[0].pHONENUMBER}".toText16(isBold: true, color: MyColors.blackColor), + // SizedBox( + // height: 20,), + // "${getEmployeePhonesList[1].pHONETYPEMEANING}".toText13(color: MyColors.lightGrayColor), + // "${getEmployeePhonesList[1].pHONENUMBER}".toText16(isBold: true, color: MyColors.blackColor), + // ] ), - ), - Container( + Container( width: double.infinity, - margin: EdgeInsets.only(top: 28, left: 26, right: 26,), - padding: EdgeInsets.only(left: 14, right: 14,top: 13, bottom: 20), + margin: EdgeInsets.only( + top: 20, + left: 26, + right: 26, + ), + padding: EdgeInsets.only(left: 14, right: 14, top: 5, bottom: 20), height: 400, decoration: BoxDecoration( boxShadow: [ @@ -126,41 +152,66 @@ class _ContactDetailsState extends State { color: Colors.white, borderRadius: BorderRadius.circular(10.0), ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + child: SingleChildScrollView( + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, children: [ - "${getEmployeeAddressList[0].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), - "${getEmployeeAddressList[0].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - "${getEmployeeAddressList[2].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), - "${getEmployeeAddressList[2].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - "${getEmployeeAddressList[3].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), - "${getEmployeeAddressList[3].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - "${getEmployeeAddressList[4].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), - "${getEmployeeAddressList[4].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - "${getEmployeeAddressList[5].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), - "${getEmployeeAddressList[5].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - "${getEmployeeAddressList[6].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), - "${getEmployeeAddressList[6].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), - ] - ), - ), - ], - ) - - ); + IconButton( + icon: Icon( + Icons.edit_location_alt_outlined, + size: 20, + ), + onPressed: () {}, + ) + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: getEmployeeAddressList + .map((e) => Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + "${e.sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), + "${e.sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), + SizedBox( + height: 20, + ), + ])) + .toList()) + ]))) + // "${getEmployeeAddressList[0].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), + // "${getEmployeeAddressList[0].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), + // SizedBox( + // height: 20, + // ), + // "${getEmployeeAddressList[2].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), + // "${getEmployeeAddressList[2].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), + // SizedBox( + // height: 20, + // ), + // "${getEmployeeAddressList[3].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), + // "${getEmployeeAddressList[3].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), + // SizedBox( + // height: 20, + // ), + // "${getEmployeeAddressList[4].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), + // "${getEmployeeAddressList[4].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), + // SizedBox( + // height: 20, + // ), + // "${getEmployeeAddressList[5].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), + // "${getEmployeeAddressList[5].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), + // SizedBox( + // height: 20, + // ), + // "${getEmployeeAddressList[6].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), + // "${getEmployeeAddressList[6].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), + //]), + //), + //], + ])); } - footer(){ + footer() { return Container( decoration: BoxDecoration( // borderRadius: BorderRadius.circular(10), @@ -175,4 +226,11 @@ class _ContactDetailsState extends State { }).insideContainer, ); } + + updatePhone() { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => PhoneNumbers(getEmployeePhonesList: this.getEmployeePhonesList)), + ); + } } diff --git a/lib/ui/profile/phone_numbers.dart b/lib/ui/profile/phone_numbers.dart new file mode 100644 index 0000000..aabf50e --- /dev/null +++ b/lib/ui/profile/phone_numbers.dart @@ -0,0 +1,115 @@ +import 'package:easy_localization/src/public_ext.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/profile_api_client.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/get_employee_address_model.dart'; +import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; +import 'package:mohem_flutter_app/models/get_employee_phones_model.dart'; +import 'package:mohem_flutter_app/models/profile/phone_number_types_modek.dart'; +import 'package:mohem_flutter_app/ui/profile/profile.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; +import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; + +class PhoneNumbers extends StatefulWidget { + List getEmployeePhonesList; + + PhoneNumbers({Key? key, required this.getEmployeePhonesList}) : super(key: key); + + @override + _PhoneNumbersState createState() => _PhoneNumbersState(); +} + +class _PhoneNumbersState extends State { + List getPhoneNumberTypesList = []; + @override + void initState() { + super.initState(); + getPhoneNumberTypes(); + } + + void getPhoneNumberTypes() async { + Utils.showLoading(context); + getPhoneNumberTypesList = await ProfileApiClient().getPhoneNumberTypes(); + setState(() {}); + Utils.hideLoading(context); + } + + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBarWidget( + context, + title: LocaleKeys.profile_contactDetails.tr(), + ), + backgroundColor: MyColors.backgroundColor, + bottomSheet: footer(), + body: Column(children: [ + Container( + width: double.infinity, + margin: EdgeInsets.only( + top: 20, + left: 26, + right: 26, + ), + padding: EdgeInsets.only(left: 14, right: 14, top: 5, bottom: 20), + height: 400, + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 5, + blurRadius: 26, + offset: Offset(0, 3), + ), + ], + color: Colors.white, + borderRadius: BorderRadius.circular(10.0), + ), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: widget.getEmployeePhonesList + .map((e) => Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + PopupMenuButton( + child: DynamicTextFieldWidget( + "Please Select *", + e.pHONETYPEMEANING ?? "", + isEnable: true, + isPopup: true, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < getPhoneNumberTypesList.length; i++) PopupMenuItem(child: Text(getPhoneNumberTypesList![i].mEANING!), value: i), + ], + onSelected: (int index) { + e.pHONETYPEMEANING = getPhoneNumberTypesList[index].mEANING; + setState(() {}); + }), + "${e.pHONENUMBER}".toText16(isBold: true, color: MyColors.blackColor), + ])) + .toList()))) + ])); + } + + footer() { + return Container( + decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(10), + color: MyColors.white, + boxShadow: [ + BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), + ], + ), + child: DefaultButton(LocaleKeys.update.tr(), () async { + // context.setLocale(const Locale("en", "US")); // to change Loacle + Profile(); + }).insideContainer, + ); + } + + updatePhone() {} +} From cee80111fcb537dfafbe67104ba83160d6cfc527 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 9 Jun 2022 14:06:04 +0300 Subject: [PATCH 7/7] for comment --- lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart index 6ce01bc..6e054c9 100644 --- a/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart +++ b/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart @@ -1,5 +1,6 @@ import 'dart:io'; + import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart';