From a22f679908104f386eac0c8c971abbfc01009c83 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Thu, 25 Aug 2022 08:06:41 +0300 Subject: [PATCH] my team module and workList settings --- lib/api/monthly_attendance_api_client.dart | 1 - lib/api/my_team/my_team_api_client.dart | 149 +++++ lib/api/worklist/worklist_api_client.dart | 11 +- lib/classes/colors.dart | 1 + lib/config/routes.dart | 32 + lib/models/generic_response_model.dart | 18 +- lib/models/get_user_item_type_list.dart | 7 +- .../get_attendance_tracking_list_model.dart | 58 ++ .../get_employee_subordinates_list.dart | 313 ++++++++++ lib/models/profile_menu.model.dart | 3 +- lib/models/update_item_type_success_list.dart | 2 +- .../worklist/update_user_type_list.dart | 28 + lib/ui/landing/widget/app_drawer.dart | 11 + lib/ui/my_team/create_request.dart | 95 +++ lib/ui/my_team/employee_details.dart | 314 ++++++++++ lib/ui/my_team/my_team.dart | 241 ++++++++ lib/ui/my_team/profile_details.dart | 91 +++ lib/ui/my_team/team_members.dart | 156 +++++ lib/ui/my_team/view_attendance.dart | 569 ++++++++++++++++++ lib/ui/profile/family_members.dart | 51 +- lib/ui/work_list/worklist_settings.dart | 197 ++++++ lib/widgets/app_bar_widget.dart | 2 + pubspec.yaml | 1 + 23 files changed, 2329 insertions(+), 22 deletions(-) create mode 100644 lib/api/my_team/my_team_api_client.dart create mode 100644 lib/models/my_team/get_attendance_tracking_list_model.dart create mode 100644 lib/models/my_team/get_employee_subordinates_list.dart create mode 100644 lib/models/worklist/update_user_type_list.dart create mode 100644 lib/ui/my_team/create_request.dart create mode 100644 lib/ui/my_team/employee_details.dart create mode 100644 lib/ui/my_team/my_team.dart create mode 100644 lib/ui/my_team/profile_details.dart create mode 100644 lib/ui/my_team/team_members.dart create mode 100644 lib/ui/my_team/view_attendance.dart create mode 100644 lib/ui/work_list/worklist_settings.dart diff --git a/lib/api/monthly_attendance_api_client.dart b/lib/api/monthly_attendance_api_client.dart index 543addb..00d444f 100644 --- a/lib/api/monthly_attendance_api_client.dart +++ b/lib/api/monthly_attendance_api_client.dart @@ -10,7 +10,6 @@ import 'package:mohem_flutter_app/models/get_schedule_shifts_details_list_model. import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart'; import 'package:mohem_flutter_app/api/api_client.dart'; -// todo '@fatima' change file name according to structure class MonthlyAttendanceApiClient { static final MonthlyAttendanceApiClient _instance = MonthlyAttendanceApiClient._internal(); diff --git a/lib/api/my_team/my_team_api_client.dart b/lib/api/my_team/my_team_api_client.dart new file mode 100644 index 0000000..4a843c1 --- /dev/null +++ b/lib/api/my_team/my_team_api_client.dart @@ -0,0 +1,149 @@ + + +import 'package:mohem_flutter_app/api/api_client.dart'; +import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/classes/consts.dart'; +import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; +import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; +import 'package:mohem_flutter_app/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/get_day_hours_type_details_list_model.dart'; +import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart'; +import 'package:mohem_flutter_app/models/my_team/get_employee_subordinates_list.dart'; +import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart'; + +class MyTeamApiClient { + static final MyTeamApiClient _instance = MyTeamApiClient._internal(); + + MyTeamApiClient._internal(); + + factory MyTeamApiClient() => _instance; + + + Future> getEmployeeSubordinates(String searchEmpEmail, String searchEmpName, String searchEmpNo) async { + String url = "${ApiConsts.erpRest}GET_EMPLOYEE_SUBORDINATES"; + Map postParams = { + "P_PAGE_LIMIT": 50, + "P_PAGE_NUM": 1, + "P_SEARCH_EMAIL_ADDRESS": searchEmpEmail, + "P_SEARCH_EMPLOYEE_DISPLAY_NAME": searchEmpName, + "P_SEARCH_EMPLOYEE_NUMBER": searchEmpNo, + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getEmployeeSubordinatesList ?? []; + }, url, postParams); + } + + Future getTimeCardSummary(String month, int year, String? empID) async { + String url = "${ApiConsts.erpRest}GET_TIME_CARD_SUMMARY"; + Map postParams = { + "P_MENU_TYPE": "M", + "P_SELECTED_RESP_ID": -999, + "SearchMonth": month, + "SearchYear": year, + }; + + postParams.addAll(AppState().postParamsJson); + postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return (responseData.getTimeCardSummaryList?.length ?? 0) > 0 ? responseData.getTimeCardSummaryList!.first : null; + }, url, postParams); + } + + Future> getDayHoursTypeDetails(String month, int year, String? empID) async { + String url = "${ApiConsts.erpRest}GET_DAY_HOURS_TYPE_DETAILS"; + Map postParams = { + "P_MENU_TYPE": "M", + "P_PAGE_LIMIT": 100, + "P_PAGE_NUM": 1, + "P_SELECTED_RESP_ID": -999, + "SearchMonth": month, + "SearchYear": year, + }; + postParams.addAll(AppState().postParamsJson); + postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + print(responseData.getDayHoursTypeDetailsList!.length); + return responseData.getDayHoursTypeDetailsList ?? []; + }, url, postParams); + } + + + Future getAttendanceTracking(String? empID) async { + String url = "${ApiConsts.erpRest}GET_Attendance_Tracking"; + Map postParams = {}; + postParams.addAll(AppState().postParamsJson); + postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + print(responseData.getAttendanceTrackingList); + return responseData.getAttendanceTrackingList; + }, url, postParams); + } + + Future> employeeSubordinates(String searchEmpEmail, String searchEmpName, String searchEmpNo, String? empID) async { + String url = "${ApiConsts.erpRest}GET_EMPLOYEE_SUBORDINATES"; + Map postParams = { + "P_PAGE_LIMIT": 50, + "P_PAGE_NUM": 1, + "P_SEARCH_EMAIL_ADDRESS": searchEmpEmail, + "P_SEARCH_EMPLOYEE_DISPLAY_NAME": searchEmpName, + "P_SEARCH_EMPLOYEE_NUMBER": searchEmpNo, + }; + postParams.addAll(AppState().postParamsJson); + postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getEmployeeSubordinatesList ?? []; + }, url, postParams); + } + + Future> employeeSubordinatesRequest(String? empID) async { + String url = "${ApiConsts.erpRest}GET_MENU_ENTRIES"; + Map postParams = { + "P_MENU_TYPE": "M", + "P_SELECTED_RESP_ID": -999, + }; + postParams.addAll(AppState().postParamsJson); + postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getMenuEntriesList ?? []; + }, url, postParams); + } + + Future?> getFavoriteReplacement() async { + String url = "${ApiConsts.erpRest}Mohemm_GetFavoriteReplacements"; + Map postParams = { + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel responseData = GenericResponseModel.fromJson(json); + return responseData.mohemmGetFavoriteReplacementsList; + }, url, postParams); + } + + Future changeFavoriteReplacements({required String email, required String employeName, required String image, required String userName, bool isFav = false}) async { + String url = "${ApiConsts.erpRest}Mohemm_ChangeFavoriteReplacements"; + Map postParamsObj = { + "EMAIL_ADDRESS": email, + "EMPLOYEE_DISPLAY_NAME": employeName, + "EMPLOYEE_IMAGE": image, + "IsFavorite": isFav, + "USER_NAME": userName, + }; + Map postParams = { + "Mohemm_ChangeReplacementsInputList": [postParamsObj], + //postParams["Mohemm_ChangeReplacementsInputList"] = list; + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel responseData = GenericResponseModel.fromJson(json); + return responseData; + }, url, postParams); + } +} + diff --git a/lib/api/worklist/worklist_api_client.dart b/lib/api/worklist/worklist_api_client.dart index 2566e59..f1f9408 100644 --- a/lib/api/worklist/worklist_api_client.dart +++ b/lib/api/worklist/worklist_api_client.dart @@ -28,6 +28,7 @@ import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list import 'package:mohem_flutter_app/models/worklist/hr/get_contact_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/get_phones_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/update_user_type_list.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; class WorkListApiClient { @@ -449,7 +450,7 @@ class WorkListApiClient { } - Future?> getUserItemTypes() async { + Future> getUserItemTypes() async { String url = "${ApiConsts.erpRest}GET_USER_ITEM_TYPES"; Map postParams = { @@ -457,14 +458,14 @@ class WorkListApiClient { postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { GenericResponseModel responseData = GenericResponseModel.fromJson(json); - return responseData.getUserItemTypesList; + return responseData.getUserItemTypesList ?? []; }, url, postParams); } - Future updateUserItemTypes() async { + Future updateUserItemTypes(List> itemList) async { String url = "${ApiConsts.erpRest}UPDATE_USER_ITEM_TYPES"; Map postParams = { - + "UpdateItemTypeList": itemList }; postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { @@ -472,4 +473,6 @@ class WorkListApiClient { return responseData.updateUserItemTypesList; }, url, postParams); } + + } diff --git a/lib/classes/colors.dart b/lib/classes/colors.dart index 4b34186..c5d469d 100644 --- a/lib/classes/colors.dart +++ b/lib/classes/colors.dart @@ -38,4 +38,5 @@ class MyColors { static const Color darkColor = Color(0xff000015); static const Color lightGrayColor = Color(0xff808080); static const Color DarkRedColor = Color(0xffD02127); + static const Color lightGreyColor = Color(0xffC7C7C7); } diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 9285671..a9c5ae2 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -14,6 +14,12 @@ import 'package:mohem_flutter_app/ui/misc/request_submit_screen.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'; import 'package:mohem_flutter_app/ui/my_attendance/my_attendance_screen.dart'; +import 'package:mohem_flutter_app/ui/my_team/create_request.dart'; +import 'package:mohem_flutter_app/ui/my_team/employee_details.dart'; +import 'package:mohem_flutter_app/ui/my_team/my_team.dart'; +import 'package:mohem_flutter_app/ui/my_team/profile_details.dart'; +import 'package:mohem_flutter_app/ui/my_team/team_members.dart'; +import 'package:mohem_flutter_app/ui/my_team/view_attendance.dart'; import 'package:mohem_flutter_app/ui/payslip/monthly_pay_slip_screen.dart'; import 'package:mohem_flutter_app/ui/profile/add_update_family_member.dart'; import 'package:mohem_flutter_app/ui/profile/basic_details.dart'; @@ -38,6 +44,9 @@ 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/work_list_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/worklist_detail_screen.dart'; +import 'package:mohem_flutter_app/ui/my_team/my_team.dart'; +import 'package:mohem_flutter_app/ui/my_team/create_request.dart'; +import 'package:mohem_flutter_app/ui/work_list/worklist_settings.dart'; class AppRoutes { static const String splash = "/splash"; @@ -60,6 +69,7 @@ class AppRoutes { static const String workListDetail = "/workListDetail"; static const String itgDetail = "/itgDetail"; static const String itemHistory = "/itemHistory"; + static const String worklistSettings = "/worklistSettings"; static const String myAttendance = "/myAttendance"; static const String dynamicScreen = "/dynamicScreen"; @@ -104,6 +114,15 @@ class AppRoutes { //Pay slip static const String monthlyPaySlip = "/monthlyPaySlip"; + //My Team + static const String myTeam = "/myTeam"; + static const String employeeDetails = "/employeeDetails"; + static const String profileDetails = "/profileDetails"; + static const String viewAttendance = "/viewAttendance"; + static const String teamMembers = "/teamMembers"; + static const String createRequest = "/createRequest"; + + static final Map routes = { login: (context) => LoginScreen(), verifyLogin: (context) => VerifyLoginScreen(), @@ -123,6 +142,7 @@ class AppRoutes { workListDetail: (context) => WorkListDetailScreen(), itgDetail: (context) => ItgDetailScreen(), itemHistory: (context) => ItemHistoryScreen(), + worklistSettings: (context) => WorklistSettings(), myAttendance: (context) => MyAttendanceScreen(), // workFromHome: (context) => WorkFromHomeScreen(), @@ -165,5 +185,17 @@ class AppRoutes { //pay slip monthlyPaySlip: (context) => MonthlyPaySlipScreen(), + + //My Team + myTeam: (context) => MyTeam(), + employeeDetails: (context) => EmployeeDetails(), + profileDetails: (context) => ProfileDetails(), + viewAttendance: (context) => ViewAttendance(), + teamMembers: (context) => TeamMembers(), + createRequest: (context) => CreateRequest(), + + + + }; } diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index 23536bf..563804f 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -48,6 +48,7 @@ import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_details.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_transactions.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_types.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_tickets_list.dart'; +import 'package:mohem_flutter_app/models/my_team/get_employee_subordinates_list.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/pending_transactions/get_pending_transactions_details.dart'; @@ -172,7 +173,7 @@ class GenericResponseModel { List? getEmployeeBasicDetailsList; List? getEmployeeContactsList; List? getEmployeePhonesList; - List? getEmployeeSubordinatesList; + List? getEmployeeSubordinatesList; List? getFliexfieldStructureList; List? getHrCollectionNotificationBodyList; List? getHrTransactionList; @@ -285,7 +286,7 @@ class GenericResponseModel { String? pForm; String? pINFORMATION; int? pMBLID; - String? pNUMOFSUBORDINATES; + int? pNUMOFSUBORDINATES; int? pOPENNTFNUMBER; String? pQUESTION; int? pSESSIONID; @@ -830,7 +831,13 @@ class GenericResponseModel { getEmployeePhonesList!.add(new GetEmployeePhonesList.fromJson(v)); }); } - getEmployeeSubordinatesList = json['GetEmployeeSubordinatesList']; + if (json['GetEmployeeSubordinatesList'] != null) { + getEmployeeSubordinatesList = []; + json['GetEmployeeSubordinatesList'].forEach((v) { + getEmployeeSubordinatesList! + .add(new GetEmployeeSubordinatesList.fromJson(v)); + }); + } getFliexfieldStructureList = json['GetFliexfieldStructureList']; getHrCollectionNotificationBodyList = json['GetHrCollectionNotificationBodyList']; getHrTransactionList = json['GetHrTransactionList']; @@ -1402,7 +1409,10 @@ class GenericResponseModel { if (this.getEmployeePhonesList != null) { data['GetEmployeePhonesList'] = this.getEmployeePhonesList!.map((v) => v.toJson()).toList(); } - data['GetEmployeeSubordinatesList'] = this.getEmployeeSubordinatesList; + if (this.getEmployeeSubordinatesList != null) { + data['GetEmployeeSubordinatesList'] = + this.getEmployeeSubordinatesList!.map((v) => v.toJson()).toList(); + } data['GetFliexfieldStructureList'] = this.getFliexfieldStructureList; data['GetHrCollectionNotificationBodyList'] = this.getHrCollectionNotificationBodyList; data['GetHrTransactionList'] = this.getHrTransactionList; diff --git a/lib/models/get_user_item_type_list.dart b/lib/models/get_user_item_type_list.dart index fc7f4c3..a197c2e 100644 --- a/lib/models/get_user_item_type_list.dart +++ b/lib/models/get_user_item_type_list.dart @@ -5,12 +5,17 @@ class GetUserItemTypesList { String? fYIENABLEDFLAG; String? iTEMTYPE; int? uSERITEMTYPEID; + bool? isFYI; + bool? isFYA; GetUserItemTypesList( {this.fYAENABLEDFALG, this.fYIENABLEDFLAG, this.iTEMTYPE, - this.uSERITEMTYPEID}); + this.uSERITEMTYPEID, + this.isFYI, + this.isFYA + }); GetUserItemTypesList.fromJson(Map json) { fYAENABLEDFALG = json['FYA_ENABLED_FALG']; diff --git a/lib/models/my_team/get_attendance_tracking_list_model.dart b/lib/models/my_team/get_attendance_tracking_list_model.dart new file mode 100644 index 0000000..7670702 --- /dev/null +++ b/lib/models/my_team/get_attendance_tracking_list_model.dart @@ -0,0 +1,58 @@ + + +class GetAttendanceTrackingList { + String? pBREAKHOURS; + String? pLATEINHOURS; + String? pREMAININGHOURS; + String? pRETURNMSG; + String? pRETURNSTATUS; + String? pSCHEDULEDHOURS; + String? pSHTNAME; + String? pSPENTHOURS; + String? pSWIPESEXEMPTEDFLAG; + Null? pSWIPEIN; + Null? pSWIPEOUT; + + GetAttendanceTrackingList( + {this.pBREAKHOURS, + this.pLATEINHOURS, + this.pREMAININGHOURS, + this.pRETURNMSG, + this.pRETURNSTATUS, + this.pSCHEDULEDHOURS, + this.pSHTNAME, + this.pSPENTHOURS, + this.pSWIPESEXEMPTEDFLAG, + this.pSWIPEIN, + this.pSWIPEOUT}); + + GetAttendanceTrackingList.fromJson(Map json) { + pBREAKHOURS = json['P_BREAK_HOURS']; + pLATEINHOURS = json['P_LATE_IN_HOURS']; + pREMAININGHOURS = json['P_REMAINING_HOURS']; + pRETURNMSG = json['P_RETURN_MSG']; + pRETURNSTATUS = json['P_RETURN_STATUS']; + pSCHEDULEDHOURS = json['P_SCHEDULED_HOURS']; + pSHTNAME = json['P_SHT_NAME']; + pSPENTHOURS = json['P_SPENT_HOURS']; + pSWIPESEXEMPTEDFLAG = json['P_SWIPES_EXEMPTED_FLAG']; + pSWIPEIN = json['P_SWIPE_IN']; + pSWIPEOUT = json['P_SWIPE_OUT']; + } + + Map toJson() { + final Map data = new Map(); + data['P_BREAK_HOURS'] = this.pBREAKHOURS; + data['P_LATE_IN_HOURS'] = this.pLATEINHOURS; + data['P_REMAINING_HOURS'] = this.pREMAININGHOURS; + data['P_RETURN_MSG'] = this.pRETURNMSG; + data['P_RETURN_STATUS'] = this.pRETURNSTATUS; + data['P_SCHEDULED_HOURS'] = this.pSCHEDULEDHOURS; + data['P_SHT_NAME'] = this.pSHTNAME; + data['P_SPENT_HOURS'] = this.pSPENTHOURS; + data['P_SWIPES_EXEMPTED_FLAG'] = this.pSWIPESEXEMPTEDFLAG; + data['P_SWIPE_IN'] = this.pSWIPEIN; + data['P_SWIPE_OUT'] = this.pSWIPEOUT; + return data; + } +} \ No newline at end of file diff --git a/lib/models/my_team/get_employee_subordinates_list.dart b/lib/models/my_team/get_employee_subordinates_list.dart new file mode 100644 index 0000000..b90034b --- /dev/null +++ b/lib/models/my_team/get_employee_subordinates_list.dart @@ -0,0 +1,313 @@ + +class GetEmployeeSubordinatesList { + String? aCTUALTERMINATIONDATE; + String? aSSIGNMENTENDDATE; + int? aSSIGNMENTID; + String? aSSIGNMENTNUMBER; + String? aSSIGNMENTSTARTDATE; + int? aSSIGNMENTSTATUSTYPEID; + String? aSSIGNMENTTYPE; + int? bUSINESSGROUPID; + String? bUSINESSGROUPNAME; + String? cURRENTEMPLOYEEFLAG; + String? eMPLOYEEDISPLAYNAME; + String? eMPLOYEEEMAILADDRESS; + String? eMPLOYEEIMAGE; + String? eMPLOYEEMOBILENUMBER; + String? eMPLOYEENAME; + String? eMPLOYEENUMBER; + String? eMPLOYEEWORKNUMBER; + String? eMPLOYMENTCATEGORY; + String? eMPLOYMENTCATEGORYMEANING; + String? fREQUENCY; + String? fREQUENCYMEANING; + int? fROMROWNUM; + dynamic? gRADEID; + dynamic? gRADENAME; + dynamic? genderCode; + dynamic? genderMeaning; + String? hIREDATE; + bool? isFavorite; + int? jOBID; + String? jOBNAME; + int? lOCATIONID; + String? lOCATIONNAME; + String? mANUALTIMECARDFLAG; + String? mANUALTIMECARDMEANING; + String? nATIONALITYCODE; + String? nATIONALITYMEANING; + String? nATIONALIDENTIFIER; + dynamic? nORMALHOURS; + int? nOOFROWS; + int? nUMOFSUBORDINATES; + int? oRGANIZATIONID; + String? oRGANIZATIONNAME; + String? pAYROLLCODE; + int? pAYROLLID; + String? pAYROLLNAME; + int? pERSONID; + String? pERSONTYPE; + int? pERSONTYPEID; + String? pERINFORMATIONCATEGORY; + int? pOSITIONID; + String? pOSITIONNAME; + String? pRIMARYFLAG; + int? rOWNUM; + int? sERVICEDAYS; + int? sERVICEMONTHS; + int? sERVICEYEARS; + String? sUPERVISORASSIGNMENTID; + String? sUPERVISORDISPLAYNAME; + String? sUPERVISOREMAILADDRESS; + int? sUPERVISORID; + String? sUPERVISORMOBILENUMBER; + String? sUPERVISORNAME; + String? sUPERVISORNUMBER; + String? sUPERVISORWORKNUMBER; + String? sWIPESEXEMPTEDFLAG; + String? sWIPESEXEMPTEDMEANING; + String? sYSTEMPERSONTYPE; + String? tKEMAILADDRESS; + String? tKEMPLOYEEDISPLAYNAME; + String? tKEMPLOYEENAME; + String? tKEMPLOYEENUMBER; + int? tKPERSONID; + int? tOROWNUM; + String? uNITNUMBER; + String? uSERSTATUS; + + GetEmployeeSubordinatesList( + {this.aCTUALTERMINATIONDATE, + this.aSSIGNMENTENDDATE, + this.aSSIGNMENTID, + this.aSSIGNMENTNUMBER, + this.aSSIGNMENTSTARTDATE, + this.aSSIGNMENTSTATUSTYPEID, + this.aSSIGNMENTTYPE, + this.bUSINESSGROUPID, + this.bUSINESSGROUPNAME, + this.cURRENTEMPLOYEEFLAG, + this.eMPLOYEEDISPLAYNAME, + this.eMPLOYEEEMAILADDRESS, + this.eMPLOYEEIMAGE, + this.eMPLOYEEMOBILENUMBER, + this.eMPLOYEENAME, + this.eMPLOYEENUMBER, + this.eMPLOYEEWORKNUMBER, + this.eMPLOYMENTCATEGORY, + this.eMPLOYMENTCATEGORYMEANING, + this.fREQUENCY, + this.fREQUENCYMEANING, + this.fROMROWNUM, + this.gRADEID, + this.gRADENAME, + this.genderCode, + this.genderMeaning, + this.hIREDATE, + this.isFavorite, + this.jOBID, + this.jOBNAME, + this.lOCATIONID, + this.lOCATIONNAME, + this.mANUALTIMECARDFLAG, + this.mANUALTIMECARDMEANING, + this.nATIONALITYCODE, + this.nATIONALITYMEANING, + this.nATIONALIDENTIFIER, + this.nORMALHOURS, + this.nOOFROWS, + this.nUMOFSUBORDINATES, + this.oRGANIZATIONID, + this.oRGANIZATIONNAME, + this.pAYROLLCODE, + this.pAYROLLID, + this.pAYROLLNAME, + this.pERSONID, + this.pERSONTYPE, + this.pERSONTYPEID, + this.pERINFORMATIONCATEGORY, + this.pOSITIONID, + this.pOSITIONNAME, + this.pRIMARYFLAG, + this.rOWNUM, + this.sERVICEDAYS, + this.sERVICEMONTHS, + this.sERVICEYEARS, + this.sUPERVISORASSIGNMENTID, + this.sUPERVISORDISPLAYNAME, + this.sUPERVISOREMAILADDRESS, + this.sUPERVISORID, + this.sUPERVISORMOBILENUMBER, + this.sUPERVISORNAME, + this.sUPERVISORNUMBER, + this.sUPERVISORWORKNUMBER, + this.sWIPESEXEMPTEDFLAG, + this.sWIPESEXEMPTEDMEANING, + this.sYSTEMPERSONTYPE, + this.tKEMAILADDRESS, + this.tKEMPLOYEEDISPLAYNAME, + this.tKEMPLOYEENAME, + this.tKEMPLOYEENUMBER, + this.tKPERSONID, + this.tOROWNUM, + this.uNITNUMBER, + this.uSERSTATUS}); + + GetEmployeeSubordinatesList.fromJson(Map json) { + aCTUALTERMINATIONDATE = json['ACTUAL_TERMINATION_DATE']; + aSSIGNMENTENDDATE = json['ASSIGNMENT_END_DATE']; + aSSIGNMENTID = json['ASSIGNMENT_ID']; + aSSIGNMENTNUMBER = json['ASSIGNMENT_NUMBER']; + aSSIGNMENTSTARTDATE = json['ASSIGNMENT_START_DATE']; + aSSIGNMENTSTATUSTYPEID = json['ASSIGNMENT_STATUS_TYPE_ID']; + aSSIGNMENTTYPE = json['ASSIGNMENT_TYPE']; + bUSINESSGROUPID = json['BUSINESS_GROUP_ID']; + bUSINESSGROUPNAME = json['BUSINESS_GROUP_NAME']; + cURRENTEMPLOYEEFLAG = json['CURRENT_EMPLOYEE_FLAG']; + eMPLOYEEDISPLAYNAME = json['EMPLOYEE_DISPLAY_NAME']; + eMPLOYEEEMAILADDRESS = json['EMPLOYEE_EMAIL_ADDRESS']; + eMPLOYEEIMAGE = json['EMPLOYEE_IMAGE']; + eMPLOYEEMOBILENUMBER = json['EMPLOYEE_MOBILE_NUMBER']; + eMPLOYEENAME = json['EMPLOYEE_NAME']; + eMPLOYEENUMBER = json['EMPLOYEE_NUMBER']; + eMPLOYEEWORKNUMBER = json['EMPLOYEE_WORK_NUMBER']; + eMPLOYMENTCATEGORY = json['EMPLOYMENT_CATEGORY']; + eMPLOYMENTCATEGORYMEANING = json['EMPLOYMENT_CATEGORY_MEANING']; + fREQUENCY = json['FREQUENCY']; + fREQUENCYMEANING = json['FREQUENCY_MEANING']; + fROMROWNUM = json['FROM_ROW_NUM']; + gRADEID = json['GRADE_ID']; + gRADENAME = json['GRADE_NAME']; + genderCode = json['GenderCode']; + genderMeaning = json['GenderMeaning']; + hIREDATE = json['HIRE_DATE']; + isFavorite = json['IsFavorite']; + jOBID = json['JOB_ID']; + jOBNAME = json['JOB_NAME']; + lOCATIONID = json['LOCATION_ID']; + lOCATIONNAME = json['LOCATION_NAME']; + mANUALTIMECARDFLAG = json['MANUAL_TIMECARD_FLAG']; + mANUALTIMECARDMEANING = json['MANUAL_TIMECARD_MEANING']; + nATIONALITYCODE = json['NATIONALITY_CODE']; + nATIONALITYMEANING = json['NATIONALITY_MEANING']; + nATIONALIDENTIFIER = json['NATIONAL_IDENTIFIER']; + nORMALHOURS = json['NORMAL_HOURS']; + nOOFROWS = json['NO_OF_ROWS']; + nUMOFSUBORDINATES = json['NUM_OF_SUBORDINATES']; + oRGANIZATIONID = json['ORGANIZATION_ID']; + oRGANIZATIONNAME = json['ORGANIZATION_NAME']; + pAYROLLCODE = json['PAYROLL_CODE']; + pAYROLLID = json['PAYROLL_ID']; + pAYROLLNAME = json['PAYROLL_NAME']; + pERSONID = json['PERSON_ID']; + pERSONTYPE = json['PERSON_TYPE']; + pERSONTYPEID = json['PERSON_TYPE_ID']; + pERINFORMATIONCATEGORY = json['PER_INFORMATION_CATEGORY']; + pOSITIONID = json['POSITION_ID']; + pOSITIONNAME = json['POSITION_NAME']; + pRIMARYFLAG = json['PRIMARY_FLAG']; + rOWNUM = json['ROW_NUM']; + sERVICEDAYS = json['SERVICE_DAYS']; + sERVICEMONTHS = json['SERVICE_MONTHS']; + sERVICEYEARS = json['SERVICE_YEARS']; + sUPERVISORASSIGNMENTID = json['SUPERVISOR_ASSIGNMENT_ID']; + sUPERVISORDISPLAYNAME = json['SUPERVISOR_DISPLAY_NAME']; + sUPERVISOREMAILADDRESS = json['SUPERVISOR_EMAIL_ADDRESS']; + sUPERVISORID = json['SUPERVISOR_ID']; + sUPERVISORMOBILENUMBER = json['SUPERVISOR_MOBILE_NUMBER']; + sUPERVISORNAME = json['SUPERVISOR_NAME']; + sUPERVISORNUMBER = json['SUPERVISOR_NUMBER']; + sUPERVISORWORKNUMBER = json['SUPERVISOR_WORK_NUMBER']; + sWIPESEXEMPTEDFLAG = json['SWIPES_EXEMPTED_FLAG']; + sWIPESEXEMPTEDMEANING = json['SWIPES_EXEMPTED_MEANING']; + sYSTEMPERSONTYPE = json['SYSTEM_PERSON_TYPE']; + tKEMAILADDRESS = json['TK_EMAIL_ADDRESS']; + tKEMPLOYEEDISPLAYNAME = json['TK_EMPLOYEE_DISPLAY_NAME']; + tKEMPLOYEENAME = json['TK_EMPLOYEE_NAME']; + tKEMPLOYEENUMBER = json['TK_EMPLOYEE_NUMBER']; + tKPERSONID = json['TK_PERSON_ID']; + tOROWNUM = json['TO_ROW_NUM']; + uNITNUMBER = json['UNIT_NUMBER']; + uSERSTATUS = json['USER_STATUS']; + } + + Map toJson() { + final Map data = new Map(); + data['ACTUAL_TERMINATION_DATE'] = this.aCTUALTERMINATIONDATE; + data['ASSIGNMENT_END_DATE'] = this.aSSIGNMENTENDDATE; + data['ASSIGNMENT_ID'] = this.aSSIGNMENTID; + data['ASSIGNMENT_NUMBER'] = this.aSSIGNMENTNUMBER; + data['ASSIGNMENT_START_DATE'] = this.aSSIGNMENTSTARTDATE; + data['ASSIGNMENT_STATUS_TYPE_ID'] = this.aSSIGNMENTSTATUSTYPEID; + data['ASSIGNMENT_TYPE'] = this.aSSIGNMENTTYPE; + data['BUSINESS_GROUP_ID'] = this.bUSINESSGROUPID; + data['BUSINESS_GROUP_NAME'] = this.bUSINESSGROUPNAME; + data['CURRENT_EMPLOYEE_FLAG'] = this.cURRENTEMPLOYEEFLAG; + data['EMPLOYEE_DISPLAY_NAME'] = this.eMPLOYEEDISPLAYNAME; + data['EMPLOYEE_EMAIL_ADDRESS'] = this.eMPLOYEEEMAILADDRESS; + data['EMPLOYEE_IMAGE'] = this.eMPLOYEEIMAGE; + data['EMPLOYEE_MOBILE_NUMBER'] = this.eMPLOYEEMOBILENUMBER; + data['EMPLOYEE_NAME'] = this.eMPLOYEENAME; + data['EMPLOYEE_NUMBER'] = this.eMPLOYEENUMBER; + data['EMPLOYEE_WORK_NUMBER'] = this.eMPLOYEEWORKNUMBER; + data['EMPLOYMENT_CATEGORY'] = this.eMPLOYMENTCATEGORY; + data['EMPLOYMENT_CATEGORY_MEANING'] = this.eMPLOYMENTCATEGORYMEANING; + data['FREQUENCY'] = this.fREQUENCY; + data['FREQUENCY_MEANING'] = this.fREQUENCYMEANING; + data['FROM_ROW_NUM'] = this.fROMROWNUM; + data['GRADE_ID'] = this.gRADEID; + data['GRADE_NAME'] = this.gRADENAME; + data['GenderCode'] = this.genderCode; + data['GenderMeaning'] = this.genderMeaning; + data['HIRE_DATE'] = this.hIREDATE; + data['IsFavorite'] = this.isFavorite; + data['JOB_ID'] = this.jOBID; + data['JOB_NAME'] = this.jOBNAME; + data['LOCATION_ID'] = this.lOCATIONID; + data['LOCATION_NAME'] = this.lOCATIONNAME; + data['MANUAL_TIMECARD_FLAG'] = this.mANUALTIMECARDFLAG; + data['MANUAL_TIMECARD_MEANING'] = this.mANUALTIMECARDMEANING; + data['NATIONALITY_CODE'] = this.nATIONALITYCODE; + data['NATIONALITY_MEANING'] = this.nATIONALITYMEANING; + data['NATIONAL_IDENTIFIER'] = this.nATIONALIDENTIFIER; + data['NORMAL_HOURS'] = this.nORMALHOURS; + data['NO_OF_ROWS'] = this.nOOFROWS; + data['NUM_OF_SUBORDINATES'] = this.nUMOFSUBORDINATES; + data['ORGANIZATION_ID'] = this.oRGANIZATIONID; + data['ORGANIZATION_NAME'] = this.oRGANIZATIONNAME; + data['PAYROLL_CODE'] = this.pAYROLLCODE; + data['PAYROLL_ID'] = this.pAYROLLID; + data['PAYROLL_NAME'] = this.pAYROLLNAME; + data['PERSON_ID'] = this.pERSONID; + data['PERSON_TYPE'] = this.pERSONTYPE; + data['PERSON_TYPE_ID'] = this.pERSONTYPEID; + data['PER_INFORMATION_CATEGORY'] = this.pERINFORMATIONCATEGORY; + data['POSITION_ID'] = this.pOSITIONID; + data['POSITION_NAME'] = this.pOSITIONNAME; + data['PRIMARY_FLAG'] = this.pRIMARYFLAG; + data['ROW_NUM'] = this.rOWNUM; + data['SERVICE_DAYS'] = this.sERVICEDAYS; + data['SERVICE_MONTHS'] = this.sERVICEMONTHS; + data['SERVICE_YEARS'] = this.sERVICEYEARS; + data['SUPERVISOR_ASSIGNMENT_ID'] = this.sUPERVISORASSIGNMENTID; + data['SUPERVISOR_DISPLAY_NAME'] = this.sUPERVISORDISPLAYNAME; + data['SUPERVISOR_EMAIL_ADDRESS'] = this.sUPERVISOREMAILADDRESS; + data['SUPERVISOR_ID'] = this.sUPERVISORID; + data['SUPERVISOR_MOBILE_NUMBER'] = this.sUPERVISORMOBILENUMBER; + data['SUPERVISOR_NAME'] = this.sUPERVISORNAME; + data['SUPERVISOR_NUMBER'] = this.sUPERVISORNUMBER; + data['SUPERVISOR_WORK_NUMBER'] = this.sUPERVISORWORKNUMBER; + data['SWIPES_EXEMPTED_FLAG'] = this.sWIPESEXEMPTEDFLAG; + data['SWIPES_EXEMPTED_MEANING'] = this.sWIPESEXEMPTEDMEANING; + data['SYSTEM_PERSON_TYPE'] = this.sYSTEMPERSONTYPE; + data['TK_EMAIL_ADDRESS'] = this.tKEMAILADDRESS; + data['TK_EMPLOYEE_DISPLAY_NAME'] = this.tKEMPLOYEEDISPLAYNAME; + data['TK_EMPLOYEE_NAME'] = this.tKEMPLOYEENAME; + data['TK_EMPLOYEE_NUMBER'] = this.tKEMPLOYEENUMBER; + data['TK_PERSON_ID'] = this.tKPERSONID; + data['TO_ROW_NUM'] = this.tOROWNUM; + data['UNIT_NUMBER'] = this.uNITNUMBER; + data['USER_STATUS'] = this.uSERSTATUS; + return data; + } +} \ No newline at end of file diff --git a/lib/models/profile_menu.model.dart b/lib/models/profile_menu.model.dart index 65a9069..c585056 100644 --- a/lib/models/profile_menu.model.dart +++ b/lib/models/profile_menu.model.dart @@ -10,5 +10,6 @@ class ProfileMenu { final String functionName; final String requestID; final GetMenuEntriesList menuEntries; - ProfileMenu({this.name = '', this.icon = '', this.route = '', this.dynamicUrl = '', this.functionName = '', this.requestID = '', required this.menuEntries}); + final dynamic arguments; + ProfileMenu({this.name = '', this.icon = '', this.route = '', this.arguments = '', this.dynamicUrl = '', this.functionName = '', this.requestID = '', required this.menuEntries}); } diff --git a/lib/models/update_item_type_success_list.dart b/lib/models/update_item_type_success_list.dart index 1090dca..f133e38 100644 --- a/lib/models/update_item_type_success_list.dart +++ b/lib/models/update_item_type_success_list.dart @@ -2,7 +2,7 @@ class UpdateItemTypeSuccessList { int? itemID; - Null? updateError; + String? updateError; bool? updateSuccess; UpdateItemTypeSuccessList( diff --git a/lib/models/worklist/update_user_type_list.dart b/lib/models/worklist/update_user_type_list.dart new file mode 100644 index 0000000..4ff377f --- /dev/null +++ b/lib/models/worklist/update_user_type_list.dart @@ -0,0 +1,28 @@ + + + +class UpdateUserTypesList { + int? itemID; + String? pFYAENABLEDFALG; + String? pFYIENABLEDFALG; + String? pITEMTYPE; + + + UpdateUserTypesList({this.itemID, this.pFYAENABLEDFALG, this.pFYIENABLEDFALG, this.pITEMTYPE}); + + UpdateUserTypesList.fromJson(Map json) { + itemID = json['ItemID']; + pFYAENABLEDFALG = json['P_FYAENABLED_FALG']; + pFYIENABLEDFALG = json['P_FYIENABLED_FALG']; + pITEMTYPE = json['P_ITEM_TYPE']; + } + + Map toJson() { + final Map data = new Map(); + data['ItemID'] = this.itemID; + data['P_FYAENABLED_FALG'] = this.pFYAENABLEDFALG; + data['P_FYIENABLED_FALG'] = this.pFYIENABLEDFALG; + data['P_ITEM_TYPE'] = this.pITEMTYPE; + return data; + } +} \ No newline at end of file diff --git a/lib/ui/landing/widget/app_drawer.dart b/lib/ui/landing/widget/app_drawer.dart index 9bc9985..e9a33b4 100644 --- a/lib/ui/landing/widget/app_drawer.dart +++ b/lib/ui/landing/widget/app_drawer.dart @@ -64,6 +64,17 @@ class _AppDrawerState extends State { drawerNavigator(context, AppRoutes.pendingTransactions); }, ), + const Divider(), + InkWell( + child: DrawerItem( + "My Team", + icon: Icons.person, + color: Colors.grey, + ), + onTap: () { + drawerNavigator(context, AppRoutes.myTeam); + }, + ), InkWell( child: DrawerItem( LocaleKeys.employeeDigitalID.tr(), diff --git a/lib/ui/my_team/create_request.dart b/lib/ui/my_team/create_request.dart new file mode 100644 index 0000000..5044c22 --- /dev/null +++ b/lib/ui/my_team/create_request.dart @@ -0,0 +1,95 @@ + +import 'dart:ui'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:mohem_flutter_app/api/my_team/my_team_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/dashboard/menu_entries.dart'; +import 'package:mohem_flutter_app/models/my_team/get_employee_subordinates_list.dart'; +import 'package:mohem_flutter_app/provider/dashboard_provider_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'; + +class CreateRequest extends StatefulWidget { + const CreateRequest ({Key? key}) : super(key: key); + + @override + _CreateRequestState createState() => _CreateRequestState(); +} + +class _CreateRequestState extends State { + String searchEmpEmail =""; + String searchEmpName =""; + String searchEmpNo = ""; + String? empId; + List getEmployeeSubordinatesList = []; +// late DashboardProviderModel data; + List getMenuEntriesList = []; + GetEmployeeSubordinatesList? getEmployeeSubordinates; + + @override + void initState() { + super.initState(); + // data.fetchMenuEntries(); + employeeSubRequest(); + } + + void employeeSubRequest() async { + try { + Utils.showLoading(context); + getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString()); + getMenuEntriesList = await MyTeamApiClient().employeeSubordinatesRequest(getEmployeeSubordinates?.eMPLOYEENUMBER); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + @override + Widget build(BuildContext context) { + getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList; + print(getMenuEntriesList.length); + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: LocaleKeys.createRequest.tr(), + ), + body: SizedBox( + width: double.infinity, + height: double.infinity, + child: getMenuEntriesList.isEmpty + ? Utils.getNoDataWidget(context) + : ListView.separated( + padding: const EdgeInsets.all(21), + itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", getMenuEntriesList[index].prompt!, index).onPress(() { + Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(getMenuEntriesList[index].prompt!, getMenuEntriesList[index].functionName!)); + }), + separatorBuilder: (cxt, index) => 12.height, + itemCount: getMenuEntriesList.length), + ), + + ); + } + + Widget itemView(String icon, String title, index) { + return getMenuEntriesList[index].parentMenuName !=""? Row( + children: [ + (title).toText16().expanded, 12.width, + SvgPicture.asset( + "assets/images/arrow_next.svg", + color: MyColors.darkIconColor, + ) + ], + ).objectContainerView() : SizedBox(); + } +} diff --git a/lib/ui/my_team/employee_details.dart b/lib/ui/my_team/employee_details.dart new file mode 100644 index 0000000..064158c --- /dev/null +++ b/lib/ui/my_team/employee_details.dart @@ -0,0 +1,314 @@ +import 'dart:collection'; +import 'dart:ui'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:mohem_flutter_app/api/my_team/my_team_api_client.dart'; +import 'package:mohem_flutter_app/api/worklist/worklist_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/dashboard/menu_entries.dart'; +import 'package:mohem_flutter_app/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/my_team/get_employee_subordinates_list.dart'; +import 'package:mohem_flutter_app/models/profile_menu.model.dart'; +import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart'; +import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; +import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; +import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class EmployeeDetails extends StatefulWidget { + EmployeeDetails(); + + @override + _EmployeeDetailsState createState() => _EmployeeDetailsState(); + +} + +class _EmployeeDetailsState extends State { + GetEmployeeSubordinatesList? getEmployeeSubordinates; + static List menuData = []; + List menu =[]; + String? selectedFavLetter; + List? favLetters; + List? favUsersList; + List? replacementList; + + @override + void initState() { + super.initState(); + setState(() {}); + } + + //favorite + void fetchChangeFav({required String email, required String employeName, required String image, required String userName, bool isFav = false, bool isNeedToRefresh = false}) async { + Utils.showLoading(context); + getEmployeeSubordinates = ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList; + GenericResponseModel model = await MyTeamApiClient().changeFavoriteReplacements( + email: email, + employeName: employeName, + image: image, + userName: userName, + isFav: isFav, + ); + getEmployeeSubordinates!.isFavorite = isFav; + Utils.hideLoading(context); + setState(() {}); + } + + + @override + Widget build(BuildContext context) { + getEmployeeSubordinates = ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList; + setMenu(); + return Scaffold( + extendBody: true, + backgroundColor: MyColors.lightGreyEFColor, + body: Stack(children: [ + Container( + height: 200, + margin: EdgeInsets.only(top: 30), + decoration: BoxDecoration(image: DecorationImage(image: MemoryImage(Utils.getPostBytes(getEmployeeSubordinates!.eMPLOYEEIMAGE)), fit: BoxFit.cover)), + child: new BackdropFilter( + filter: new ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), + child: new Container( + decoration: new BoxDecoration(color: Colors.white.withOpacity(0.0)), + ), + ), + ), + SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + 80.height, + Container( + padding: EdgeInsets.only(left: 15, right: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: Icon( + Icons.arrow_back_ios, + color: Colors.white, + ), + ), + ], + ), + ), + myTeamInfo() + ], + ), + ) + ])); + } + + Widget myTeamInfo() { + Uri phoneNumber = Uri.parse('tel:${getEmployeeSubordinates?.eMPLOYEEMOBILENUMBER}'); + double _width = MediaQuery + .of(context) + .size + .width; + return Column( + children: [ + Container( + margin: EdgeInsets.fromLTRB(21, 0, 21, 10), + child: Stack(children: [ + Container( + width: _width, + //height: 150, + margin: EdgeInsets.only(top: 50), + padding: EdgeInsets.only(top: 50), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.all(Radius.circular(15)), + boxShadow: [BoxShadow(color: MyColors.lightGreyColor, blurRadius: 15, spreadRadius: 3)], + ), + child: Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + /// card header + customLabel(getEmployeeSubordinates!.eMPLOYEENAME.toString(), 22, Colors.black, true), + customLabel(getEmployeeSubordinates!.eMPLOYEENUMBER.toString() + ' | ' + getEmployeeSubordinates!.jOBNAME.toString(), 14, Colors.grey, false), + customLabel(getEmployeeSubordinates!.eMPLOYEEEMAILADDRESS.toString(), 13, Colors.black, true), + ], + ).paddingOnly(top: 10, bottom: 10), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + onPressed: (){ + if(getEmployeeSubordinates!.isFavorite != true){ + showFavoriteAlertDialog(context); + setState(() {}); + }else{ + fetchChangeFav( + email: getEmployeeSubordinates?.eMPLOYEEEMAILADDRESS ?? "", + employeName: getEmployeeSubordinates!.eMPLOYEENAME ?? "", + image: getEmployeeSubordinates!.eMPLOYEEIMAGE ?? "", + userName: getEmployeeSubordinates!.eMPLOYEENUMBER ?? "", + isFav: false,); + setState(() {}); + } }, + icon: getEmployeeSubordinates!.isFavorite != true + ? Icon( + Icons.star_outline, + size: 35, + color: Colors.green, + ) + : Icon( + Icons.star_outlined, + size: 35, + color: Colors.green, + ), + ).paddingOnly(top: 50), + Container(height: 100, alignment: Alignment.center, child: ProfileImage()), + IconButton( + onPressed: () { + launchUrl(phoneNumber); + }, + icon: Icon( + Icons.whatsapp, + color: Colors.green, + size: 30, + ).paddingOnly(top: 30), + ), + ], + ) + ])), + Container( + margin: EdgeInsets.fromLTRB(21, 8, 21, 10), + height: 260, + padding: EdgeInsets.only(top: 15, bottom: 15), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.all(Radius.circular(15)), + boxShadow: [BoxShadow(color: MyColors.lightGreyColor, blurRadius: 15, spreadRadius: 3)], + ), + child: Column( + children: menu.map((ProfileMenu i) => rowItem(i, context)).toList(), + ), + ), + ], + ); + } + + Widget ProfileImage() => + CircleAvatar( + radius: 70, + backgroundImage: MemoryImage(Utils.getPostBytes(getEmployeeSubordinates?.eMPLOYEEIMAGE)), + backgroundColor: Colors.black, + ); + + Widget customLabel(String label, double size, Color color, bool isBold, {double padding = 0.0}) => + Container( + padding: EdgeInsets.all(padding), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [Text(label, style: TextStyle(color: color, fontSize: size, fontWeight: isBold ? FontWeight.bold : FontWeight.normal))])); + + Widget rowItem(obj, context) { + return InkWell( + onTap: () { + + Navigator.pushNamed(context, obj.route, arguments:obj.arguments); + + }, + child: ListTile( + leading: SvgPicture.asset('assets/images/' + obj.icon), + title: Text(obj.name), + trailing: Icon(Icons.arrow_forward), + ), + ); + } + void setMenu(){ + menu = [ + ProfileMenu(name: "Profile Details", icon: 'personal-info.svg', route: AppRoutes.profileDetails, arguments:getEmployeeSubordinates, dynamicUrl: '', menuEntries: getMenuEntries('')), + ProfileMenu(name: "Create Request", icon: 'personal-info.svg', route: AppRoutes.createRequest,arguments: getEmployeeSubordinates, menuEntries: getMenuEntries('')), + ProfileMenu(name: "View Attendance", icon: 'personal-info.svg', route: AppRoutes.viewAttendance, arguments: getEmployeeSubordinates, dynamicUrl: '', menuEntries: getMenuEntries('')), + ProfileMenu(name: "Team Members", icon: 'family-members.svg', route: AppRoutes.teamMembers, arguments: getEmployeeSubordinates, dynamicUrl: '', menuEntries: getMenuEntries('')), + ]; + } + + void showFavoriteAlertDialog(BuildContext context) { + Widget cancelButton = TextButton( + child: Text( + LocaleKeys.cancel.tr(), + ), + onPressed: () { + Navigator.pop(context); + }, + ); + Widget continueButton = TextButton( + child: Text( + LocaleKeys.ok.tr(), + ), + onPressed: () { + fetchChangeFav( + email: getEmployeeSubordinates?.eMPLOYEEEMAILADDRESS ?? "", + employeName: getEmployeeSubordinates!.eMPLOYEENAME ?? "", + image: getEmployeeSubordinates!.eMPLOYEEIMAGE ?? "", + userName: getEmployeeSubordinates!.eMPLOYEENUMBER ?? "", + isFav: true, + ); + setState(() {}); + Navigator.pop(context); + }, + ); + AlertDialog alert = AlertDialog( + title: Text( + LocaleKeys.confirm.tr(), + ), + content: Container( + height: 150, + child: Column( + children: [ + Text("Do you want to add" + "${getEmployeeSubordinates!.eMPLOYEENAME.toString()}" + "in your favorite list "), + CircularAvatar( + url: getEmployeeSubordinates!.eMPLOYEEIMAGE ?? "", + height: 50, + width: 50, + isImageBase64: true, + ).paddingOnly(top: 21), + // 16.width, + ], + ), + ), + actions: [ + cancelButton, + continueButton, + ], + ); + showDialog( + context: context, + builder: (BuildContext context) { + return alert; + }, + ); + } +} + + GetMenuEntriesList getMenuEntries(String type) { + List data = _EmployeeDetailsState.menuData.where((GetMenuEntriesList test) => test.functionName == type).toList(); + if (data.isNotEmpty) { + return data[0]; + } else { + return GetMenuEntriesList(); + } + + +} + + diff --git a/lib/ui/my_team/my_team.dart b/lib/ui/my_team/my_team.dart new file mode 100644 index 0000000..5cb89ef --- /dev/null +++ b/lib/ui/my_team/my_team.dart @@ -0,0 +1,241 @@ + +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/my_team/my_team_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/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/models/my_team/get_employee_subordinates_list.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:url_launcher/url_launcher.dart'; + + +class MyTeam extends StatefulWidget { + const MyTeam({Key? key}) : super(key: key); + + @override + _MyTeamState createState() => _MyTeamState(); +} + +class _MyTeamState extends State { + String searchEmpEmail =""; + String searchEmpName =""; + String searchEmpNo = ""; + String? empId; + List getEmployeeSubordinatesList = []; + TextEditingController? _textEditingController = TextEditingController(); + List getEmployeeSListOnSearch = []; + + String dropdownValue = 'Name'; + + void initState() { + super.initState(); + getEmployeeSubordinates(); + } + + void getEmployeeSubordinates() async { + try { + Utils.showLoading(context); + getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString()); + getEmployeeSListOnSearch =getEmployeeSubordinatesList; + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBarWidget( + context, + title:"My Team Members", + ), + backgroundColor: MyColors.backgroundColor, + body: SingleChildScrollView( + child: Column( + children: [ + Container( + width: double.infinity, + margin: EdgeInsets.only( + top: 28, + left: 18, + right: 18, + // bottom: 28 + ), + padding: EdgeInsets.only( left: 10, right: 10), + height: 65, + 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: + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children : [ + Expanded( + child: + TextField( + onChanged: dropdownValue =="Name" ? + (String value){ + getEmployeeSListOnSearch = getEmployeeSubordinatesList.where((GetEmployeeSubordinatesList element) + => element.eMPLOYEENAME!.toLowerCase().contains(value.toLowerCase())).toList(); + setState(() {}); + }: (String value){ + getEmployeeSListOnSearch = getEmployeeSubordinatesList.where((GetEmployeeSubordinatesList element) + => element.eMPLOYEEEMAILADDRESS!.toLowerCase().contains(value.toLowerCase())).toList(); + setState(() {}); + }, + controller: _textEditingController, + decoration: InputDecoration( + filled: true, + fillColor: Colors.white, + border: InputBorder.none, + enabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + // contentPadding: EdgeInsets.fromLTRB(10, 15, 10, 15), + hintText: 'Search by $dropdownValue', + hintStyle: TextStyle(fontSize: 16.0, color: Colors.black,), + ), + )), + dropDown() + ]), + ), + Container( + width: MediaQuery.of(context).size.width, + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + children: [ + _textEditingController!.text.isNotEmpty && getEmployeeSListOnSearch.isEmpty ? + Container( + child: "No Results found".toText16(color: MyColors.blackColor),).paddingOnly(top: 10) + : ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + itemCount: _textEditingController!.text.isNotEmpty ? getEmployeeSListOnSearch.length : getEmployeeSubordinatesList.length, + itemBuilder: (context, index) { + var phoneNumber = Uri.parse('tel:${getEmployeeSListOnSearch[index].eMPLOYEEMOBILENUMBER}'); + return Container( + width: double.infinity, + margin: EdgeInsets.only( + top: 18, + left: 18, + right: 18, + ), + padding: EdgeInsets.only(left: 10, right: 10, top: 10, bottom: 10), + // height: 110, + 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: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Column( + children: [ + + CircleAvatar( + radius: 25, + backgroundImage: MemoryImage(Utils.getPostBytes(getEmployeeSListOnSearch[index].eMPLOYEEIMAGE)), + backgroundColor: Colors.black, + ), + ], + ), + SizedBox( + width: 10, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Present".toText13(color: MyColors.greenColor), + "${getEmployeeSListOnSearch[index].eMPLOYEENAME}".toText16(color: MyColors.blackColor), + "${getEmployeeSListOnSearch[index].pOSITIONNAME}".toText13(color: MyColors.blackColor), + + ], + ), + ], + ), + Column( + children: [ + IconButton( + onPressed: () { + launchUrl(phoneNumber); + }, + icon: Icon( + Icons.whatsapp, + color: Colors.green, + ), + ), + IconButton( + onPressed: () async{ + Navigator.pushNamed(context,AppRoutes.employeeDetails,arguments: getEmployeeSListOnSearch[index]); + // Navigator.of(context).push(MaterialPageRoute(builder: (context)=> EmployeeDetails(getEmployeeSubordinates: getEmployeeSubordinatesList[index])),); + }, + icon: Icon( + Icons.arrow_forward_outlined, + color: Colors.grey, + ), + ), + + + ], + ), + ], + ), + ); + }) + ], + ), + ) + ) + ], + ), + ) + ); + } + + Widget dropDown(){ + return DropdownButton( + value: dropdownValue, + icon: const Icon(Icons.keyboard_arrow_down), + elevation: 16, + onChanged: (String? newValue) { + setState(() { + dropdownValue = newValue!; + }); + }, + items: ['Name', 'Email'] + .map>((String value) { + return DropdownMenuItem( + value: value, + child: Text(value), + ); + }).toList(), + ); + } + +} + diff --git a/lib/ui/my_team/profile_details.dart b/lib/ui/my_team/profile_details.dart new file mode 100644 index 0000000..49690f0 --- /dev/null +++ b/lib/ui/my_team/profile_details.dart @@ -0,0 +1,91 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/extensions/string_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/models/my_team/get_employee_subordinates_list.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; + +class ProfileDetails extends StatefulWidget { + const ProfileDetails({Key? key}) : super(key: key); + + @override + _ProfileDetailsState createState() => _ProfileDetailsState(); +} + +class _ProfileDetailsState extends State { + + GetEmployeeSubordinatesList? getEmployeeSubordinates; + + + + @override + void initState() { + super.initState(); + } + + Widget build(BuildContext context) { + getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList; + return Scaffold( + appBar: AppBarWidget( + context, + title: "Profile Details", + ), + backgroundColor: MyColors.backgroundColor, + 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: 350, + 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: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + LocaleKeys.category.tr().toText13(color: MyColors.lightGrayColor), + "${getEmployeeSubordinates?.eMPLOYMENTCATEGORYMEANING}".toText16(isBold: true, color: MyColors.blackColor), + SizedBox( + height: 20, + ), + LocaleKeys.address.tr().toText13(color: MyColors.lightGrayColor), + "${getEmployeeSubordinates?.lOCATIONNAME}".toText16(isBold: true, color: MyColors.blackColor), + SizedBox( + height: 20, + ), + LocaleKeys.phoneNumber.tr().toText13(color: MyColors.lightGrayColor), + "${getEmployeeSubordinates?.eMPLOYEEMOBILENUMBER}".toText16(isBold: true, color: MyColors.blackColor), + SizedBox( + height: 20, + ), + LocaleKeys.businessGroup.tr().toText13(color: MyColors.lightGrayColor), + "${getEmployeeSubordinates?.bUSINESSGROUPNAME}".toText16(isBold: true, color: MyColors.blackColor), + SizedBox( + height: 20, + ), + LocaleKeys.Payroll.tr().toText13(color: MyColors.lightGrayColor), + "${getEmployeeSubordinates?.pAYROLLNAME}".toText16(isBold: true, color: MyColors.blackColor), + ]), + ), + ], + )); + } + +} diff --git a/lib/ui/my_team/team_members.dart b/lib/ui/my_team/team_members.dart new file mode 100644 index 0000000..7dccf5e --- /dev/null +++ b/lib/ui/my_team/team_members.dart @@ -0,0 +1,156 @@ +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/my_team/my_team_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/string_extensions.dart'; +import 'package:mohem_flutter_app/models/my_team/get_employee_subordinates_list.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class TeamMembers extends StatefulWidget { + const TeamMembers({Key? key}) : super(key: key); + + @override + _TeamMembersState createState() => _TeamMembersState(); +} + +class _TeamMembersState extends State { + String searchEmpEmail =""; + String searchEmpName =""; + String searchEmpNo = ""; + String? empId; + List getEmployeeSubordinatesList = []; + GetEmployeeSubordinatesList? getEmployeeSubordinates; + + void initState() { + super.initState(); + employeeSubordinates(); + setState(() {}); + + } + + void employeeSubordinates() async { + try { + Utils.showLoading(context); + getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString()); + getEmployeeSubordinatesList = await MyTeamApiClient().employeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString(),getEmployeeSubordinates?.eMPLOYEENUMBER); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + @override + Widget build(BuildContext context) { + getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList; + return Scaffold( + appBar: AppBarWidget( + context, + title: "Team Members", + ), + backgroundColor: MyColors.backgroundColor, + body: SingleChildScrollView( + child: Column( + children: [ + Container( + width: MediaQuery.of(context).size.width, + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + children: [ + if(getEmployeeSubordinatesList != 0) + ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + itemCount: getEmployeeSubordinatesList.length, + itemBuilder: (context, index) { + var phoneNumber = Uri.parse('tel:${getEmployeeSubordinatesList[index].eMPLOYEENUMBER}'); + return Container( + width: double.infinity, + margin: EdgeInsets.only( + top: 18, + left: 18, + right: 18, + ), + padding: EdgeInsets.only(left: 10, right: 10, top: 10, bottom: 10), + 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: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Column( + children: [ + CircleAvatar( + radius: 25, + backgroundImage: MemoryImage(Utils.getPostBytes(getEmployeeSubordinatesList[index].eMPLOYEEIMAGE)), + backgroundColor: Colors.black, + ), + // MyTeamImage() + ], + ), + SizedBox( + width: 10, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + "Present".toText13(color: MyColors.greenColor), + "${getEmployeeSubordinatesList[index].eMPLOYEENAME}".toText16(color: MyColors.blackColor), + "${getEmployeeSubordinatesList[index].pOSITIONNAME}".toText13(color: MyColors.blackColor), + ], + ), + ], + ), + Column( + children: [ + IconButton( + onPressed: () { + launchUrl(phoneNumber); + }, + icon: Icon( + Icons.whatsapp, + color: Colors.green, + ), + ), + ], + ), + ], + ), + ); + }), + Container( + margin: EdgeInsets.only(top:30), + child: "No Members".toText16(isBold: true, color: MyColors.black), + ) + ], + ), + ) + // SizedBox(height: 20), + ) + ], + ), + )); + } + + Widget MyTeamImage() => CircleAvatar( + radius: 30, + //backgroundImage: MemoryImage(Utils.getPostBytes(memberInformationList.eMPLOYEEIMAGE)), + backgroundColor: Colors.black, + ); +} diff --git a/lib/ui/my_team/view_attendance.dart b/lib/ui/my_team/view_attendance.dart new file mode 100644 index 0000000..f08ca3b --- /dev/null +++ b/lib/ui/my_team/view_attendance.dart @@ -0,0 +1,569 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/monthly_attendance_api_client.dart'; +import 'package:mohem_flutter_app/api/my_team/my_team_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/dashboard/get_attendance_tracking_list_model.dart'; +import 'package:mohem_flutter_app/models/get_day_hours_type_details_list_model.dart'; +import 'package:mohem_flutter_app/models/get_schedule_shifts_details_list_model.dart'; +import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart'; +import 'package:mohem_flutter_app/models/my_team/get_employee_subordinates_list.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/circular_step_progress_bar.dart'; +import 'package:month_picker_dialog/month_picker_dialog.dart'; +import 'package:pie_chart/pie_chart.dart'; +import 'package:syncfusion_flutter_calendar/calendar.dart'; + +class ViewAttendance extends StatefulWidget { + const ViewAttendance({Key? key}) : super(key: key); + + @override + _ViewAttendanceState createState() => _ViewAttendanceState(); +} + +class _ViewAttendanceState extends State { + bool isPresent = false; + bool isAbsent = false; + bool isMissing = false; + bool isOff = false; + DateTime date = DateTime.now(); + late DateTime formattedDate; + var currentMonth = DateTime.now().month; + String searchMonth = getMonth(DateTime.now().month); + int searchYear = DateTime.now().year; + int? pRTPID; + + String searchEmpEmail =""; + String searchEmpName =""; + String searchEmpNo = ""; + String? empId; + List getEmployeeSubordinatesList = []; + List getDayHoursTypeDetailsList = []; + GetTimeCardSummaryList? getTimeCardSummaryList; + GetAttendanceTracking? attendanceTracking; + GetEmployeeSubordinatesList? getEmployeeSubordinates; + + @override + void initState() { + super.initState(); + formattedDate = date; + callTimeCardAndHourDetails(date.day, searchMonth, searchYear); + // setState(() {}); + } + + + void callTimeCardAndHourDetails(index, searchMonth, searchYear) async { + try { + Utils.showLoading(context); + getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString()); + getTimeCardSummaryList = await MyTeamApiClient().getTimeCardSummary(searchMonth, searchYear,getEmployeeSubordinates?.eMPLOYEENUMBER); + getDayHoursTypeDetailsList = await MyTeamApiClient().getDayHoursTypeDetails(searchMonth, searchYear, getEmployeeSubordinates?.eMPLOYEENUMBER); + attendanceTracking = await MyTeamApiClient().getAttendanceTracking(getEmployeeSubordinates?.eMPLOYEENUMBER); + Utils.hideLoading(context); + _calendarController.displayDate = formattedDate; + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + + + final CalendarController _calendarController = CalendarController(); + final List _colorList = [Color(0xff2AB2AB), Color(0xff202529)]; + + @override + Widget build(BuildContext context) { + getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList; + Map dataMap = { + "Present": getTimeCardSummaryList?.aTTENDEDDAYS != null ? getTimeCardSummaryList!.aTTENDEDDAYS!.toDouble() : 0, + "Absent": getTimeCardSummaryList?.aBSENTDAYS != null ? getTimeCardSummaryList!.aBSENTDAYS!.toDouble() : 0, + }; + //if(getTimeCardSummaryList ==null) + // callTimeCardAndHourDetails(date.day, searchMonth, searchYear); + return Scaffold( + appBar: AppBarWidget( + context, + title: "View Attendance", + ), + backgroundColor: MyColors.backgroundColor, + body: SingleChildScrollView( + child: Column(children: [ + Container( + width: double.infinity, + margin: EdgeInsets.only( + top: 28, + left: 18, + right: 18, + ), + padding: EdgeInsets.only(left: 16, right: 16, top: 16, bottom: 16), + // height: 120, + 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: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Today's Attendance".toText20(color: MyColors.blackColor), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + children: [ + LocaleKeys.checkIn.tr().toText12(isBold: true, color: MyColors.greenColor), + "${(attendanceTracking?.pSwipeIn)?? "- - : - -"}".toText16(isBold: true, color: MyColors.grey57Color), + ], + ), + Column( + children: [ + LocaleKeys.checkOut.tr().toText12(isBold: true, color: MyColors.redColor), + "${(attendanceTracking?.pSwipeOut)?? "- - : - -"}".toText16(isBold: true, color: MyColors.grey57Color), + ], + ), + Column( + children: [ + LocaleKeys.lateIn.tr().toText12(isBold: true, color: MyColors.blackColor), + "${(attendanceTracking?.pLateInHours)?? "- - : - -"}".toText16(isBold: true, color: MyColors.grey57Color), + ], + ), + ], + ) + ], + ), + ), + Container( + width: double.infinity, + margin: EdgeInsets.only( + top: 18, + left: 18, + right: 18, + bottom: 28, + ), + padding: EdgeInsets.only(left: 16, right: 16, top: 16, bottom: 16), + 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: Column( + children: [ + //20.height, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + "${DateFormat("MMMM-yyyy").format(formattedDate)}".toText16(color: MyColors.blackColor), + const Icon(Icons.keyboard_arrow_down_rounded, color: MyColors.blackColor), + ], + ).onPress(() async { + showMonthPicker( + context: context, //locale: EasyLocalization.of(context)?.locale, + initialDate: formattedDate, + firstDate: DateTime(searchYear - 2), + lastDate: DateTime.now(), + ).then((selectedDate) { + if (selectedDate != null) { + searchMonth = getMonth(selectedDate.month); + searchYear = selectedDate.year; + formattedDate = selectedDate; //DateFormat('MMMM-yyyy').format(selectedDate); + // _calendarController.selectedDate = formattedDate; + callTimeCardAndHourDetails(selectedDate.day, searchMonth, searchYear); + } + }); + }) + ], + ), + 18.height, + AspectRatio(aspectRatio: 333 / 270, child: calendarWidget()), + Row( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + children: [ + LocaleKeys.attendance.tr().toText12(isBold: true, color: MyColors.grey3AColor), + LocaleKeys.stats.tr().toText24(isBold: true, color: MyColors.grey3AColor), + ], + ), + 30.height, + Row( + children: [ + Container( + height: 8, + width: 8, + decoration: BoxDecoration( + color: MyColors.lightGreenColor, + borderRadius: BorderRadius.circular(100), + ), + ), + Container( + margin: const EdgeInsets.only(left: 5, right: 5), + child: "${LocaleKeys.present.tr()} ${getTimeCardSummaryList?.aTTENDEDDAYS != null ? getTimeCardSummaryList?.aTTENDEDDAYS : 0}".toText16(isBold: true, color: MyColors.lightGreenColor), + ), + ], + ), + 8.height, + Row( + children: [ + Container( + height: 9, + width: 9, + decoration: BoxDecoration( + color: MyColors.backgroundBlackColor, + borderRadius: BorderRadius.circular(100), + ), + ), + Container( + margin: const EdgeInsets.only(left: 5, right: 5), + child: "${LocaleKeys.absent.tr()} ${getTimeCardSummaryList?.aBSENTDAYS != null ? getTimeCardSummaryList?.aBSENTDAYS : 0 }".toText16( + isBold: true, + color: MyColors.backgroundBlackColor, + ), + ) + ], + ), + ], + ), + SizedBox( + width: 20, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 170, + height: 170, + child: PieChart( + dataMap: dataMap, + animationDuration: const Duration(milliseconds: 800), + chartLegendSpacing: 0, + chartRadius: MediaQuery.of(context).size.width / 5.2, + colorList: _colorList, + initialAngleInDegree: 0, + chartType: ChartType.ring, + ringStrokeWidth: 80, + legendOptions: const LegendOptions( + showLegendsInRow: false, + showLegends: false, + ), + chartValuesOptions: const ChartValuesOptions( + showChartValueBackground: false, + showChartValues: true, + showChartValuesInPercentage: true, + showChartValuesOutside: false, + decimalPlaces: 1, + chartValueStyle: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + color: MyColors.white, + )), + ), + ), + ], + ).paddingOnly(left: 21, right: 21, bottom: 21), + ], + ), + ], + ), + ), + ]), + ), + ); + } + + Widget calendarWidget() { + return SfCalendar( + view: CalendarView.month, + showDatePickerButton: false, + controller: _calendarController, + backgroundColor: Colors.white, + headerHeight: 0, + viewNavigationMode: ViewNavigationMode.none, + todayHighlightColor: MyColors.grey3AColor, + showNavigationArrow: false, + showCurrentTimeIndicator: false, + showWeekNumber: false, + cellBorderColor: Colors.white, + selectionDecoration: BoxDecoration( + border: Border.all(color: MyColors.white, width: 10), + borderRadius: const BorderRadius.all(Radius.circular(100)), + shape: BoxShape.circle, + ), + dataSource: MeetingDataSource(_getDataSource()), + monthViewSettings: const MonthViewSettings( + dayFormat: 'EEE', + showTrailingAndLeadingDates: false, + showAgenda: false, + //navigationDirection: MonthNavigationDirection.vertical, + monthCellStyle: MonthCellStyle( + textStyle: TextStyle( + fontStyle: FontStyle.normal, + fontSize: 13, + color: Colors.white, + ), + ), + ), + viewHeaderStyle: const ViewHeaderStyle( + dayTextStyle: TextStyle(color: MyColors.grey3AColor, fontSize: 13, fontWeight: FontWeight.w600), + ), + monthCellBuilder: (build, details) { + if (details.date.month == formattedDate.month && details.date.year == formattedDate.year) { + int val = details.date.day; + //check day is off + if (getDayHoursTypeDetailsList.isNotEmpty) { + if (getDayHoursTypeDetailsList?[val - 1].aTTENDEDFLAG == 'N' && getDayHoursTypeDetailsList?[val - 1].dAYTYPE == 'OFF') { + return Container( + margin: const EdgeInsets.all(4), + decoration: BoxDecoration( + color: MyColors.greyACColor.withOpacity(.12), + shape: BoxShape.circle, + ), + alignment: Alignment.center, + child: Text( + "$val", + style: const TextStyle( + fontSize: 13, + fontWeight: FontWeight.w500, + color: MyColors.greyA5Color, + ), + ), + ); + } + //check day is Present + else if (getDayHoursTypeDetailsList?[val - 1].aTTENDEDFLAG == 'Y') { + return Container( + margin: const EdgeInsets.all(4), + decoration: BoxDecoration( + gradient: const LinearGradient( + transform: GradientRotation(.46), + begin: Alignment.topRight, + end: Alignment.bottomLeft, + colors: [MyColors.gradiantEndColor, MyColors.gradiantStartColor], + ), + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + offset: const Offset(0, 2), + blurRadius: 26, + color: MyColors.blackColor.withOpacity(0.100), + ), + ], + ), + alignment: Alignment.center, + child: Text( + "$val", + style: const TextStyle( + fontSize: 13, + fontWeight: FontWeight.w500, + color: MyColors.white, + ), + ), + ); + } + //check day is Absent + else if (getDayHoursTypeDetailsList?[val - 1].aTTENDEDFLAG == 'N' && getDayHoursTypeDetailsList?[val - 1].aBSENTFLAG == 'Y') { + return Container( + margin: const EdgeInsets.all(4), + decoration: BoxDecoration( + color: MyColors.backgroundBlackColor, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + offset: const Offset(0, 2), + blurRadius: 26, + color: MyColors.blackColor.withOpacity(0.100), + ), + ], + ), + alignment: Alignment.center, + child: Text( + "$val", + style: const TextStyle( + fontSize: 13, + fontWeight: FontWeight.w500, + color: MyColors.white, + ), + ), + ); + } + } + return Container( + margin: const EdgeInsets.all(4), + decoration: BoxDecoration( + border: Border.all(color: MyColors.backgroundBlackColor, width: 2.0, style: BorderStyle.solid), //Border.all + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + offset: const Offset(0, 2), + blurRadius: 26, + color: MyColors.blackColor.withOpacity(0.100), + ), + ], + ), + alignment: Alignment.center, + child: Text( + "$val", + style: const TextStyle( + fontSize: 13, + fontWeight: FontWeight.w500, + color: Color(0xff1F2428), + ), + ), + ); + // return Container( + // alignment: Alignment.center, + // child: Text("$val"), + // ); + } else { + return const SizedBox(); + } + }, + ); + } + + + List _getDataSource() { + final List meetings = []; + return meetings; + } + + static String getMonth(int month) { + switch (month) { + case 1: + return "January"; + case 2: + return "February"; + case 3: + return "March"; + case 4: + return "April"; + case 5: + return "May"; + case 6: + return "June"; + case 7: + return "July"; + case 8: + return "August"; + case 9: + return "September"; + case 10: + return "October"; + case 11: + return "November"; + case 12: + return "December"; + default: + return ""; + } + } + + static String getMonthAr(int month) { + switch (month) { + case 1: + return 'يناير'; + case 2: + return ' فبراير'; + case 3: + return 'مارس'; + case 4: + return 'أبريل'; + case 5: + return 'مايو'; + case 6: + return 'يونيو'; + case 7: + return 'يوليو'; + case 8: + return 'أغسطس'; + case 9: + return 'سبتمبر'; + case 10: + return ' اكتوبر'; + case 11: + return ' نوفمبر'; + case 12: + return 'ديسمبر'; + default: + return ""; + } + } +} + +class MeetingDataSource extends CalendarDataSource { + MeetingDataSource(List source) { + appointments = source; + } + + @override + DateTime getStartTime(int index) { + return _getMeetingData(index).from; + } + + @override + DateTime getEndTime(int index) { + return _getMeetingData(index).to; + } + + @override + String getSubject(int index) { + return _getMeetingData(index).eventName; + } + + @override + Color getColor(int index) { + return _getMeetingData(index).background; + } + + @override + bool isAllDay(int index) { + return _getMeetingData(index).isAllDay; + } + + Meeting _getMeetingData(int index) { + final dynamic meeting = appointments; + Meeting meetingData; + if (meeting is Meeting) { + meetingData = meeting; + } + return meeting; + } +} + +class Meeting { + Meeting(this.eventName, this.from, this.to, this.background, this.isAllDay); + + String eventName; + DateTime from; + DateTime to; + Color background; + bool isAllDay; +} diff --git a/lib/ui/profile/family_members.dart b/lib/ui/profile/family_members.dart index 2dd84ea..f42c3fb 100644 --- a/lib/ui/profile/family_members.dart +++ b/lib/ui/profile/family_members.dart @@ -6,11 +6,14 @@ import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; +import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart'; import 'package:mohem_flutter_app/ui/screens/profile/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:provider/provider.dart'; class FamilyMembers extends StatefulWidget { const FamilyMembers({Key? key}) : super(key: key); @@ -24,9 +27,14 @@ class _FamilyMembersState extends State { int? relationId; int? flag; + GetMenuEntriesList menuEntries = GetMenuEntriesList(); + @override void initState() { super.initState(); + List menuData = Provider.of(context, listen: false).getMenuEntriesList!; + menuEntries = menuData.where((GetMenuEntriesList e) => e.requestType == 'CONTACT').toList()[0]; + setState(() {}); getEmployeeContacts(); } @@ -108,12 +116,13 @@ class _FamilyMembersState extends State { mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Container( - child: InkWell( - onTap: () { + child: menuEntries.updateButton == 'Y' + ? InkWell( + onTap: () async{ relationId = getEmployeeContactsList[index]!.cONTACTRELATIONSHIPID!.toInt(); showUpdateAlertDialog(context, relationId!.toInt(), 2, LocaleKeys.update.tr()); }, - child: RichText( + child: RichText( text: TextSpan( children: [ WidgetSpan( @@ -134,7 +143,28 @@ class _FamilyMembersState extends State { ], ), ), - )), + ) + : RichText( + text: TextSpan( + children: [ + WidgetSpan( + child: Icon( + Icons.edit, + size: 15, + color: MyColors.lightGreyColor, + ), + ), + TextSpan( + text: LocaleKeys.update.tr(), + style: TextStyle( + color: MyColors.lightGreyColor, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ) ), Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: SizedBox( @@ -203,17 +233,18 @@ class _FamilyMembersState extends State { Widget footer() { return Container( decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(10), color: MyColors.white, boxShadow: [ BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), ], ), - child: DefaultButton(LocaleKeys.addNewFamilyMember.tr(), () async { - Navigator.pushNamed(context, AppRoutes.addUpdateFamilyMember, arguments: {"relationID": relationId, "flag": 1, "actionType": "ADD"}); - // context.setLocale(const Locale("en", "US")); // to change Loacle - ProfileScreen(); - }).insideContainer, + child: DefaultButton( + LocaleKeys.addNewFamilyMember.tr(), () async { + Navigator.pushNamed(context, AppRoutes.addUpdateFamilyMember, arguments: {"relationID": relationId, "flag": 1, "actionType": "ADD"}); + ProfileScreen(); + } + ) + .insideContainer, ); } diff --git a/lib/ui/work_list/worklist_settings.dart b/lib/ui/work_list/worklist_settings.dart new file mode 100644 index 0000000..8c72d71 --- /dev/null +++ b/lib/ui/work_list/worklist_settings.dart @@ -0,0 +1,197 @@ + +import 'package:easy_localization/src/public_ext.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:mohem_flutter_app/api/worklist/worklist_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/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/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/get_user_item_type_list.dart'; +import 'package:mohem_flutter_app/models/update_user_item_type_list.dart'; +import 'package:mohem_flutter_app/models/worklist/update_user_type_list.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; + +class WorklistSettings extends StatefulWidget { + const WorklistSettings({Key? key}) : super(key: key); + + @override + _WorklistSettingsState createState() => _WorklistSettingsState(); +} + +class _WorklistSettingsState extends State { + List getUserItemTypesList = []; + UpdateUserItemTypesList? updateUserItemTypesList; + + + void initState() { + super.initState(); + userItemTypesList(); + } + + void userItemTypesList() async { + try { + Utils.showLoading(context); + getUserItemTypesList = await WorkListApiClient().getUserItemTypes(); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + + void updateUserItem() async { + try { + Utils.showLoading(context); + List> itemList=[]; + for (var element in getUserItemTypesList) { + + itemList.add(UpdateUserTypesList(itemID: element.uSERITEMTYPEID, pITEMTYPE: element.iTEMTYPE,pFYAENABLEDFALG: element.fYAENABLEDFALG, pFYIENABLEDFALG: element.fYIENABLEDFLAG).toJson()); + + } + updateUserItemTypesList = await WorkListApiClient().updateUserItemTypes(itemList); + Utils.hideLoading(context); + Navigator.pushNamed(context, AppRoutes.workList); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + + + @override + Widget build(BuildContext context) { + return Scaffold(backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Worklist Settings", + ), + body:Container( + margin: const EdgeInsets.only(top: 21, left: 21, right: 21), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + child: "Turn on notifications for".tr().toText22(color: MyColors.blackColor), + ).paddingOnly(top: 10, bottom: 50), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + child: "Item Type".tr().toText14(color: MyColors.blackColor) , + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Container( + child: "FYA".tr().toText14(color: MyColors.blackColor) , + ), + Container( + child: "FYI".tr().toText14(color: MyColors.blackColor) , + ).paddingOnly(left: 30, right: 30), + ], + ) + ], + ), + Divider( + color: MyColors.greyA5Color, + ), + Container( + width: MediaQuery.of(context).size.width, + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + itemCount: getUserItemTypesList == null ? 0 : getUserItemTypesList.length, + itemBuilder: (BuildContext context,int index) { + return Container( + child: Column( + children:[ + + customSwitch(getUserItemTypesList[index]), + ] + ), + ); + } + ), + ) + ), + SizedBox( + height: 30, + ), + Container( + decoration: BoxDecoration( + color: MyColors.white, + boxShadow: [ + BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), + ], + ), + child: DefaultButton( + LocaleKeys.submit.tr(), () async { + updateUserItem(); + } + ) + .insideContainer, + ), + ], + ), + ) + + ); + } + + + Widget customSwitch(GetUserItemTypesList list){ + return Padding( + padding: const EdgeInsets.only(top: 21), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(list.iTEMTYPE.toString(), style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: MyColors.blackColor + ),), + const Spacer(), + Row( + children: [ + CupertinoSwitch( + trackColor: Colors.grey, + activeColor: MyColors.gradiantEndColor, + value: list?.fYAENABLEDFALG =='Y' ?true : false, + onChanged: (value){ + setState(() { + list?.fYAENABLEDFALG = value == true ? 'Y': 'N'; + }); + } + ), + CupertinoSwitch( + trackColor: Colors.grey, + activeColor: MyColors.gradiantEndColor, + value: list?.fYIENABLEDFLAG =='Y' ?true : false, + onChanged: (value){ + setState(() { + // list.isFYI = value; + list?.fYIENABLEDFLAG = value ==true ? 'Y': 'N'; + }); + } + ), + ], + ) + ], + ), + ); + } + +} diff --git a/lib/widgets/app_bar_widget.dart b/lib/widgets/app_bar_widget.dart index b6ff590..806fe6b 100644 --- a/lib/widgets/app_bar_widget.dart +++ b/lib/widgets/app_bar_widget.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/classes/colors.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'; @@ -42,6 +43,7 @@ AppBar AppBarWidget(BuildContext context, {required String title, bool showHomeB if (showNotificationButton) IconButton( onPressed: () { + Navigator.pushNamed(context, AppRoutes.worklistSettings); // Navigator.pushAndRemoveUntil( // context, // MaterialPageRoute(builder: (context) => LandingPage()), diff --git a/pubspec.yaml b/pubspec.yaml index 789d51c..dde9d39 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -71,6 +71,7 @@ dependencies: # flutter_barcode_scanner: ^2.0.0 qr_code_scanner: ^1.0.0 qr_flutter: ^4.0.0 + url_launcher: ^6.1.5