diff --git a/android/app/build.gradle b/android/app/build.gradle index 596d981..a3de0ed 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'com.google.gms.google-services' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 31 + compileSdkVersion 32 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -46,7 +46,7 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "hmg.cloudSolutions.mohem" minSdkVersion 21 - targetSdkVersion 30 + targetSdkVersion 32 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index d44cea3..dd9a8de 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/logos/bn_cloud_soloution.jpg b/assets/images/logos/bn_cloud_soloution.jpg new file mode 100644 index 0000000..844bc43 Binary files /dev/null and b/assets/images/logos/bn_cloud_soloution.jpg differ diff --git a/assets/images/logos/main_mohemm_logo.png b/assets/images/logos/main_mohemm_logo.png new file mode 100644 index 0000000..5536c07 Binary files /dev/null and b/assets/images/logos/main_mohemm_logo.png differ diff --git a/assets/images/logos/mohemm_logo.svg b/assets/images/logos/mohemm_logo.svg index 1cb9a0b..2fc235f 100644 --- a/assets/images/logos/mohemm_logo.svg +++ b/assets/images/logos/mohemm_logo.svg @@ -1,7 +1,6 @@ - - - + + - + - - - - - - - - - - + + + - - - - - + + + + + - - - - - + C107.1,30.8,99.6,21.8,99.2,12.7z" /> + + + + - - - - - + C80.6,30.8,73.1,21.8,72.8,12.7z" /> + + + + - + C54.1,30.8,46.6,21.8,46.3,12.7z" /> diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index b0f81c0..ecedbdf 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -30,6 +30,9 @@ "services": "خدمات", "viewAllServices": "عرض جميع الخدمات", "monthlyAttendance": "الحضور الشهري", + "vacationRule": "حكم اجازة", + "startDateT": "تاريخ البدء", + "endDateT": "تاريخ الانتهاء", "workFromHome": "العمل من المنزل", "ticketRequest": "طلب تذكرة", "viewAllOffers": "مشاهدة جميع العروض", @@ -41,7 +44,7 @@ "confirmPassword": "تأكيد كلمة المرور", "update": "تحديث", "title": "عنوان", - "home": "مسكن", + "home": "الرئيسية", "mySalary": "راتبي", "createRequest": "إنشاء طلب", "forgotPassword": "هل نسيت كلمة السر", @@ -231,6 +234,7 @@ "myAttendance": "حضوري", "workOnBreak": "التعويض عن العمل اثناءالاستراحه", "next": "التالي", + "apply": "يتقدم", "mobile": "التليفون المحمول", "completingYear": "نحن نقدر لك لاستكمال خدمة", "year": "سنة", @@ -263,6 +267,54 @@ "totalPayAmount": "المبلغ الإجمالي للدفع", "paymentInformation": "معلومات الدفع", "amount": "مقدار", + "correctCurrentDatails": "تعديل او اكمال التفاصيل الحالية", + "selectType": " حدد نوع التغيير الذي تريد القيام به", + "enterNewInfo": " أدخل معلومات جديدة بسبب تغيير حقيقي في التفاصيل الحالية (على سبيل المثال بسبب تغيير في الحالة الاجتماعية", + "endDate": "تاريخ الانتهاء", + "removeThisMember": "هل انت متأكد تريد ازالة هذا العضو؟", + "updateThisMember ": "هل انت متأكد تريد تحديث بيانات هذا العضو؟", + "addNewFamilyMember": "اضافة عضو جديد", + "addRow": "اضافة صف جديد", + "pleaseSelect": "الرجاء اختيار", + "delete": "حذف", + "edit": "تعديل", + "add": "اضافه", + "myProfile": "معلوماتي", + "mowadhafhi": "موظفي", + "searchAnnouncements": "بحث الاعلانات", + "announcements": "اعلانات", + "swipeRequest": "طلب تسجيل حضور", + "serviceType": "نوع الخدمه", + "departmentName": "اسم القسم", + "selectDepartment": "اختر القسم", + "relatedSection": "قسم ذو صله", + "selectSection": "اختيار القسم", + "relatedTopic": "عنوان ذو صله", + "selectTopic": "اختر العنوان", + "supportingDocument": "ارفاق مستند", + "mowadhafhiRequest": "طلب موظفي", + "ticketReference": "مرجع التذكره", + "section": "القسم", + "topic": "العنوان", + "actionBy": "الرد بواسطة", + "pending": "معلق", + "pendingTransactions": "المعاملات المعلقه", + "selectRequestType": "الرجاء اختيار نوع الطلب", + "dateFrom": "من تاريخ", + "dateTo": "الى تاريخ", + "requestName": "اسم الطلب", + "createdFor": "انشاء لأجل", + "requestCreatedSuccessfully": "تم انشاء الطلب بنجاح", + "search": "بحث", + "wantToReject": "هل انت متأكد تريد الرفض", + "requestType": "نوع الطلب", + "employeeDigitalID": "هويةالموظف الرقمية", + "businessCard": "بطاقة العمل", + "checkOut":"وقت الخروج", + "regular":"منتظم", + "mark" : "علامة", + "selectMethodOfAttendance":"اختر طريقة تسجيل الحضور", + "comeNearHMGWifi": "HMG wifi من فضلك اقترب من", "profile": { "reset_password": { "label": "Reset Password", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 66ed437..32a5e43 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -30,6 +30,9 @@ "services": "Services", "viewAllServices": "View All Services", "monthlyAttendance": "Monthly Attendance", + "vacationRule": "Vacation Rule", + "startDateT": "Start Date", + "endDateT": "End Date", "workFromHome": "Work From Home", "ticketRequest": "Ticket Request", "viewAllOffers": "View All Offers", @@ -231,6 +234,7 @@ "myAttendance": "My Attendance", "workOnBreak": "Work On Break", "next": "Next", + "apply": "Apply", "mobile": "Mobile", "year": "Year", "month": "Month", @@ -264,6 +268,53 @@ "totalPayAmount": "Total Pay Amount", "paymentInformation": "Payment Information", "amount": "Amount", + "correctCurrentDatails": "correct or complete the current details", + "selectType": "Select the type of change you want to make", + "enterNewInfo": "Enter new Information because of a real change to the current details (e.g because of a change in marital status)", + "endDate": "*End Date", + "removeThisMember": "Are You Sure You Want to Remove this Member?", + "updateThisMember": "Are You Sure You Want to Update this Member?", + "addNewFamilyMember": "Add New Family Member", + "addRow": "Add new row", + "pleaseSelect": "Please Select *", + "delete": "delete", + "add": "Add", + "edit": "Edit", + "myProfile": "My Profile", + "mowadhafhi": "Mowadhafhi", + "searchAnnouncements": "Search Announcements", + "announcements": "Announcements", + "swipeRequest": "Swipe Request", + "serviceType": "Service Type", + "departmentName": "Department Name", + "selectDepartment": "Select Department", + "relatedSection": "Related Section", + "selectSection": "Select Section", + "relatedTopic": "Related Topic", + "selectTopic": "Select Topic", + "supportingDocument": "Supporting Document", + "mowadhafhiRequest": "Mowadhafhi Request", + "ticketReference": "Ticket Reference", + "section": "Section", + "topic": "Topic", + "actionBy": "Action By", + "pendingTransactions": "Pending Transactions", + "selectRequestType": "Please select request type", + "dateFrom": "Date From", + "dateTo": "Date To", + "requestName": "Request Name", + "createdFor": "Created For", + "requestType": "Request Type", + "requestCreatedSuccessfully": "Request created successfully", + "search": "Search", + "wantToReject": "Are you sure want to reject?", + "employeeDigitalID": "Employee Digital ID", + "businessCard": "Business Card", + "checkOut":"Check Out", + "regular":"Regular", + "mark" : "Mark", + "selectMethodOfAttendance":"Select the method to mark the attendance", + "comeNearHMGWifi": "Please come near to HMG wifi", "profile": { "reset_password": { "label": "Reset Password", diff --git a/lib/api/dashboard_api_client.dart b/lib/api/dashboard_api_client.dart index 215af90..1dd58b1 100644 --- a/lib/api/dashboard_api_client.dart +++ b/lib/api/dashboard_api_client.dart @@ -88,7 +88,7 @@ class DashboardApiClient { } //Mark Attendance - Future markAttendance({String lat = "0", String? long = "0", required int pointType, String nfcValue = "", bool isGpsRequired = false}) async { + Future markAttendance({String lat = "0", String? long = "0", required int pointType, String nfcValue = "", bool isGpsRequired = false, String QRValue = ""}) async { String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC"; var uuid = Uuid(); // Generate a v4 (random) id @@ -97,7 +97,7 @@ class DashboardApiClient { "UID": uuid.v4(), //Mobile Id "Latitude": lat, "Longitude": long, - "QRValue": "", + "QRValue": QRValue, "PointType": pointType, // NFC=2, Wifi = 3, QR= 1, "NFCValue": nfcValue, "WifiValue": pointType == 3 ? "100" : "", diff --git a/lib/api/login_api_client.dart b/lib/api/login_api_client.dart index 8016ab9..cd6a948 100644 --- a/lib/api/login_api_client.dart +++ b/lib/api/login_api_client.dart @@ -1,5 +1,6 @@ import 'dart:async'; +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/basic_member_information_model.dart'; @@ -8,8 +9,6 @@ import 'package:mohem_flutter_app/models/generic_response_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 'package:mohem_flutter_app/api/api_client.dart'; - class LoginApiClient { static final LoginApiClient _instance = LoginApiClient._internal(); diff --git a/lib/api/monthlyAttendance_api_client.dart b/lib/api/monthly_attendance_api_client.dart similarity index 100% rename from lib/api/monthlyAttendance_api_client.dart rename to lib/api/monthly_attendance_api_client.dart diff --git a/lib/api/my_attendance_api_client.dart b/lib/api/my_attendance_api_client.dart index b98aed4..9e58b9b 100644 --- a/lib/api/my_attendance_api_client.dart +++ b/lib/api/my_attendance_api_client.dart @@ -1,5 +1,6 @@ import 'dart:async'; +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/generic_response_model.dart'; @@ -9,8 +10,6 @@ import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/start_eit_approval_process_model.dart'; import 'package:mohem_flutter_app/models/submit_eit_transaction_list_model.dart'; -import 'package:mohem_flutter_app/api/api_client.dart'; - class MyAttendanceApiClient { static final MyAttendanceApiClient _instance = MyAttendanceApiClient._internal(); @@ -83,12 +82,8 @@ class MyAttendanceApiClient { "P_MENU_TYPE": "E", "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, "P_FUNCTION_NAME": pFunctionName, - // "EITTransactionTBL": list, + "EITTransactionTBL": list, }; - print(postParams); - postParams["EITTransactionTBL"] =list; - - postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); @@ -103,13 +98,10 @@ class MyAttendanceApiClient { "P_MENU_TYPE": "E", "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, "P_FUNCTION_NAME": pFunctionName, - //"EITTransactionTBL": list, - // "EITTransactionTBLModel": list, + "EITTransactionTBL": list, + "EITTransactionTBLModel": list, }; postParams.addAll(AppState().postParamsJson); - print("postParams:$postParams"); - postParams["EITTransactionTBL"] = list; - postParams["EITTransactionTBLModel"] = list; return await ApiClient().postJsonForObject((json) { GenericResponseModel responseData = GenericResponseModel.fromJson(json); return responseData.submitEITTransactionList!; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); diff --git a/lib/api/profile_api_client.dart b/lib/api/profile_api_client.dart index cc74655..b332499 100644 --- a/lib/api/profile_api_client.dart +++ b/lib/api/profile_api_client.dart @@ -21,6 +21,9 @@ import 'package:mohem_flutter_app/models/profile/submit_basic_details_transactio import 'package:mohem_flutter_app/models/profile/submit_contact_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/profile/submit_phone_transactions.dart'; import 'package:mohem_flutter_app/models/start_phone_approval_process_model.dart'; +import 'package:mohem_flutter_app/models/profile/submit_contact_transaction_list_model.dart'; +import 'package:mohem_flutter_app/models/profile/submit_phone_transactions.dart'; +import 'package:mohem_flutter_app/models/start_eit_approval_process_model.dart'; import 'package:mohem_flutter_app/api/api_client.dart'; class ProfileApiClient { diff --git a/lib/api/vacation_rule_api_client.dart b/lib/api/vacation_rule_api_client.dart new file mode 100644 index 0000000..d144174 --- /dev/null +++ b/lib/api/vacation_rule_api_client.dart @@ -0,0 +1,78 @@ +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/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/vacation_rule/get_item_type_notifications_list_model.dart'; +import 'package:mohem_flutter_app/models/vacation_rule/get_notification_reassign_mode_list_model.dart'; +import 'package:mohem_flutter_app/models/vacation_rule/get_vacation_rules_list_model.dart'; +import 'package:mohem_flutter_app/models/vacation_rule/respond_attributes_list_model.dart'; +import 'package:mohem_flutter_app/models/vacation_rule/vr_item_types_list_model.dart'; +import 'package:mohem_flutter_app/models/vacation_rule/wf_look_up_list_model.dart'; + +class VacationRuleApiClient { + static final VacationRuleApiClient _instance = VacationRuleApiClient._internal(); + + VacationRuleApiClient._internal(); + + factory VacationRuleApiClient() => _instance; + + Future> getVacationRules() async { + String url = "${ApiConsts.erpRest}GET_VACATION_RULES"; + Map postParams = {"P_PAGE_LIMIT": 50, "P_PAGE_NUM": 1}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getVacationRulesList ?? []; + }, url, postParams); + } + + Future> getVrItemTypes() async { + String url = "${ApiConsts.erpRest}GET_VR_ITEM_TYPES"; + Map postParams = {}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.vrItemTypesList ?? []; + }, url, postParams); + } + + Future> getItemTypeNotifications(String pItemType) async { + String url = "${ApiConsts.erpRest}GET_ITEM_TYPE_NOTIFICATIONS"; + Map postParams = {"P_ITEM_TYPE": pItemType}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getItemTypeNotificationsList ?? []; + }, url, postParams); + } + + Future> getNotificationReassignMode() async { + String url = "${ApiConsts.erpRest}GET_NOTIFICATION_REASSIGN_MODE"; + Map postParams = {}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getNotificationReassignModeList ?? []; + }, url, postParams); + } + + Future> getRespondAttributes(String pItemType, String pNotificationName) async { + String url = "${ApiConsts.erpRest}GET_RESPOND_ATTRIBUTES"; + Map postParams = {"P_ITEM_TYPE": pItemType, "P_NOTIFICATION_NAME": pNotificationName}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.respondAttributesList ?? []; + }, url, postParams); + } + + Future> getWfLookup(String pLookupType) async { + String url = "${ApiConsts.erpRest}GET_WF_LOOKUP"; + Map postParams = {"P_LOOKUP_TYPE": pLookupType}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.wFLookUpList ?? []; + }, url, postParams); + } +} diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 89f8435..9285671 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:mohem_flutter_app/ui/attendance/monthly_attendance.dart'; +import 'package:mohem_flutter_app/ui/attendance/add_vacation_rule_screen.dart'; +import 'package:mohem_flutter_app/ui/attendance/monthly_attendance_screen.dart'; +import 'package:mohem_flutter_app/ui/attendance/vacation_rule_screen.dart'; import 'package:mohem_flutter_app/ui/bottom_sheets/attendence_details_bottom_sheet.dart'; import 'package:mohem_flutter_app/ui/landing/dashboard_screen.dart'; import 'package:mohem_flutter_app/ui/landing/today_attendance_screen.dart'; @@ -13,6 +15,7 @@ import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_input 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/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'; import 'package:mohem_flutter_app/ui/profile/contact_details.dart'; import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_address_screen.dart'; @@ -22,10 +25,6 @@ import 'package:mohem_flutter_app/ui/profile/personal_info.dart'; import 'package:mohem_flutter_app/ui/screens/announcements/announcement_details.dart'; import 'package:mohem_flutter_app/ui/screens/announcements/announcements.dart'; import 'package:mohem_flutter_app/ui/profile/delete_family_member.dart'; -import 'package:mohem_flutter_app/ui/profile/family_members.dart'; -import 'package:mohem_flutter_app/ui/profile/personal_info.dart'; -import 'package:mohem_flutter_app/ui/profile/add_update_family_member.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/mowadhafhi/mowadhafhi_home.dart'; @@ -74,6 +73,8 @@ class AppRoutes { //Attendance static const String attendance = "/attendance"; static const String monthlyAttendance = "/monthlyAttendance"; + static const String vacationRule = "/vacationRule"; + static const String addVacationRule = "/addVacationRule"; //Bottom Sheet static const String attendanceDetailsBottomSheet = "/attendanceDetailsBottomSheet"; @@ -128,7 +129,9 @@ class AppRoutes { // addWorkFromHome: (context) => AddWorkFromHomeScreen(), profile: (context) => ProfileScreen(), //Attendance - monthlyAttendance: (context) => MonthlyAttendance(), + monthlyAttendance: (context) => MonthlyAttendanceScreen(), + vacationRule: (context) => VacationRuleScreen(), + addVacationRule: (context) => AddVacationRuleScreen(), //Bottom Sheet attendanceDetailsBottomSheet: (context) => AttendenceDetailsBottomSheet(), diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index 36d523a..bbe50b4 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -11,6 +11,8 @@ extension WidgetExtensions on Widget { Widget get center => Center(child: this); + Widget circle(double _value) => ClipRRect(borderRadius: BorderRadius.circular(_value), child: this); + Widget paddingAll(double _value) => Padding(padding: EdgeInsets.all(_value), child: this); Widget paddingOnly({double left = 0.0, double right = 0.0, double top = 0.0, double bottom = 0.0}) => diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 3a794ab..2fa8d35 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -46,6 +46,7 @@ class CodegenLoader extends AssetLoader{ "services": "خدمات", "viewAllServices": "عرض جميع الخدمات", "monthlyAttendance": "الحضور الشهري", + "vacationRule": "حكم اجازة", "workFromHome": "العمل من المنزل", "ticketRequest": "طلب تذكرة", "viewAllOffers": "مشاهدة جميع العروض", @@ -57,7 +58,7 @@ class CodegenLoader extends AssetLoader{ "confirmPassword": "تأكيد كلمة المرور", "update": "تحديث", "title": "عنوان", - "home": "مسكن", + "home": "الرئيسية", "mySalary": "راتبي", "createRequest": "إنشاء طلب", "forgotPassword": "هل نسيت كلمة السر", @@ -279,6 +280,54 @@ class CodegenLoader extends AssetLoader{ "totalPayAmount": "المبلغ الإجمالي للدفع", "paymentInformation": "معلومات الدفع", "amount": "مقدار", + "correctCurrentDatails": "تعديل او اكمال التفاصيل الحالية", + "selectType": " حدد نوع التغيير الذي تريد القيام به", + "enterNewInfo": " أدخل معلومات جديدة بسبب تغيير حقيقي في التفاصيل الحالية (على سبيل المثال بسبب تغيير في الحالة الاجتماعية", + "endDate": "تاريخ الانتهاء", + "removeThisMember": "هل انت متأكد تريد ازالة هذا العضو؟", + "updateThisMember ": "هل انت متأكد تريد تحديث بيانات هذا العضو؟", + "addNewFamilyMember": "اضافة عضو جديد", + "addRow": "اضافة صف جديد", + "pleaseSelect": "الرجاء اختيار", + "delete": "حذف", + "edit": "تعديل", + "add": "اضافه", + "myProfile": "معلوماتي", + "mowadhafhi": "موظفي", + "searchAnnouncements": "بحث الاعلانات", + "announcements": "اعلانات", + "swipeRequest": "طلب تسجيل حضور", + "serviceType": "نوع الخدمه", + "departmentName": "اسم القسم", + "selectDepartment": "اختر القسم", + "relatedSection": "قسم ذو صله", + "selectSection": "اختيار القسم", + "relatedTopic": "عنوان ذو صله", + "selectTopic": "اختر العنوان", + "supportingDocument": "ارفاق مستند", + "mowadhafhiRequest": "طلب موظفي", + "ticketReference": "مرجع التذكره", + "section": "القسم", + "topic": "العنوان", + "actionBy": "الرد بواسطة", + "pending": "معلق", + "pendingTransactions": "المعاملات المعلقه", + "selectRequestType": "الرجاء اختيار نوع الطلب", + "dateFrom": "من تاريخ", + "dateTo": "الى تاريخ", + "requestName": "اسم الطلب", + "createdFor": "انشاء لأجل", + "requestCreatedSuccessfully": "تم انشاء الطلب بنجاح", + "search": "بحث", + "wantToReject": "هل انت متأكد تريد الرفض", + "requestType": "نوع الطلب", + "employeeDigitalID": "هويةالموظف الرقمية", + "businessCard": "بطاقة العمل", + "checkOut": "وقت الخروج", + "regular": "منتظم", + "mark": "علامة", + "selectMethodOfAttendance": "اختر طريقة تسجيل الحضور", + "comeNearHMGWifi": "HMG wifi من فضلك اقترب من", "profile": { "reset_password": { "label": "Reset Password", @@ -345,6 +394,7 @@ static const Map en_US = { "services": "Services", "viewAllServices": "View All Services", "monthlyAttendance": "Monthly Attendance", + "vacationRule": "Vacation Rule", "workFromHome": "Work From Home", "ticketRequest": "Ticket Request", "viewAllOffers": "View All Offers", @@ -579,6 +629,53 @@ static const Map en_US = { "totalPayAmount": "Total Pay Amount", "paymentInformation": "Payment Information", "amount": "Amount", + "correctCurrentDatails": "correct or complete the current details", + "selectType": "Select the type of change you want to make", + "enterNewInfo": "Enter new Information because of a real change to the current details (e.g because of a change in marital status)", + "endDate": "*End Date", + "removeThisMember": "Are You Sure You Want to Remove this Member?", + "updateThisMember": "Are You Sure You Want to Update this Member?", + "addNewFamilyMember": "Add New Family Member", + "addRow": "Add new row", + "pleaseSelect": "Please Select *", + "delete": "delete", + "add": "Add", + "edit": "Edit", + "myProfile": "My Profile", + "mowadhafhi": "Mowadhafhi", + "searchAnnouncements": "Search Announcements", + "announcements": "Announcements", + "swipeRequest": "Swipe Request", + "serviceType": "Service Type", + "departmentName": "Department Name", + "selectDepartment": "Select Department", + "relatedSection": "Related Section", + "selectSection": "Select Section", + "relatedTopic": "Related Topic", + "selectTopic": "Select Topic", + "supportingDocument": "Supporting Document", + "mowadhafhiRequest": "Mowadhafhi Request", + "ticketReference": "Ticket Reference", + "section": "Section", + "topic": "Topic", + "actionBy": "Action By", + "pendingTransactions": "Pending Transactions", + "selectRequestType": "Please select request type", + "dateFrom": "Date From", + "dateTo": "Date To", + "requestName": "Request Name", + "createdFor": "Created For", + "requestType": "Request Type", + "requestCreatedSuccessfully": "Request created successfully", + "search": "Search", + "wantToReject": "Are you sure want to reject?", + "employeeDigitalID": "Employee Digital ID", + "businessCard": "Business Card", + "checkOut": "Check Out", + "regular": "Regular", + "mark": "Mark", + "selectMethodOfAttendance": "Select the method to mark the attendance", + "comeNearHMGWifi": "Please come near to HMG wifi", "profile": { "reset_password": { "label": "Reset Password", diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index b86e66b..eac063d 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -31,6 +31,9 @@ abstract class LocaleKeys { static const services = 'services'; static const viewAllServices = 'viewAllServices'; static const monthlyAttendance = 'monthlyAttendance'; + static const vacationRule = 'vacationRule'; + static const startDateT = 'startDateT'; + static const endDateT = 'endDateT'; static const workFromHome = 'workFromHome'; static const ticketRequest = 'ticketRequest'; static const viewAllOffers = 'viewAllOffers'; @@ -232,6 +235,7 @@ abstract class LocaleKeys { static const myAttendance = 'myAttendance'; static const workOnBreak = 'workOnBreak'; static const next = 'next'; + static const apply = 'apply'; static const mobile = 'mobile'; static const completingYear = 'completingYear'; static const year = 'year'; @@ -264,6 +268,54 @@ abstract class LocaleKeys { static const totalPayAmount = 'totalPayAmount'; static const paymentInformation = 'paymentInformation'; static const amount = 'amount'; + static const correctCurrentDatails = 'correctCurrentDatails'; + static const selectType = 'selectType'; + static const enterNewInfo = 'enterNewInfo'; + static const endDate = 'endDate'; + static const removeThisMember = 'removeThisMember'; + static const updateThisMember = 'updateThisMember '; + static const addNewFamilyMember = 'addNewFamilyMember'; + static const addRow = 'addRow'; + static const pleaseSelect = 'pleaseSelect'; + static const delete = 'delete'; + static const edit = 'edit'; + static const add = 'add'; + static const myProfile = 'myProfile'; + static const mowadhafhi = 'mowadhafhi'; + static const searchAnnouncements = 'searchAnnouncements'; + static const announcements = 'announcements'; + static const swipeRequest = 'swipeRequest'; + static const serviceType = 'serviceType'; + static const departmentName = 'departmentName'; + static const selectDepartment = 'selectDepartment'; + static const relatedSection = 'relatedSection'; + static const selectSection = 'selectSection'; + static const relatedTopic = 'relatedTopic'; + static const selectTopic = 'selectTopic'; + static const supportingDocument = 'supportingDocument'; + static const mowadhafhiRequest = 'mowadhafhiRequest'; + static const ticketReference = 'ticketReference'; + static const section = 'section'; + static const topic = 'topic'; + static const actionBy = 'actionBy'; + static const pending = 'pending'; + static const pendingTransactions = 'pendingTransactions'; + static const selectRequestType = 'selectRequestType'; + static const dateFrom = 'dateFrom'; + static const dateTo = 'dateTo'; + static const requestName = 'requestName'; + static const createdFor = 'createdFor'; + static const requestCreatedSuccessfully = 'requestCreatedSuccessfully'; + static const search = 'search'; + static const wantToReject = 'wantToReject'; + static const requestType = 'requestType'; + static const employeeDigitalID = 'employeeDigitalID'; + static const businessCard = 'businessCard'; + static const checkOut = 'checkOut'; + static const regular = 'regular'; + static const mark = 'mark'; + static const selectMethodOfAttendance = 'selectMethodOfAttendance'; + static const comeNearHMGWifi = 'comeNearHMGWifi'; static const profile_reset_password_label = 'profile.reset_password.label'; static const profile_reset_password_username = 'profile.reset_password.username'; static const profile_reset_password_password = 'profile.reset_password.password'; diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index c48f9ec..782fb7c 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -62,10 +62,17 @@ import 'package:mohem_flutter_app/models/profile/submit_address_transaction.dart import 'package:mohem_flutter_app/models/profile/get_contact_clos_structure_list.dart'; import 'package:mohem_flutter_app/models/profile/get_contact_details_list.dart'; import 'package:mohem_flutter_app/models/profile/submit_basic_details_transaction_model.dart'; +import 'package:mohem_flutter_app/models/profile/submit_contact_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/start_eit_approval_process_model.dart'; import 'package:mohem_flutter_app/models/start_phone_approval_process_model.dart'; import 'package:mohem_flutter_app/models/submit_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/subordinates_on_leaves_model.dart'; +import 'package:mohem_flutter_app/models/vacation_rule/get_item_type_notifications_list_model.dart'; +import 'package:mohem_flutter_app/models/vacation_rule/get_notification_reassign_mode_list_model.dart'; +import 'package:mohem_flutter_app/models/vacation_rule/get_vacation_rules_list_model.dart'; +import 'package:mohem_flutter_app/models/vacation_rule/respond_attributes_list_model.dart'; +import 'package:mohem_flutter_app/models/vacation_rule/vr_item_types_list_model.dart'; +import 'package:mohem_flutter_app/models/vacation_rule/wf_look_up_list_model.dart'; import 'package:mohem_flutter_app/models/validate_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart'; @@ -74,7 +81,6 @@ import 'package:mohem_flutter_app/models/worklist/hr/get_contact_notification_bo 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_response_model.dart'; -import 'package:mohem_flutter_app/models/profile/submit_contact_transaction_list_model.dart'; class GenericResponseModel { String? date; @@ -168,14 +174,14 @@ class GenericResponseModel { List? getHrCollectionNotificationBodyList; List? getHrTransactionList; GetItemCreationNtfBodyList? getItemCreationNtfBodyList; - List? getItemTypeNotificationsList; + List? getItemTypeNotificationsList; List? getItemTypesList; List? getLookupValuesList; List? getMenuEntriesList; List? getMoItemHistoryList; List? getMoNotificationBodyList; List? getNotificationButtonsList; - List? getNotificationReassignModeList; + List? getNotificationReassignModeList; List? getObjectValuesList; GetOpenMissingSwipesList? getOpenMissingSwipesList; List? getOpenNotificationsList; @@ -222,7 +228,7 @@ class GenericResponseModel { List? getPendingTransactionsFunctions; List? getPendingTransactionsDetails; List? getUserItemTypesList; - List? getVacationRulesList; + List? getVacationRulesList; List? getVaccinationOnHandList; List? getVaccinationsList; List? getValueSetValuesList; @@ -287,7 +293,7 @@ class GenericResponseModel { String? processTransactions; String? registerUserNameList; List? replacementList; - String? respondAttributesList; + List? respondAttributesList; String? respondRolesList; String? resubmitAbsenceTransactionList; String? resubmitEITTransactionList; @@ -330,8 +336,8 @@ class GenericResponseModel { String? validateAbsenceTransactionList; ValidateEITTransactionList? validateEITTransactionList; String? validatePhonesTransactionList; - String? vrItemTypesList; - String? wFLookUpList; + List? vrItemTypesList; + List? wFLookUpList; String? eLearningGETEMPLOYEEPROFILEList; String? eLearningLOGINList; String? eLearningValidateLoginList; @@ -828,7 +834,13 @@ class GenericResponseModel { getItemCreationNtfBodyList = json['GetItemCreationNtfBodyList'] != null ? new GetItemCreationNtfBodyList.fromJson(json['GetItemCreationNtfBodyList']) : null; - getItemTypeNotificationsList = json['GetItemTypeNotificationsList']; + if (json['GetItemTypeNotificationsList'] != null) { + getItemTypeNotificationsList = []; + json['GetItemTypeNotificationsList'].forEach((v) { + getItemTypeNotificationsList!.add(new GetItemTypeNotificationsList.fromJson(v)); + }); + } + getItemTypesList = json['GetItemTypesList']; getLookupValuesList = json['GetLookupValuesList']; getMenuEntriesList = json["GetMenuEntriesList"] == null ? null : List.from(json["GetMenuEntriesList"].map((x) => GetMenuEntriesList.fromJson(x))); @@ -849,14 +861,21 @@ class GenericResponseModel { if (json['GetNotificationButtonsList'] != null) { getNotificationButtonsList = []; json['GetNotificationButtonsList'].forEach((v) { - getNotificationButtonsList!.add(new GetNotificationButtonsList.fromJson(v)); + getNotificationButtonsList!.add(GetNotificationButtonsList.fromJson(v)); + }); + } + + if (json['GetNotificationReassignModeList'] != null) { + getNotificationReassignModeList = []; + json['GetNotificationReassignModeList'].forEach((v) { + getNotificationReassignModeList!.add(GetNotificationReassignModeList.fromJson(v)); }); } if (json['GetObjectValuesList'] != null) { getObjectValuesList = []; json['GetObjectValuesList'].forEach((v) { - getObjectValuesList!.add(new GetPhoneNumberTypesModel.fromJson(v)); + getObjectValuesList!.add(GetPhoneNumberTypesModel.fromJson(v)); }); } @@ -1023,7 +1042,12 @@ class GenericResponseModel { } getUserItemTypesList = json['GetUserItemTypesList']; - getVacationRulesList = json['GetVacationRulesList']; + if (json['GetVacationRulesList'] != null) { + getVacationRulesList = []; + json['GetVacationRulesList'].forEach((v) { + getVacationRulesList!.add(GetVacationRulesList.fromJson(v)); + }); + } getVaccinationOnHandList = json['GetVaccinationOnHandList']; getVaccinationsList = json['GetVaccinationsList']; @@ -1132,7 +1156,13 @@ class GenericResponseModel { processTransactions = json['ProcessTransactions']; registerUserNameList = json['RegisterUserNameList']; replacementList = json["ReplacementList"] == null ? null : List.from(json["ReplacementList"].map((x) => ReplacementList.fromJson(x))); - respondAttributesList = json['RespondAttributesList']; + + if (json['RespondAttributesList'] != null) { + respondAttributesList = []; + json['RespondAttributesList'].forEach((v) { + respondAttributesList!.add(new RespondAttributesList.fromJson(v)); + }); + } respondRolesList = json['RespondRolesList']; resubmitAbsenceTransactionList = json['ResubmitAbsenceTransactionList']; resubmitEITTransactionList = json['ResubmitEITTransactionList']; @@ -1190,8 +1220,18 @@ class GenericResponseModel { validateEITTransactionList = json['ValidateEITTransactionList'] != null ? new ValidateEITTransactionList.fromJson(json['ValidateEITTransactionList']) : null; validatePhonesTransactionList = json['ValidatePhonesTransactionList']; - vrItemTypesList = json['VrItemTypesList']; - wFLookUpList = json['WFLookUpList']; + if (json['VrItemTypesList'] != null) { + vrItemTypesList = []; + json['VrItemTypesList'].forEach((v) { + vrItemTypesList!.add(VrItemTypesList.fromJson(v)); + }); + } + if (json['WFLookUpList'] != null) { + wFLookUpList = []; + json['WFLookUpList'].forEach((v) { + wFLookUpList!.add(new WFLookUpList.fromJson(v)); + }); + } eLearningGETEMPLOYEEPROFILEList = json['eLearning_GET_EMPLOYEE_PROFILEList']; eLearningLOGINList = json['eLearning_LOGINList']; eLearningValidateLoginList = json['eLearning_ValidateLoginList']; @@ -1355,7 +1395,10 @@ class GenericResponseModel { data['GetItemCreationNtfBodyList'] = this.getItemCreationNtfBodyList!.toJson(); } - data['GetItemTypeNotificationsList'] = this.getItemTypeNotificationsList; + if (this.getItemTypeNotificationsList != null) { + data['GetItemTypeNotificationsList'] = this.getItemTypeNotificationsList!.map((v) => v.toJson()).toList(); + } + data['GetItemTypesList'] = this.getItemTypesList; data['GetLookupValuesList'] = this.getLookupValuesList; data['GetMenuEntriesList'] = this.getMenuEntriesList; @@ -1371,7 +1414,10 @@ class GenericResponseModel { data['GetNotificationButtonsList'] = this.getNotificationButtonsList!.map((v) => v.toJson()).toList(); } - data['GetNotificationReassignModeList'] = this.getNotificationReassignModeList; + if (getNotificationReassignModeList != null) { + data['GetNotificationReassignModeList'] = getNotificationReassignModeList!.map((v) => v.toJson()).toList(); + } + data['GetObjectValuesList'] = this.getObjectValuesList; data['GetOpenMissingSwipesList'] = this.getOpenMissingSwipesList; data['GetOpenNotificationsList'] = this.getOpenNotificationsList; @@ -1437,7 +1483,9 @@ class GenericResponseModel { data['GetTimeCardSummaryList'] = this.getTimeCardSummaryList!.map((v) => v.toJson()).toList(); } data['GetUserItemTypesList'] = this.getUserItemTypesList; - data['GetVacationRulesList'] = this.getVacationRulesList; + if (this.getVacationRulesList != null) { + data['GetVacationRulesList'] = this.getVacationRulesList!.map((v) => v.toJson()).toList(); + } data['GetVaccinationOnHandList'] = this.getVaccinationOnHandList; data['GetVaccinationsList'] = this.getVaccinationsList; if (getValueSetValuesList != null) { @@ -1522,7 +1570,10 @@ class GenericResponseModel { data['ProcessTransactions'] = this.processTransactions; data['RegisterUserNameList'] = this.registerUserNameList; data['ReplacementList'] = this.replacementList; - data['RespondAttributesList'] = this.respondAttributesList; + + if (respondAttributesList != null) { + data['RespondAttributesList'] = respondAttributesList!.map((v) => v.toJson()).toList(); + } data['RespondRolesList'] = this.respondRolesList; data['ResubmitAbsenceTransactionList'] = this.resubmitAbsenceTransactionList; data['ResubmitEITTransactionList'] = this.resubmitEITTransactionList; @@ -1582,13 +1633,16 @@ class GenericResponseModel { data['VHR_IsVerificationCodeValid'] = this.vHRIsVerificationCodeValid; data['ValidateAbsenceTransactionList'] = this.validateAbsenceTransactionList; - if (this.validateEITTransactionList != null) { - data['ValidateEITTransactionList'] = this.validateEITTransactionList!.toJson(); + if (validateEITTransactionList != null) { + data['ValidateEITTransactionList'] = validateEITTransactionList!.toJson(); } - data['ValidatePhonesTransactionList'] = this.validatePhonesTransactionList; - data['VrItemTypesList'] = this.vrItemTypesList; - data['WFLookUpList'] = this.wFLookUpList; + if (vrItemTypesList != null) { + data['VrItemTypesList'] = vrItemTypesList!.map((v) => v.toJson()).toList(); + } + if (wFLookUpList != null) { + data['WFLookUpList'] = wFLookUpList!.map((v) => v.toJson()).toList(); + } data['eLearning_GET_EMPLOYEE_PROFILEList'] = this.eLearningGETEMPLOYEEPROFILEList; data['eLearning_LOGINList'] = this.eLearningLOGINList; data['eLearning_ValidateLoginList'] = this.eLearningValidateLoginList; diff --git a/lib/models/payslip/get_deductions_list.dart b/lib/models/payslip/get_deductions_list.dart new file mode 100644 index 0000000..7a99447 --- /dev/null +++ b/lib/models/payslip/get_deductions_list.dart @@ -0,0 +1,36 @@ +class GetDeductionsList { + int? aMOUNT; + String? eLEMENTNAME; + int? fROMROWNUM; + int? nOOFROWS; + int? rOWNUM; + int? tOROWNUM; + + GetDeductionsList( + {this.aMOUNT, + this.eLEMENTNAME, + this.fROMROWNUM, + this.nOOFROWS, + this.rOWNUM, + this.tOROWNUM}); + + GetDeductionsList.fromJson(Map json) { + aMOUNT = json['AMOUNT']; + eLEMENTNAME = json['ELEMENT_NAME']; + fROMROWNUM = json['FROM_ROW_NUM']; + nOOFROWS = json['NO_OF_ROWS']; + rOWNUM = json['ROW_NUM']; + tOROWNUM = json['TO_ROW_NUM']; + } + + Map toJson() { + final Map data = new Map(); + data['AMOUNT'] = this.aMOUNT; + data['ELEMENT_NAME'] = this.eLEMENTNAME; + data['FROM_ROW_NUM'] = this.fROMROWNUM; + data['NO_OF_ROWS'] = this.nOOFROWS; + data['ROW_NUM'] = this.rOWNUM; + data['TO_ROW_NUM'] = this.tOROWNUM; + return data; + } +} \ No newline at end of file diff --git a/lib/models/payslip/get_earnings_list.dart b/lib/models/payslip/get_earnings_list.dart new file mode 100644 index 0000000..272dab3 --- /dev/null +++ b/lib/models/payslip/get_earnings_list.dart @@ -0,0 +1,37 @@ + +class GetEarningsList { + int? aMOUNT; + String? eLEMENTNAME; + int? fROMROWNUM; + int? nOOFROWS; + int? rOWNUM; + int? tOROWNUM; + + GetEarningsList( + {this.aMOUNT, + this.eLEMENTNAME, + this.fROMROWNUM, + this.nOOFROWS, + this.rOWNUM, + this.tOROWNUM}); + + GetEarningsList.fromJson(Map json) { + aMOUNT = json['AMOUNT']; + eLEMENTNAME = json['ELEMENT_NAME']; + fROMROWNUM = json['FROM_ROW_NUM']; + nOOFROWS = json['NO_OF_ROWS']; + rOWNUM = json['ROW_NUM']; + tOROWNUM = json['TO_ROW_NUM']; + } + + Map toJson() { + final Map data = new Map(); + data['AMOUNT'] = this.aMOUNT; + data['ELEMENT_NAME'] = this.eLEMENTNAME; + data['FROM_ROW_NUM'] = this.fROMROWNUM; + data['NO_OF_ROWS'] = this.nOOFROWS; + data['ROW_NUM'] = this.rOWNUM; + data['TO_ROW_NUM'] = this.tOROWNUM; + return data; + } +} \ No newline at end of file diff --git a/lib/models/payslip/get_payment_information.dart b/lib/models/payslip/get_payment_information.dart new file mode 100644 index 0000000..277b409 --- /dev/null +++ b/lib/models/payslip/get_payment_information.dart @@ -0,0 +1,33 @@ + +class GetPaymentInformationList { + String? aCCOUNTNUMBER; + String? aMOUNT; + String? bANKNAME; + String? bRANCHNAME; + String? pAYMENTMETHODNAME; + + GetPaymentInformationList( + {this.aCCOUNTNUMBER, + this.aMOUNT, + this.bANKNAME, + this.bRANCHNAME, + this.pAYMENTMETHODNAME}); + + GetPaymentInformationList.fromJson(Map json) { + aCCOUNTNUMBER = json['ACCOUNT_NUMBER']; + aMOUNT = json['AMOUNT']; + bANKNAME = json['BANK_NAME']; + bRANCHNAME = json['BRANCH_NAME']; + pAYMENTMETHODNAME = json['PAYMENT_METHOD_NAME']; + } + + Map toJson() { + final Map data = new Map(); + data['ACCOUNT_NUMBER'] = this.aCCOUNTNUMBER; + data['AMOUNT'] = this.aMOUNT; + data['BANK_NAME'] = this.bANKNAME; + data['BRANCH_NAME'] = this.bRANCHNAME; + data['PAYMENT_METHOD_NAME'] = this.pAYMENTMETHODNAME; + return data; + } +} \ No newline at end of file diff --git a/lib/models/payslip/get_payslip.dart b/lib/models/payslip/get_payslip.dart new file mode 100644 index 0000000..2bb8280 --- /dev/null +++ b/lib/models/payslip/get_payslip.dart @@ -0,0 +1,38 @@ + + +class GetPayslipList { + int? aCTIONCONTEXTID; + String? pAYMENTDATE; + String? pAYSLIPCHOICE; + String? pERIODENDDATE; + String? pERIODNAME; + String? pERIODSTARTDATE; + + GetPayslipList( + {this.aCTIONCONTEXTID, + this.pAYMENTDATE, + this.pAYSLIPCHOICE, + this.pERIODENDDATE, + this.pERIODNAME, + this.pERIODSTARTDATE}); + + GetPayslipList.fromJson(Map json) { + aCTIONCONTEXTID = json['ACTION_CONTEXT_ID']; + pAYMENTDATE = json['PAYMENT_DATE']; + pAYSLIPCHOICE = json['PAYSLIP_CHOICE']; + pERIODENDDATE = json['PERIOD_END_DATE']; + pERIODNAME = json['PERIOD_NAME']; + pERIODSTARTDATE = json['PERIOD_START_DATE']; + } + + Map toJson() { + final Map data = new Map(); + data['ACTION_CONTEXT_ID'] = this.aCTIONCONTEXTID; + data['PAYMENT_DATE'] = this.pAYMENTDATE; + data['PAYSLIP_CHOICE'] = this.pAYSLIPCHOICE; + data['PERIOD_END_DATE'] = this.pERIODENDDATE; + data['PERIOD_NAME'] = this.pERIODNAME; + data['PERIOD_START_DATE'] = this.pERIODSTARTDATE; + return data; + } +} \ No newline at end of file diff --git a/lib/models/payslip/get_summary_of_payment.dart b/lib/models/payslip/get_summary_of_payment.dart new file mode 100644 index 0000000..abf3dc4 --- /dev/null +++ b/lib/models/payslip/get_summary_of_payment.dart @@ -0,0 +1,38 @@ + + +class GetSummaryOfPaymentList { + int? tOTALDEDUCTIONSAMOUNT; + int? tOTALDEDUCTIONSPERCENTAGE; + int? tOTALEARNINGSAMOUNT; + int? tOTALEARNINGSPERCENTAGE; + int? tOTALPAYAMOUNT; + int? tOTALPAYPERCENTAGE; + + GetSummaryOfPaymentList( + {this.tOTALDEDUCTIONSAMOUNT, + this.tOTALDEDUCTIONSPERCENTAGE, + this.tOTALEARNINGSAMOUNT, + this.tOTALEARNINGSPERCENTAGE, + this.tOTALPAYAMOUNT, + this.tOTALPAYPERCENTAGE}); + + GetSummaryOfPaymentList.fromJson(Map json) { + tOTALDEDUCTIONSAMOUNT = json['TOTAL_DEDUCTIONS_AMOUNT']; + tOTALDEDUCTIONSPERCENTAGE = json['TOTAL_DEDUCTIONS_PERCENTAGE']; + tOTALEARNINGSAMOUNT = json['TOTAL_EARNINGS_AMOUNT']; + tOTALEARNINGSPERCENTAGE = json['TOTAL_EARNINGS_PERCENTAGE']; + tOTALPAYAMOUNT = json['TOTAL_PAY_AMOUNT']; + tOTALPAYPERCENTAGE = json['TOTAL_PAY_PERCENTAGE']; + } + + Map toJson() { + final Map data = new Map(); + data['TOTAL_DEDUCTIONS_AMOUNT'] = this.tOTALDEDUCTIONSAMOUNT; + data['TOTAL_DEDUCTIONS_PERCENTAGE'] = this.tOTALDEDUCTIONSPERCENTAGE; + data['TOTAL_EARNINGS_AMOUNT'] = this.tOTALEARNINGSAMOUNT; + data['TOTAL_EARNINGS_PERCENTAGE'] = this.tOTALEARNINGSPERCENTAGE; + data['TOTAL_PAY_AMOUNT'] = this.tOTALPAYAMOUNT; + data['TOTAL_PAY_PERCENTAGE'] = this.tOTALPAYPERCENTAGE; + return data; + } +} \ No newline at end of file diff --git a/lib/models/post_params_model.dart b/lib/models/post_params_model.dart index 0bb48d0..7e62257 100644 --- a/lib/models/post_params_model.dart +++ b/lib/models/post_params_model.dart @@ -37,7 +37,7 @@ class PostParamsModel { languageID = json['LanguageID']; mobileType = json['MobileType']; logInTokenID = json['LogInTokenID']; - payrollCodeStr = json['payrollCodeStr']; + payrollCodeStr = json['PayrollCodeStr']; pLegislationCode = json['LegislationCodeStr']; tokenID = json['TokenID']; } @@ -49,7 +49,7 @@ class PostParamsModel { data['LanguageID'] = this.languageID; data['MobileType'] = this.mobileType; data['LogInTokenID'] = this.logInTokenID; - data['payrollCodeStr'] = this.payrollCodeStr; + data['PayrollCodeStr'] = this.payrollCodeStr; data['LegislationCodeStr'] = this.pLegislationCode; data['TokenID'] = this.tokenID; return data; @@ -67,7 +67,7 @@ class PostParamsModel { data['UserName'] = this.userName; data['P_EMAIL_ADDRESS'] = this.pEmailAddress; data['P_SESSION_ID'] = this.pSessionId; - data['payrollCodeStr'] = this.payrollCodeStr; + data['PayrollCodeStr'] = this.payrollCodeStr; data['LegislationCodeStr'] = this.pLegislationCode; data['P_SELECTED_EMPLOYEE_NUMBER'] = this.pSelectedEmployeeNumber; data['P_USER_NAME'] = this.pUserName; diff --git a/lib/models/vacation_rule/get_item_type_notifications_list_model.dart b/lib/models/vacation_rule/get_item_type_notifications_list_model.dart new file mode 100644 index 0000000..4d80a0e --- /dev/null +++ b/lib/models/vacation_rule/get_item_type_notifications_list_model.dart @@ -0,0 +1,28 @@ +class GetItemTypeNotificationsList { + String? fYIFLAG; + String? nOTIFICATIONDISPLAYNAME; + String? nOTIFICATIONNAME; + String? nOTIFICATIONSUBJECT; + + GetItemTypeNotificationsList( + {this.fYIFLAG, + this.nOTIFICATIONDISPLAYNAME, + this.nOTIFICATIONNAME, + this.nOTIFICATIONSUBJECT}); + + GetItemTypeNotificationsList.fromJson(Map json) { + fYIFLAG = json['FYI_FLAG']; + nOTIFICATIONDISPLAYNAME = json['NOTIFICATION_DISPLAY_NAME']; + nOTIFICATIONNAME = json['NOTIFICATION_NAME']; + nOTIFICATIONSUBJECT = json['NOTIFICATION_SUBJECT']; + } + + Map toJson() { + final Map data = new Map(); + data['FYI_FLAG'] = this.fYIFLAG; + data['NOTIFICATION_DISPLAY_NAME'] = this.nOTIFICATIONDISPLAYNAME; + data['NOTIFICATION_NAME'] = this.nOTIFICATIONNAME; + data['NOTIFICATION_SUBJECT'] = this.nOTIFICATIONSUBJECT; + return data; + } +} \ No newline at end of file diff --git a/lib/models/vacation_rule/get_notification_reassign_mode_list_model.dart b/lib/models/vacation_rule/get_notification_reassign_mode_list_model.dart new file mode 100644 index 0000000..e3495d0 --- /dev/null +++ b/lib/models/vacation_rule/get_notification_reassign_mode_list_model.dart @@ -0,0 +1,22 @@ +class GetNotificationReassignModeList { + String? rADIOBUTTONACTION; + String? rADIOBUTTONLABEL; + int? rADIOBUTTONSEQ; + + GetNotificationReassignModeList( + {this.rADIOBUTTONACTION, this.rADIOBUTTONLABEL, this.rADIOBUTTONSEQ}); + + GetNotificationReassignModeList.fromJson(Map json) { + rADIOBUTTONACTION = json['RADIO_BUTTON_ACTION']; + rADIOBUTTONLABEL = json['RADIO_BUTTON_LABEL']; + rADIOBUTTONSEQ = json['RADIO_BUTTON_SEQ']; + } + + Map toJson() { + final Map data = new Map(); + data['RADIO_BUTTON_ACTION'] = this.rADIOBUTTONACTION; + data['RADIO_BUTTON_LABEL'] = this.rADIOBUTTONLABEL; + data['RADIO_BUTTON_SEQ'] = this.rADIOBUTTONSEQ; + return data; + } +} \ No newline at end of file diff --git a/lib/models/vacation_rule/get_vacation_rules_list_model.dart b/lib/models/vacation_rule/get_vacation_rules_list_model.dart new file mode 100644 index 0000000..5abd32a --- /dev/null +++ b/lib/models/vacation_rule/get_vacation_rules_list_model.dart @@ -0,0 +1,92 @@ +class GetVacationRulesList { + String? aCTION; + String? aCTIONDISPLAY; + String? bEGINDATE; + String? eNDDATE; + int? fROMROWNUM; + String? fYIFLAG; + String? iTEMTYPE; + String? iTEMTYPEDISPLAYNAME; + String? mESSAGE; + String? nOTIFICATIONDISPLAYNAME; + String? nOTIFICATIONNAME; + String? nOTIFICATIONSUBJECT; + int? nOOFROWS; + String? rEPLACEMENTUSERNAME; + int? rOWNUM; + int? rULEID; + String? rULENAME; + String? rULESTATUS; + String? rULETIPMESSAGE; + int? tOROWNUM; + + GetVacationRulesList( + {this.aCTION, + this.aCTIONDISPLAY, + this.bEGINDATE, + this.eNDDATE, + this.fROMROWNUM, + this.fYIFLAG, + this.iTEMTYPE, + this.iTEMTYPEDISPLAYNAME, + this.mESSAGE, + this.nOTIFICATIONDISPLAYNAME, + this.nOTIFICATIONNAME, + this.nOTIFICATIONSUBJECT, + this.nOOFROWS, + this.rEPLACEMENTUSERNAME, + this.rOWNUM, + this.rULEID, + this.rULENAME, + this.rULESTATUS, + this.rULETIPMESSAGE, + this.tOROWNUM}); + + GetVacationRulesList.fromJson(Map json) { + aCTION = json['ACTION']; + aCTIONDISPLAY = json['ACTION_DISPLAY']; + bEGINDATE = json['BEGIN_DATE']; + eNDDATE = json['END_DATE']; + fROMROWNUM = json['FROM_ROW_NUM']; + fYIFLAG = json['FYI_FLAG']; + iTEMTYPE = json['ITEM_TYPE']; + iTEMTYPEDISPLAYNAME = json['ITEM_TYPE_DISPLAY_NAME']; + mESSAGE = json['MESSAGE']; + nOTIFICATIONDISPLAYNAME = json['NOTIFICATION_DISPLAY_NAME']; + nOTIFICATIONNAME = json['NOTIFICATION_NAME']; + nOTIFICATIONSUBJECT = json['NOTIFICATION_SUBJECT']; + nOOFROWS = json['NO_OF_ROWS']; + rEPLACEMENTUSERNAME = json['REPLACEMENT_USER_NAME']; + rOWNUM = json['ROW_NUM']; + rULEID = json['RULE_ID']; + rULENAME = json['RULE_NAME']; + rULESTATUS = json['RULE_STATUS']; + rULETIPMESSAGE = json['RULE_TIP_MESSAGE']; + tOROWNUM = json['TO_ROW_NUM']; + } + + Map toJson() { + final Map data = new Map(); + data['ACTION'] = this.aCTION; + data['ACTION_DISPLAY'] = this.aCTIONDISPLAY; + data['BEGIN_DATE'] = this.bEGINDATE; + data['END_DATE'] = this.eNDDATE; + data['FROM_ROW_NUM'] = this.fROMROWNUM; + data['FYI_FLAG'] = this.fYIFLAG; + data['ITEM_TYPE'] = this.iTEMTYPE; + data['ITEM_TYPE_DISPLAY_NAME'] = this.iTEMTYPEDISPLAYNAME; + data['MESSAGE'] = this.mESSAGE; + data['NOTIFICATION_DISPLAY_NAME'] = this.nOTIFICATIONDISPLAYNAME; + data['NOTIFICATION_NAME'] = this.nOTIFICATIONNAME; + data['NOTIFICATION_SUBJECT'] = this.nOTIFICATIONSUBJECT; + data['NO_OF_ROWS'] = this.nOOFROWS; + data['REPLACEMENT_USER_NAME'] = this.rEPLACEMENTUSERNAME; + data['ROW_NUM'] = this.rOWNUM; + data['RULE_ID'] = this.rULEID; + data['RULE_NAME'] = this.rULENAME; + data['RULE_STATUS'] = this.rULESTATUS; + data['RULE_TIP_MESSAGE'] = this.rULETIPMESSAGE; + data['TO_ROW_NUM'] = this.tOROWNUM; + return data; + } +} \ No newline at end of file diff --git a/lib/models/vacation_rule/respond_attributes_list_model.dart b/lib/models/vacation_rule/respond_attributes_list_model.dart new file mode 100644 index 0000000..ca7b2db --- /dev/null +++ b/lib/models/vacation_rule/respond_attributes_list_model.dart @@ -0,0 +1,28 @@ +class RespondAttributesList { + String? aTTRIBUTEDISPLAYNAME; + String? aTTRIBUTEFORMAT; + String? aTTRIBUTENAME; + String? aTTRIBUTETYPE; + + RespondAttributesList( + {this.aTTRIBUTEDISPLAYNAME, + this.aTTRIBUTEFORMAT, + this.aTTRIBUTENAME, + this.aTTRIBUTETYPE}); + + RespondAttributesList.fromJson(Map json) { + aTTRIBUTEDISPLAYNAME = json['ATTRIBUTE_DISPLAY_NAME']; + aTTRIBUTEFORMAT = json['ATTRIBUTE_FORMAT']; + aTTRIBUTENAME = json['ATTRIBUTE_NAME']; + aTTRIBUTETYPE = json['ATTRIBUTE_TYPE']; + } + + Map toJson() { + final Map data = new Map(); + data['ATTRIBUTE_DISPLAY_NAME'] = this.aTTRIBUTEDISPLAYNAME; + data['ATTRIBUTE_FORMAT'] = this.aTTRIBUTEFORMAT; + data['ATTRIBUTE_NAME'] = this.aTTRIBUTENAME; + data['ATTRIBUTE_TYPE'] = this.aTTRIBUTETYPE; + return data; + } +} \ No newline at end of file diff --git a/lib/models/vacation_rule/vr_item_types_list_model.dart b/lib/models/vacation_rule/vr_item_types_list_model.dart new file mode 100644 index 0000000..d31ffa6 --- /dev/null +++ b/lib/models/vacation_rule/vr_item_types_list_model.dart @@ -0,0 +1,18 @@ +class VrItemTypesList { + String? iTEMTYPE; + String? iTEMTYPEDISPLAYNAME; + + VrItemTypesList({this.iTEMTYPE, this.iTEMTYPEDISPLAYNAME}); + + VrItemTypesList.fromJson(Map json) { + iTEMTYPE = json['ITEM_TYPE']; + iTEMTYPEDISPLAYNAME = json['ITEM_TYPE_DISPLAY_NAME']; + } + + Map toJson() { + final Map data = new Map(); + data['ITEM_TYPE'] = this.iTEMTYPE; + data['ITEM_TYPE_DISPLAY_NAME'] = this.iTEMTYPEDISPLAYNAME; + return data; + } +} \ No newline at end of file diff --git a/lib/models/vacation_rule/wf_look_up_list_model.dart b/lib/models/vacation_rule/wf_look_up_list_model.dart new file mode 100644 index 0000000..25fb2ee --- /dev/null +++ b/lib/models/vacation_rule/wf_look_up_list_model.dart @@ -0,0 +1,21 @@ +class WFLookUpList { + String? lOOKUPCODE; + String? lOOKUPDESCRIPTION; + String? lOOKUPMEANING; + + WFLookUpList({this.lOOKUPCODE, this.lOOKUPDESCRIPTION, this.lOOKUPMEANING}); + + WFLookUpList.fromJson(Map json) { + lOOKUPCODE = json['LOOKUP_CODE']; + lOOKUPDESCRIPTION = json['LOOKUP_DESCRIPTION']; + lOOKUPMEANING = json['LOOKUP_MEANING']; + } + + Map toJson() { + final Map data = new Map(); + data['LOOKUP_CODE'] = this.lOOKUPCODE; + data['LOOKUP_DESCRIPTION'] = this.lOOKUPDESCRIPTION; + data['LOOKUP_MEANING'] = this.lOOKUPMEANING; + return data; + } +} \ No newline at end of file diff --git a/lib/provider/dashboard_provider_model.dart b/lib/provider/dashboard_provider_model.dart index a78fd67..511fc03 100644 --- a/lib/provider/dashboard_provider_model.dart +++ b/lib/provider/dashboard_provider_model.dart @@ -1,9 +1,11 @@ import 'dart:convert'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/dashboard_api_client.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/main.dart'; import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_open_notifications_list.dart'; @@ -159,7 +161,11 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { try { GenericResponseModel? genericResponseModel = await DashboardApiClient().getGetMenuEntries(); getMenuEntriesList = genericResponseModel!.getMenuEntriesList; - homeMenus = parseMenues(getMenuEntriesList ?? []); + homeMenus = parseMenus(getMenuEntriesList ?? []); + if (homeMenus!.isNotEmpty) { + homeMenus!.first.menuEntiesList.insert(0, GetMenuEntriesList(requestType: "MONTHLY_ATTENDANCE", prompt: LocaleKeys.monthlyAttendance.tr())); + homeMenus!.first.menuEntiesList.add(GetMenuEntriesList(requestType: "VACATION_RULE", prompt: LocaleKeys.vacationRule.tr())); + } isServicesMenusLoading = false; notifyListeners(); } catch (ex) { @@ -169,21 +175,13 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { } } - List parseMenues(List getMenuEntriesList) { + List parseMenus(List getMenuEntriesList) { List menus = []; for (int i = 0; i < getMenuEntriesList.length; i++) { if (getMenuEntriesList[i].parentMenuName!.isEmpty) { menus.add(Menus(getMenuEntriesList[i], getMenuEntriesList.where((element) => getMenuEntriesList[i].menuName == element.parentMenuName).toList())); } } - - // Verify Menus by printing in log - // for(int i=0;i { + List? vrItemTypesList; + List? itemTypeNotificationsList; + + List? notificationReassignModeList; + List? respondAttributesList; + List? wfLookupList; + + int currentStage = 0; + + @override + void initState() { + super.initState(); + getVacationRulesList(); + } + + void getVacationRulesList() async { + try { + Utils.showLoading(context); + vrItemTypesList = await VacationRuleApiClient().getVrItemTypes(); + Utils.hideLoading(context); + currentStage = 1; + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void getItemTypeNotificationsList() async { + try { + Utils.showLoading(context); + //itemTypeNotificationsList = await VacationRuleApiClient().getItemTypeNotifications(); + Utils.hideLoading(context); + currentStage = 2; + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void callCombineApis() async { + try { + Utils.showLoading(context); + List results = await Future.wait([ + // VacationRuleApiClient().getNotificationReassignMode(), + // VacationRuleApiClient().getRespondAttributes("", ""), + // VacationRuleApiClient().getWfLookup(P_LOOKUP_TYPE), + ]); + notificationReassignModeList = results[0]; + respondAttributesList = results[1]; + wfLookupList = results[2]; + Utils.hideLoading(context); + currentStage = 3; + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: LocaleKeys.vacationRule.tr(), + ), + body: vrItemTypesList == null + ? const SizedBox() + : (vrItemTypesList!.isEmpty + ? Utils.getNoDataWidget(context) + : Column( + children: [ + ListView( + padding: const EdgeInsets.all(21), + physics: const BouncingScrollPhysics(), + children: [], + ).expanded, + DefaultButton( + currentStage == 3 ? LocaleKeys.apply.tr() : LocaleKeys.next.tr(), + () { + if (currentStage == 1) { + getItemTypeNotificationsList(); + } else if (currentStage == 2) { + callCombineApis(); + } + }, + ).insideContainer, + ], + )), + ); + } +} diff --git a/lib/ui/attendance/monthly_attendance.dart b/lib/ui/attendance/monthly_attendance_screen.dart similarity index 88% rename from lib/ui/attendance/monthly_attendance.dart rename to lib/ui/attendance/monthly_attendance_screen.dart index de5c9c9..6a73f70 100644 --- a/lib/ui/attendance/monthly_attendance.dart +++ b/lib/ui/attendance/monthly_attendance_screen.dart @@ -4,7 +4,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/painting.dart'; import 'package:intl/intl.dart'; -import 'package:mohem_flutter_app/api/monthlyAttendance_api_client.dart'; +import 'package:mohem_flutter_app/api/monthly_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/extensions/int_extensions.dart'; @@ -19,18 +19,18 @@ import 'package:month_picker_dialog/month_picker_dialog.dart'; import 'package:pie_chart/pie_chart.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; -class MonthlyAttendance extends StatefulWidget { - MonthlyAttendance({Key? key}) : super(key: key); +class MonthlyAttendanceScreen extends StatefulWidget { + MonthlyAttendanceScreen({Key? key}) : super(key: key); @override - _MonthlyAttendanceState createState() { - return _MonthlyAttendanceState(); + _MonthlyAttendanceScreenState createState() { + return _MonthlyAttendanceScreenState(); } } // todo '@fatima' use extension methods for widgets -class _MonthlyAttendanceState extends State { +class _MonthlyAttendanceScreenState extends State { bool isPresent = false; bool isAbsent = false; bool isMissing = false; @@ -135,17 +135,17 @@ class _MonthlyAttendanceState extends State { ], ).paddingOnly(left: 21, right: 21), 18.height, - AspectRatio(aspectRatio: 333 / 270, child: calendarWidget()).paddingOnly(left: 18, right: 25), + AspectRatio(aspectRatio: 333 / 270, child: calendarWidget()).paddingOnly(left: 21, right: 21), Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - optionUI(LocaleKeys.scheduleDays.tr(), "${getTimeCardSummaryList?.sCHEDULEDAYS}"), + optionUI(LocaleKeys.scheduleDays.tr(), "${getTimeCardSummaryList?.sCHEDULEDAYS != null ? getTimeCardSummaryList!.sCHEDULEDAYS : 0}"), 6.width, - optionUI(LocaleKeys.offDays.tr(), "${getTimeCardSummaryList?.oFFDAYS}"), + optionUI(LocaleKeys.offDays.tr(), "${getTimeCardSummaryList?.oFFDAYS != null ? getTimeCardSummaryList!.oFFDAYS : 0}"), 6.width, - optionUI(LocaleKeys.nonAnalyzed.tr(), "${getTimeCardSummaryList?.uNAUTHORIZEDLEAVE}"), + optionUI(LocaleKeys.nonAnalyzed.tr(), "${getTimeCardSummaryList?.uNAUTHORIZEDLEAVE != null ? getTimeCardSummaryList!.uNAUTHORIZEDLEAVE : 0}"), 6.width, - optionUI(LocaleKeys.shortageHour.tr(), "${getTimeCardSummaryList?.sHORTAGEHRS}"), + optionUI(LocaleKeys.shortageHour.tr(), "${getTimeCardSummaryList?.sHORTAGEHRS != null ? getTimeCardSummaryList!.sHORTAGEHRS : 0}"), ], ).paddingOnly(left: 21, right: 21), 35.height, @@ -186,7 +186,7 @@ class _MonthlyAttendanceState extends State { ), Container( margin: const EdgeInsets.only(left: 5, right: 5), - child: "${LocaleKeys.present.tr()} ${getTimeCardSummaryList!.aTTENDEDDAYS}".toText16(isBold: true, color: MyColors.lightGreenColor), + child: "${LocaleKeys.present.tr()} ${getTimeCardSummaryList?.aTTENDEDDAYS}".toText16(isBold: true, color: MyColors.lightGreenColor), ), ], ).paddingOnly(left: 21, right: 23), @@ -203,7 +203,7 @@ class _MonthlyAttendanceState extends State { ), Container( margin: const EdgeInsets.only(left: 5, right: 5), - child: "${LocaleKeys.absent.tr()} ${getTimeCardSummaryList!.aBSENTDAYS}".toText16( + child: "${LocaleKeys.absent.tr()} ${getTimeCardSummaryList?.aBSENTDAYS}".toText16( isBold: true, color: MyColors.backgroundBlackColor, ), @@ -285,7 +285,9 @@ class _MonthlyAttendanceState extends State { view: CalendarView.month, showDatePickerButton: false, controller: _calendarController, + backgroundColor: Colors.white, headerHeight: 0, + viewNavigationMode: ViewNavigationMode.none, todayHighlightColor: MyColors.grey3AColor, showNavigationArrow: false, showCurrentTimeIndicator: false, @@ -302,7 +304,7 @@ class _MonthlyAttendanceState extends State { dayFormat: 'EEE', showTrailingAndLeadingDates: false, showAgenda: false, - navigationDirection: MonthNavigationDirection.horizontal, + //navigationDirection: MonthNavigationDirection.vertical, monthCellStyle: MonthCellStyle( textStyle: TextStyle( fontStyle: FontStyle.normal, @@ -318,81 +320,87 @@ class _MonthlyAttendanceState extends State { if (details.date.month == formattedDate.month && details.date.year == formattedDate.year) { int val = details.date.day; //check day is off - 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), + 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.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.greyA5Color, + ), ), - ], - ), - alignment: Alignment.center, - child: Text( - "$val", - style: const TextStyle( - fontSize: 13, - fontWeight: FontWeight.w500, - color: MyColors.white, - ), - ), - ); - } + ); + } + //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( diff --git a/lib/ui/attendance/vacation_rule_screen.dart b/lib/ui/attendance/vacation_rule_screen.dart new file mode 100644 index 0000000..a2aa5df --- /dev/null +++ b/lib/ui/attendance/vacation_rule_screen.dart @@ -0,0 +1,146 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/vacation_rule_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/vacation_rule/get_vacation_rules_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 VacationRuleScreen extends StatefulWidget { + VacationRuleScreen({Key? key}) : super(key: key); + + @override + _VacationRuleScreenState createState() { + return _VacationRuleScreenState(); + } +} + +class _VacationRuleScreenState extends State { + List? vacationRuleList; + + @override + void initState() { + super.initState(); + getVacationRulesList(); + } + + void getVacationRulesList() async { + try { + Utils.showLoading(context); + vacationRuleList = await VacationRuleApiClient().getVacationRules(); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: LocaleKeys.vacationRule.tr(), + ), + body: vacationRuleList == null + ? const SizedBox() + : (vacationRuleList!.isEmpty + ? Utils.getNoDataWidget(context) + : ListView.separated( + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.all(21), + itemBuilder: (cxt, int parentIndex) => Container( + width: double.infinity, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + clipBehavior: Clip.antiAlias, + child: Stack( + clipBehavior: Clip.antiAlias, + children: [ + Positioned( + left: -20, + top: -10, + child: Transform.rotate( + angle: 15, + child: Container( + width: 50, + height: 30, + color: getStatusColor(vacationRuleList![parentIndex].rULESTATUS!), + ), + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + ("${vacationRuleList![parentIndex].rULENAME!} | ${vacationRuleList![parentIndex].iTEMTYPEDISPLAYNAME!}").toText16(), + 4.height, + ItemDetailView(LocaleKeys.startDateT.tr(), getParsedTime(vacationRuleList![parentIndex].bEGINDATE!)), + ItemDetailView(LocaleKeys.endDateT.tr(), getParsedTime(vacationRuleList![parentIndex].eNDDATE!)), + 4.height, + vacationRuleList![parentIndex].rULESTATUS!.toText12(color: getStatusColor(vacationRuleList![parentIndex].rULESTATUS!)), + ], + ).paddingOnly(top: 16, left: 16, right: 16, bottom: 16), + ], + ), + ), + separatorBuilder: (cxt, index) => 12.height, + itemCount: vacationRuleList!.length)), + floatingActionButton: Container( + height: 54, + width: 54, + 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.addVacationRule); + }), + ); + } + + Color getStatusColor(String code) { + if (code == "SUBMIT") { + return const Color(0xff2E303A); + } else if (code == "Inactive") { + return const Color(0xffD02127); + } else if (code == "active") { + return const Color(0xff1FA269); + } else if (code == "REQUEST_INFO") { + return const Color(0xff2E303A); + } else { + return const Color(0xff2E303A); + } + } + + String getParsedTime(String time) { + DateTime date = DateFormat("mm/dd/yyyy").parse(time); + return DateFormat("d MMM yyyy").format(date); + } +} diff --git a/lib/ui/dialogs/id/business_card_dialog.dart b/lib/ui/dialogs/id/business_card_dialog.dart new file mode 100644 index 0000000..3488958 --- /dev/null +++ b/lib/ui/dialogs/id/business_card_dialog.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; + +import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; + +class BusinessCardDialog extends StatelessWidget { + @override + Widget build(BuildContext context) { + return RotatedBox( + quarterTurns: 1, + child: Container( + width: MediaQuery.of(context).size.height / 2, + color: Colors.white, + margin: EdgeInsets.all(20), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Image.asset( + "assets/images/logos/bn_cloud_soloution.jpg", + width: 80, + height: 80, + ), + 12.height, + (AppState().memberInformationList!.eMPLOYEENAME ?? "").toText20(), + ], + ), + ), + Image.memory( + Utils.getPostBytes(AppState().memberInformationList!.businessCardQR ?? ""), + width: 100, + height: 100, + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 1.height, + (AppState().memberInformationList!.pOSITIONNAME ?? "").toText12(isBold: false), + 12.height, + (AppState().memberInformationList!.eMPLOYEENUMBER ?? "").toText12(isBold: false), + 1.height, + (AppState().memberInformationList!.eMPLOYEEEMAILADDRESS ?? "").toText12(isBold: false), + 1.height, + (AppState().memberInformationList!.jOBNAME ?? "").toText12(isBold: false), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/ui/dialogs/id/employee_digital_id_dialog.dart b/lib/ui/dialogs/id/employee_digital_id_dialog.dart new file mode 100644 index 0000000..e0e1054 --- /dev/null +++ b/lib/ui/dialogs/id/employee_digital_id_dialog.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; +import 'package:qr_flutter/qr_flutter.dart'; + +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/main.dart'; + +class EmployeeDigitialIdDialog extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Image.asset("assets/images/bn_logo.png"), + Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + children: [ + Container( + width: 80, + height: 80, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.all(Radius.circular(12)), + boxShadow: [BoxShadow(color: Colors.white60, blurRadius: 10, spreadRadius: 10)], + ), + clipBehavior: Clip.antiAlias, + child: Image.memory( + Utils.getPostBytes( + AppState().memberInformationList!.eMPLOYEEIMAGE ?? "", + ), + fit: BoxFit.cover, + ), + ), + 16.width, + (AppState().memberInformationList!.eMPLOYEENUMBER ?? "").toText20(), + ], + ), + Container( + width: double.infinity, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + 12.height, + (AppState().memberInformationList!.eMPLOYEENAME ?? "").toText16(), + 4.height, + (AppState().memberInformationList!.pOSITIONNAME ?? "").toText12(isBold: false), + ], + ), + ), + Image.memory( + Utils.getPostBytes(AppState().memberInformationList!.employeeQR ?? ""), + width: 160, + height: 160, + ), + DefaultButton("Cancel", () { + Navigator.pop(context); + }) + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/ui/landing/dashboard.dart b/lib/ui/landing/dashboard.dart deleted file mode 100644 index e69de29..0000000 diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart index c125c2d..2e7e769 100644 --- a/lib/ui/landing/dashboard_screen.dart +++ b/lib/ui/landing/dashboard_screen.dart @@ -3,7 +3,9 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_countdown_timer/flutter_countdown_timer.dart'; import 'package:flutter_svg/flutter_svg.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/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; @@ -13,7 +15,6 @@ import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/ui/landing/widget/app_drawer.dart'; import 'package:mohem_flutter_app/ui/landing/widget/menus_widget.dart'; import 'package:mohem_flutter_app/ui/landing/widget/services_widget.dart'; -import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart'; import 'package:provider/provider.dart'; @@ -29,6 +30,9 @@ class DashboardScreen extends StatefulWidget { class _DashboardScreenState extends State { late DashboardProviderModel data; final GlobalKey _scaffoldState = GlobalKey(); + + int currentIndex = 0; + @override void initState() { super.initState(); @@ -59,11 +63,19 @@ class _DashboardScreenState extends State { return Row( mainAxisSize: MainAxisSize.min, children: [ - CircularAvatar( + Image.memory( + Utils.getPostBytes( + AppState().memberInformationList!.eMPLOYEEIMAGE ?? "", + ), width: 34, height: 34, - url: "https://cdn4.iconfinder.com/data/icons/professions-2-2/151/89-512.png", - ), + fit: BoxFit.cover, + ).circle(50), + // CircularAvatar( + // width: 34, + // height: 34, + // url: "https://cdn4.iconfinder.com/data/icons/professions-2-2/151/89-512.png", + // ), 8.width, SvgPicture.asset("assets/images/side_nav.svg"), ], @@ -71,18 +83,7 @@ class _DashboardScreenState extends State { _scaffoldState.currentState!.openDrawer(); }); }), - Expanded( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - //AppLogo(), - 8.width, - LocaleKeys.mohemm.tr().toText14() - ], - ), - ), + Image.asset("assets/images/logos/main_mohemm_logo.png", width: 134, height: 28).expanded, SizedBox( width: 36, height: 36, @@ -103,7 +104,6 @@ class _DashboardScreenState extends State { ), ).onPress(() async { await Navigator.pushNamed(context, AppRoutes.announcements); - }) ], ).paddingOnly(left: 21, right: 21, top: 48, bottom: 7), @@ -115,7 +115,7 @@ class _DashboardScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ LocaleKeys.goodMorning.tr().toText14(color: MyColors.grey77Color), - "Mahmoud Shrouf".toText24(isBold: true), + (AppState().memberInformationList!.eMPLOYEENAME ?? "").toText24(isBold: true), 16.height, Row( children: [ @@ -323,68 +323,74 @@ class _DashboardScreenState extends State { drawer: SafeArea( child: AppDrawer(), ), - bottomNavigationBar: BottomNavigationBar( - items: [ - BottomNavigationBarItem( - icon: Padding( - padding: const EdgeInsets.all(4.0), - child: SvgPicture.asset( + bottomNavigationBar: SizedBox( + height: 70, + child: BottomNavigationBar( + items: [ + BottomNavigationBarItem( + icon: SvgPicture.asset( "assets/icons/home.svg", - width: 20, - height: 20, - ), + color: currentIndex == 0 ? MyColors.grey3AColor : MyColors.grey98Color, + ).paddingAll(4), + label: LocaleKeys.home.tr(), ), - label: 'Home', - ), - BottomNavigationBarItem( - icon: Padding( - padding: const EdgeInsets.all(4.0), - child: SvgPicture.asset( + BottomNavigationBarItem( + icon: SvgPicture.asset( "assets/icons/create_req.svg", - width: 20, - height: 20, - ), + color: currentIndex == 1 ? MyColors.grey3AColor : MyColors.grey98Color, + ).paddingAll(4), + label: LocaleKeys.createRequest.tr(), ), - label: 'Create Request', - ), - BottomNavigationBarItem( - icon: Padding( - padding: const EdgeInsets.all(4.0), - child: SvgPicture.asset( - "assets/icons/work_list.svg", - width: 20, - height: 20, + BottomNavigationBarItem( + icon: Stack( + alignment: Alignment.centerLeft, + children: [ + SvgPicture.asset( + "assets/icons/work_list.svg", + color: currentIndex == 2 ? MyColors.grey3AColor : MyColors.grey98Color, + ).paddingAll(4), + Consumer( + builder: (cxt, data, child) { + if (data.workListCounter == 0) { + return const SizedBox(); + } + return Positioned( + right: 0, + top: 0, + child: Container( + padding: const EdgeInsets.only(left: 4, right: 4), + alignment: Alignment.center, + decoration: BoxDecoration(color: MyColors.redColor, borderRadius: BorderRadius.circular(17)), + child: data.workListCounter.toString().toText10(color: Colors.white), + ), + ); + }, + ), + ], ), + label: LocaleKeys.workList.tr(), ), - label: 'Work List', - ), - BottomNavigationBarItem( - icon: Padding( - padding: const EdgeInsets.all(4.0), - child: SvgPicture.asset( + BottomNavigationBarItem( + icon: SvgPicture.asset( "assets/icons/item_for_sale.svg", - width: 20, - height: 20, - ), + color: currentIndex == 3 ? MyColors.grey3AColor : MyColors.grey98Color, + ).paddingAll(4), + label: LocaleKeys.itemsForSale.tr(), ), - label: 'Items for Sale', - ), - ], - currentIndex: 0, - selectedLabelStyle: TextStyle( - fontSize: 8, - color: Color(0xff989898), - fontWeight: FontWeight.w600, - ), - unselectedLabelStyle: TextStyle( - fontSize: 8, - color: Color(0xff989898), - fontWeight: FontWeight.w600, + ], + currentIndex: currentIndex, + selectedLabelStyle: const TextStyle(fontSize: 10, color: MyColors.grey3AColor, fontWeight: FontWeight.w600), + unselectedLabelStyle: const TextStyle(fontSize: 10, color: MyColors.grey98Color, fontWeight: FontWeight.w600), + type: BottomNavigationBarType.fixed, + selectedItemColor: MyColors.grey3AColor, + backgroundColor: MyColors.backgroundColor, + selectedIconTheme: const IconThemeData(color: MyColors.grey3AColor, size: 28), + unselectedIconTheme: const IconThemeData(color: MyColors.grey98Color, size: 28), + onTap: (int index) { + currentIndex = index; + setState(() {}); + }, ), - type: BottomNavigationBarType.fixed, - selectedItemColor: Colors.black, - backgroundColor: Color(0xffF8F8F8), - onTap: (v) {}, ), ); } diff --git a/lib/ui/landing/today_attendance_screen.dart b/lib/ui/landing/today_attendance_screen.dart index 4b5332e..04ee4b1 100644 --- a/lib/ui/landing/today_attendance_screen.dart +++ b/lib/ui/landing/today_attendance_screen.dart @@ -1,5 +1,6 @@ import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_countdown_timer/flutter_countdown_timer.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; @@ -15,12 +16,17 @@ 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/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/widgets/circular_step_progress_bar.dart'; +import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart'; import 'package:mohem_flutter_app/widgets/location/Location.dart'; import 'package:mohem_flutter_app/widgets/nfc/nfc_reader_sheet.dart'; import 'package:nfc_manager/nfc_manager.dart'; import 'package:provider/provider.dart'; import 'package:wifi_iot/wifi_iot.dart'; +import 'package:mohem_flutter_app/widgets/qr_scanner_dialog.dart'; + + + class TodayAttendanceScreen extends StatefulWidget { TodayAttendanceScreen({Key? key}) : super(key: key); @@ -33,7 +39,7 @@ class TodayAttendanceScreen extends StatefulWidget { class _TodayAttendanceScreenState extends State { ValueNotifier result = ValueNotifier(null); late DashboardProviderModel data; - bool isNfcEnabled = true, isNfcLocationEnabled = false, isQrEnabled = false, isQrLocationEnabled = false, isWifiEnabled = false, isWifiLocationEnabled = false; + bool isNfcEnabled = false, isNfcLocationEnabled = false, isQrEnabled = false, isQrLocationEnabled = false, isWifiEnabled = false, isWifiLocationEnabled = false; @override void initState() { @@ -128,7 +134,7 @@ class _TodayAttendanceScreenState extends State { textStyle: TextStyle(color: Colors.white, fontSize: 32, letterSpacing: -1.92, fontWeight: FontWeight.bold, height: 1), ), 19.height, - "Shift Time".tr().toText12(color: MyColors.greyACColor), + LocaleKeys.shiftTime.tr().tr().toText12(color: MyColors.greyACColor), (model.attendanceTracking!.pShtName ?? "00:00:00").toString().toText22(color: Colors.white, isBold: true), ], ), @@ -156,14 +162,14 @@ class _TodayAttendanceScreenState extends State { children: [ Row( children: [ - commonStatusView("Check In", (model.attendanceTracking!.pSwipeIn) ?? "- - : - -"), + commonStatusView(LocaleKeys.checkIn.tr(), (model.attendanceTracking!.pSwipeIn) ?? "- - : - -"), commonStatusView("Check Out", (model.attendanceTracking!.pSwipeOut) ?? "- - : - -") ], ), 21.height, Row( children: [ - commonStatusView("Late In", (model.attendanceTracking!.pLateInHours) ?? "- - : - -"), + commonStatusView(LocaleKeys.lateIn.tr(), (model.attendanceTracking!.pLateInHours) ?? "- - : - -"), commonStatusView("Regular", (model.attendanceTracking!.pScheduledHours) ?? "- - : - -") ], ), @@ -179,9 +185,9 @@ class _TodayAttendanceScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - "Mark".tr().toText12(), - "Attendance".tr().toText24(), - "Select the method to mark the attendance".tr().toText12(color: Color(0xff535353)), + LocaleKeys.mark.tr().tr().toText12(), + LocaleKeys.attendance.tr().tr().toText24(), + LocaleKeys.selectMethodOfAttendance.tr().tr().toText12(color: Color(0xff535353)), 24.height, GridView( physics: const NeverScrollableScrollPhysics(), @@ -189,25 +195,39 @@ class _TodayAttendanceScreenState extends State { padding: EdgeInsets.zero, gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 1 / 1, crossAxisSpacing: 8, mainAxisSpacing: 8), children: [ - attendanceMethod("NFC", "assets/images/nfc.svg", isNfcEnabled, () { - if (isNfcLocationEnabled) { - Location.getCurrentLocation((LatLng? latlng) { - performNfcAttendance(model, lat: latlng?.latitude.toString() ?? "", lng: latlng?.longitude.toString() ?? ""); - }); - } else { - performNfcAttendance(model); - } - }), - attendanceMethod("Wifi", "assets/images/wufu.svg", isWifiEnabled, () { - if (isWifiLocationEnabled) { - Location.getCurrentLocation((LatLng? latlng) { - performWifiAttendance(model, lat: latlng?.latitude.toString() ?? "", lng: latlng?.longitude.toString() ?? ""); - }); - } else { - performWifiAttendance(model); - } - // connectWifi(); - }), + if (isNfcEnabled) + attendanceMethod("NFC", "assets/images/nfc.svg", isNfcEnabled, () { + if (isNfcLocationEnabled) { + Location.getCurrentLocation((LatLng? latlng) { + performNfcAttendance(model, lat: latlng?.latitude.toString() ?? "", lng: latlng?.longitude.toString() ?? ""); + }); + } else { + performNfcAttendance(model); + } + }), + if (isWifiEnabled) + attendanceMethod("Wifi", "assets/images/wufu.svg", isWifiEnabled, () { + if (isWifiLocationEnabled) { + + Location.getCurrentLocation((LatLng? latlng) { + performWifiAttendance(model, lat: latlng?.latitude.toString() ?? "", lng: latlng?.longitude.toString() ?? ""); + }); + } else { + performWifiAttendance(model); + } + // connectWifi(); + }), + if (isQrEnabled) + attendanceMethod("QR", "assets/images/ic_qr.svg", isQrEnabled, () async { + if (isQrLocationEnabled) { + Location.getCurrentLocation((LatLng? latlng) { + performQrCodeAttendance(model, lat: latlng?.latitude.toString() ?? "", lng: latlng?.longitude.toString() ?? ""); + }); + } else { + performQrCodeAttendance(model); + } + // performQrCodeAttendance(model); + }), ], ) ], @@ -272,6 +292,7 @@ class _TodayAttendanceScreenState extends State { } else { print("wifi not location enabled"); } + bool v = await WiFiForIoTPlugin.connect(AppState().mohemmWifiSSID ?? "", password: AppState().mohemmWifiPassword ?? "", joinOnce: true, security: NetworkSecurity.WPA, withInternet: false); if (v) { await WiFiForIoTPlugin.forceWifiUsage(true); @@ -291,7 +312,7 @@ class _TodayAttendanceScreenState extends State { }); } } else { - Utils.confirmDialog(context, "Please come near to HMG wifi"); + Utils.confirmDialog(context, LocaleKeys.comeNearHMGWifi.tr()); } } @@ -301,6 +322,29 @@ class _TodayAttendanceScreenState extends State { return v; } + Future performQrCodeAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async { + var qrCodeValue = await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => QrScannerDialog(), + ), + ); + if(qrCodeValue!=null){ + print("qrCode: " + qrCodeValue); + Utils.showLoading(context); + try { + GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 1, isGpsRequired: isQrLocationEnabled, lat: lat, long: lng, QRValue: qrCodeValue); + bool status = await model.fetchAttendanceTracking(context); + Utils.hideLoading(context); + } catch (ex) { + print(ex); + Utils.hideLoading(context); + Utils.handleException(ex, context, (msg) { + Utils.confirmDialog(context, msg); + }); + } + } + } + Widget attendanceMethod(String title, String image, bool isEnabled, VoidCallback onPress) => Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), @@ -317,7 +361,11 @@ class _TodayAttendanceScreenState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded(child: SvgPicture.asset(image)), + Expanded( + child: SvgPicture.asset( + image, + color: Colors.white, + )), title.toText17(isBold: true, color: Colors.white), ], ), diff --git a/lib/ui/landing/widget/app_drawer.dart b/lib/ui/landing/widget/app_drawer.dart index 1c8bf69..9bc9985 100644 --- a/lib/ui/landing/widget/app_drawer.dart +++ b/lib/ui/landing/widget/app_drawer.dart @@ -1,8 +1,14 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:mohem_flutter_app/config/routes.dart'; +import 'package:mohem_flutter_app/ui/dialogs/id/employee_digital_id_dialog.dart'; import 'package:mohem_flutter_app/ui/landing/widget/drawer_item.dart'; +import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart'; +import 'package:mohem_flutter_app/ui/dialogs/id/business_card_dialog.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; + class AppDrawer extends StatefulWidget { @override _AppDrawerState createState() => _AppDrawerState(); @@ -26,8 +32,9 @@ class _AppDrawerState extends State { children: [ const Divider(), InkWell( - child: const DrawerItem( - 'My Profile', + child: new DrawerItem( + //'My Profile', + LocaleKeys.myProfile.tr(), icon: Icons.person, color: Colors.grey, ), @@ -36,24 +43,48 @@ class _AppDrawerState extends State { }), const Divider(), InkWell( - child: const DrawerItem( - 'Mowadhafhi', - icon: Icons.person, - color: Colors.grey, - ), - onTap: () { - drawerNavigator(context, AppRoutes.mowadhafhi); - }), + child: DrawerItem( + // 'Mowadhafhi', + LocaleKeys.mowadhafhi.tr(), + icon: Icons.person, + color: Colors.grey, + ), + onTap: () { + drawerNavigator(context, AppRoutes.mowadhafhi); + }, + ), const Divider(), InkWell( - child: const DrawerItem( - 'Pending Transactions', - icon: Icons.person, - color: Colors.grey, - ), - onTap: () { - drawerNavigator(context, AppRoutes.pendingTransactions); - }) + child: DrawerItem( + LocaleKeys.pendingTransactions.tr(), + icon: Icons.person, + color: Colors.grey, + ), + onTap: () { + drawerNavigator(context, AppRoutes.pendingTransactions); + }, + ), + InkWell( + child: DrawerItem( + LocaleKeys.employeeDigitalID.tr(), + icon: Icons.insert_drive_file_outlined, + color: Colors.grey, + ), + onTap: () { + showMDialog(context, child: EmployeeDigitialIdDialog()); + }, + ), + Divider(), + InkWell( + child: DrawerItem( + LocaleKeys.businessCard.tr(), + icon: Icons.insert_drive_file_outlined, + color: Colors.grey, + ), + onTap: () { + showMDialog(context, child: BusinessCardDialog()); + }, + ), ], ), ) diff --git a/lib/ui/landing/widget/drawer_item.dart b/lib/ui/landing/widget/drawer_item.dart index 65c3132..4654e5b 100644 --- a/lib/ui/landing/widget/drawer_item.dart +++ b/lib/ui/landing/widget/drawer_item.dart @@ -32,7 +32,7 @@ class _DrawerItemState extends State { if (widget.assetLink == null) Icon( widget.icon, - color: widget.color ?? Colors.black87, + color: widget.color, size: 25, ), Expanded( diff --git a/lib/ui/landing/widget/services_widget.dart b/lib/ui/landing/widget/services_widget.dart index 9500ac4..e99205b 100644 --- a/lib/ui/landing/widget/services_widget.dart +++ b/lib/ui/landing/widget/services_widget.dart @@ -18,9 +18,9 @@ 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/dynamic_screens.svg", + "assets/images/monthly_attendance.svg", + "assets/images/ticket_request.svg", "assets/images/ticket_request.svg", - "assets/images/dynamic_screens.svg", "assets/images/dynamic_screens.svg", "assets/images/dynamic_screens.svg", "assets/images/dynamic_screens.svg", @@ -109,6 +109,13 @@ class ServicesWidget extends StatelessWidget { void handleOnPress(context, GetMenuEntriesList menuEntry) { var pro = Provider.of(context, listen: false); + if (menuEntry.requestType == "MONTHLY_ATTENDANCE") { + Navigator.pushNamed(context, AppRoutes.monthlyAttendance); + return; + } else if (menuEntry.requestType == "VACATION_RULE") { + Navigator.pushNamed(context, AppRoutes.vacationRule); + return; + } List menuList = pro.getMenuEntriesList?.where((element) => element.parentMenuName == menuEntry.menuName && element.menuEntryType == "FUNCTION").toList() ?? []; menuEntry.icon = ""; print(menuEntry.toJson()); diff --git a/lib/ui/misc/request_submit_screen.dart b/lib/ui/misc/request_submit_screen.dart index 0f89ed8..63874c7 100644 --- a/lib/ui/misc/request_submit_screen.dart +++ b/lib/ui/misc/request_submit_screen.dart @@ -87,7 +87,7 @@ class _RequestSubmitScreenState extends State { if (params!.approvalFlag == 'phone_numbers') { await ProfileApiClient().startPhoneApprovalProcess( - "SUBMIT", + LocaleKeys.submit.tr(), comments.text, params!.pItemId, params!.transactionId, @@ -101,7 +101,7 @@ class _RequestSubmitScreenState extends State { ); } else if (params!.approvalFlag == 'family_member') { await ProfileApiClient().getApproves( - "SUBMIT", + LocaleKeys.submit.tr(), comments.text, params!.transactionId!.toInt(), params!.pItemId.toString(), @@ -115,7 +115,7 @@ class _RequestSubmitScreenState extends State { ); } else { await MyAttendanceApiClient().startEitApprovalProcess( - "SUBMIT", + LocaleKeys.submit.tr(), comments.text, params!.pItemId, params!.transactionId, @@ -157,7 +157,7 @@ class _RequestSubmitScreenState extends State { padding: const EdgeInsets.all(21).copyWith(top: 14), physics: const BouncingScrollPhysics(), children: [ - attachmentView("Attachments"), + attachmentView(LocaleKeys.attachments.tr(),), 14.height, InputWidget( LocaleKeys.comments.tr(), @@ -247,7 +247,7 @@ class _RequestSubmitScreenState extends State { children: [ title.toText16().expanded, 6.width, - SimpleButton("Add", () async { + SimpleButton(LocaleKeys.add.tr(), () async { FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true); if (result != null) { attachmentFiles = attachmentFiles + result.paths.map((path) => File(path!)).toList(); 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 cc7c3aa..a88e041 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -7,7 +7,6 @@ import 'package:mohem_flutter_app/api/my_attendance_api_client.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/dyanmic_forms/get_set_values_request_model.dart'; @@ -63,21 +62,33 @@ class _DynamicInputScreenState extends State { String tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; if (e.fORMATTYPE == "X") { // for date format type, date format is changed - tempVar = e.eSERVICESDV?.pVALUECOLUMNNAME ?? ""; + tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; if (tempVar.isNotEmpty) { - DateTime date = DateFormat('yyyy-MM-dd').parse(tempVar); - tempVar = DateFormat('yyyy/MM/dd HH:mm:ss').format(date); + if (!tempVar.contains("/")) { + DateTime date = DateFormat('yyyy-MM-dd').parse(tempVar); + tempVar = DateFormat('yyyy/MM/dd HH:mm:ss').format(date); + } } } + // else if (e.fORMATTYPE == "N") { + // // for date format type, date format is changed + // tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; + // print("------------------------sEGMENTNAME:${e.sEGMENTNAME}"); + // print("------------------------tempVar:$tempVar"); + // if (tempVar.isNotEmpty) { + // if (!tempVar.contains("/")) { + // DateTime date = DateFormat('yyyy-MM-dd').parse(tempVar); + // tempVar = DateFormat('yyyy/MM/dd HH:mm:ss').format(date); + // } + // } + // } return ValidateEitTransactionModel(dATEVALUE: null, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: null, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: tempVar.toString()).toJson(); }).toList(); values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_ACTION", nUMBERVALUE: null, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: "NEW_ROW").toJson()); values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_EXTRA_INFO_ID", nUMBERVALUE: -1, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_OBJECT_VERSION_NUMBER", nUMBERVALUE: 0, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); - values.forEach((element) { - print(element); - }); + genericResponseModel = await MyAttendanceApiClient().validateEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values); SubmitEITTransactionList submitEITTransactionList = await MyAttendanceApiClient().submitEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values); Utils.hideLoading(context); @@ -91,7 +102,7 @@ class _DynamicInputScreenState extends State { String dESCFLEXCONTEXTCODE = ""; String descFlexConTextTitle = ""; - void calGetValueSetValues(GetEITDFFStructureList structureList) async { + Future calGetValueSetValues(GetEITDFFStructureList structureList) async { try { Utils.showLoading(context); String segmentId = structureList.cHILDSEGMENTSVS!; @@ -119,39 +130,255 @@ class _DynamicInputScreenState extends State { } } - void getDefaultValues(GetEITDFFStructureList structureList) async { + Future getDefaultValues(GetEITDFFStructureList structureList) async { try { - Utils.showLoading(context); + Utils.showLoading(context); for (int i = 0; i < (structureList.cHILDSEGMENTSDVSplited?.length ?? 0); i++) { String segmentId = structureList.cHILDSEGMENTSDVSplited![i]; - print("segmentId:$segmentId"); - print("segmentName:${structureList.sEGMENTNAME}"); GetEITDFFStructureList? parent = getEitDffStructureList!.firstWhere((element) => element.sEGMENTNAME == segmentId); - List parentRequired = parent.pARENTSEGMENTSDVSplited ?? []; + List parentDvRequired = parent.pARENTSEGMENTSDVSplited ?? []; + List parentVsRequired = parent.pARENTSEGMENTSVSSplitedVS ?? []; List filteredList = - getEitDffStructureList!.where((outerElement) => parentRequired.any((element) => outerElement.sEGMENTNAME == element.name && element.isRequired == "REQUIRED")).toList(); - + getEitDffStructureList!.where((outerElement) => parentDvRequired.any((element) => outerElement.sEGMENTNAME == element.name && element.isRequired == "REQUIRED")).toList(); List> values = filteredList .map((e) => GetSetValuesRequestModel( sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) .toJson()) .toList(); - print("values:$values"); - ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); - int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); - getEitDffStructureList![index].eSERVICESDV = defaultValue; + List> getSetList = getDefaultValuesIonicLogic(parent); + if (getSetList.isNotEmpty) { + ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, getSetList); + int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); + getEitDffStructureList![index].eSERVICESDV = defaultValue; + } } - Utils.hideLoading(context); - setState(() {}); + await Future.delayed(const Duration(seconds: 1)); + Utils.hideLoading(context); + setState(() {}); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); } } + // List> calGetValueSetValuesIonicLogic(GetEITDFFStructureList structureElement) { + // let descFlexName: any = ""; + // let descFlexContextCode: any = ""; + // let parentValue: any = []; + // let ParentsList: any = []; + // let parentVal: any = null; + // let dependenciesList: any = []; + // let validationType: string = ""; + // } + + List> getDefaultValuesIonicLogic(GetEITDFFStructureList structureElement) { + try { + Utils.showLoading(context); + List parentValue = structureElement.pARENTSEGMENTSVSSplitedVS ?? []; + List parentsList = structureElement.pARENTSEGMENTSDVSplited ?? []; + + List> dependenciesList = []; + String? parentVal; + bool isStandardDate = false; + bool isStandardTimeDate = false; + bool isStandardTime = false; + bool isHidden = false; + bool isReadOnlyList = false; + bool isSelectElement = false; + + // isStandardDate = this.isStandardDate(obj); + // isStandardTimeDate = this.isStandardDateTime(obj); + // isStandardTime = this.isStandardTime(obj); + if (structureElement.dISPLAYFLAG == "N") isHidden = true; + if (structureElement.vALIDATIONTYPE != "N" && structureElement.rEADONLY == "Y") { + isReadOnlyList = true; + } + if (structureElement.vALIDATIONTYPE != "N" && structureElement.rEADONLY == "N") { + isSelectElement = true; + } + + if (parentValue.isNotEmpty && (structureElement.vALIDATIONTYPE == "D" || structureElement.vALIDATIONTYPE == "Y")) { + List parValue = getDependenciesParams(parentValue); + + if (parValue.isNotEmpty) { + parentVal = parValue.first.ID_COLUMN_NAME; + } + + if (parentVal == null) { + return []; + } + } + if (parentsList.isNotEmpty) { + if (parentValue.isNotEmpty) { + parentsList = parentsList + parentValue.map((e) => PARENTSEGMENTSDVSplited.fromJson(e.toJson())).toList(); + // parentsList.addAll(parentValue.map((e) => PARENTSEGMENTSDVSplited.fromJson(e.toJson()))); + // parentsList.concat(parentValue); + } + dependenciesList = getDependenciesParams(parentsList); + } + return dependenciesList; + // for (int i = 0; i < (structureList.cHILDSEGMENTSDVSplited?.length ?? 0); i++) { + // String segmentId = structureList.cHILDSEGMENTSDVSplited![i]; + // print("segmentId:$segmentId"); + // print("segmentName:${structureList.sEGMENTNAME}"); + // GetEITDFFStructureList? parent = getEitDffStructureList!.firstWhere((element) => element.sEGMENTNAME == segmentId); + // List parentDvRequired = parent.pARENTSEGMENTSDVSplited ?? []; + // List parentVsRequired = parent.pARENTSEGMENTSVSSplitedVS ?? []; + // + // List filteredList = + // getEitDffStructureList!.where((outerElement) => parentDvRequired.any((element) => outerElement.sEGMENTNAME == element.name && element.isRequired == "REQUIRED")).toList(); + // + // List> values = filteredList + // .map((e) => GetSetValuesRequestModel( + // sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) + // .toJson()) + // .toList(); + // print("values:$values"); + // + // ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); + // int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); + // getEitDffStructureList![index].eSERVICESDV = defaultValue; + // } + // Utils.hideLoading(context); + // setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + return []; + } + } + + List> getDependenciesParams(parentsList) { + List> parentArr = []; + + for (int i = 0; i < parentsList.length; i++) { + for (int j = 0; j < (getEitDffStructureList?.length ?? 0); j++) { + if (getEitDffStructureList![j].sEGMENTNAME == parentsList[i].name) { + if (getEitDffStructureList![j].dISPLAYFLAG != "N") { + if (getEitDffStructureList![j].vALIDATIONTYPE == "N") { + String? idColName; + String? val; + if (getEitDffStructureList![j].fORMATTYPE == "Y" || getEitDffStructureList![j].fORMATTYPE == "I") { + //standard date time or //time + val = getEitDffStructureList![j].eSERVICESDV?.pVALUECOLUMNNAME; + // val = getEitDffStructureList![j].eSERVICESDV?.pVALUECOLUMNNAME; + // var elem = document.getElementById(getEitDffStructureList![j].aPPLICATIONCOLUMNNAME) as HTMLDivElement; + + if ((val ?? "").isEmpty && parentsList[i].isRequired == "REQUIRED") { + //alert(parentsList[i].Name +" Is required"); + return []; + // return false; + } + idColName = val; + if (getEitDffStructureList![j].fORMATTYPE == "Y") { + // if (idColName!.contains("/")) { + // DateTime date = DateFormat('yyyy/MM/dd').parse(idColName); + // idColName = DateFormat('yyyy/MM/dd HH:mm:ss').format(DateTime(date.year, date.month, date.day)); + // } else { + // DateTime date = DateFormat('yyyy-MM-dd').parse(idColName); + // idColName = DateFormat('yyyy/MM/dd HH:mm:ss').format(DateTime(date.year, date.month, date.day)); + // } + + idColName = formatStandardDate(idColName!); + } + } else { + val = getEitDffStructureList![j].eSERVICESDV?.pVALUECOLUMNNAME; + // val = (document.getElementById(getEitDffStructureList![j].aPPLICATIONCOLUMNNAME) as HTMLInputElement).value; + if ((val ?? "").isEmpty && parentsList[i].isRequired == "REQUIRED") { + //alert(parentsList[i].Name +" Is required"); + return []; + } + idColName = val; + + if (getEitDffStructureList![j].fORMATTYPE == "X") { + idColName = formatDateNew(idColName!); + // commenting to test + // DateTime date = DateFormat('yyyy-MM-dd').parse(idColName!); + // idColName = DateFormat('yyyy-MM-dd HH:mm:ss').format(date); + } + } + + parentArr.add(GetSetValuesRequestModel( + sEGMENTNAME: getEitDffStructureList![j].sEGMENTNAME, + vALUECOLUMNNAME: val, + dESCRIPTION: "", + iDCOLUMNNAME: idColName, + fLEXVALUESETNAME: getEitDffStructureList![j].fLEXVALUESETNAME, + ).toJson()); + break; + } else { + if (getEitDffStructureList![j].rEADONLY != "Y") { + var data = getEitDffStructureList![j].eSERVICESDV; + + // let x = document.getElementById(getEitDffStructureList![j].aPPLICATIONCOLUMNNAME) as HTMLSelectElement; + String? text = data?.pIDCOLUMNNAME; //x.options[x.selectedIndex] ? x.options[x.selectedIndex].text : ""; + String? val = data?.pVALUECOLUMNNAME; //x.options[x.selectedIndex] ? x.options[x.selectedIndex].value : null; + if ((val ?? "").isEmpty && parentsList[i].isRequired == "REQUIRED") { + //alert(parentsList[i].Name +" Is required"); + return []; + } else {} + + text ??= ""; + + parentArr.add(GetSetValuesRequestModel( + sEGMENTNAME: getEitDffStructureList![j].sEGMENTNAME, + vALUECOLUMNNAME: val, + dESCRIPTION: "", + iDCOLUMNNAME: text, + fLEXVALUESETNAME: getEitDffStructureList![j].fLEXVALUESETNAME, + ).toJson()); + break; + } else { + var data = getEitDffStructureList![j].eSERVICESDV; + + String? text = data?.pVALUECOLUMNNAME; + String? val = data?.pIDCOLUMNNAME; + if ((val ?? "").isEmpty && parentsList[i].IsRequired == "REQUIRED") { + //alert(parentsList[i].Name +" Is required"); + return []; + } else {} + text ??= ""; + + parentArr.add(GetSetValuesRequestModel( + sEGMENTNAME: getEitDffStructureList![j].sEGMENTNAME, + vALUECOLUMNNAME: text, + dESCRIPTION: "", + iDCOLUMNNAME: val, + fLEXVALUESETNAME: getEitDffStructureList![j].fLEXVALUESETNAME, + ).toJson()); + + //break; + } + } + } else { + var data = getEitDffStructureList![j].eSERVICESDV; + + String? text = data?.pVALUECOLUMNNAME; + String? val = data?.pIDCOLUMNNAME; + if ((val ?? "").isEmpty && parentsList[i].IsRequired == "REQUIRED") { + //alert(parentsList[i].Name +" Is required"); + return []; + } else {} + text ??= ""; + + parentArr.add(GetSetValuesRequestModel( + sEGMENTNAME: getEitDffStructureList![j].sEGMENTNAME, + vALUECOLUMNNAME: text, + dESCRIPTION: "", + iDCOLUMNNAME: val, + fLEXVALUESETNAME: getEitDffStructureList![j].fLEXVALUESETNAME, + ).toJson()); + // break; + } + } + } + } + return parentArr; + } + @override void dispose() { super.dispose(); @@ -249,41 +476,43 @@ class _DynamicInputScreenState extends State { } } DateTime date = await _selectDate(context); - DateTime date1 = DateTime(date.year, date.month, date.day); + String dateString = date.toString().split(' ').first; + // DateTime date1 = DateTime(date.year, date.month, date.day); // getEitDffStructureList![index].fieldAnswer = date.toString(); ESERVICESDV eservicesdv; if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { eservicesdv = ESERVICESDV( - pIDCOLUMNNAME: DateFormat('yyyy/MM/dd HH:MM:SS').format(date1), + pIDCOLUMNNAME: formatDate(dateString), pRETURNMSG: "null", pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, - pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy/MM/dd HH:MM:SS').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? reverseFormatStandardDate(formatDate(dateString)) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); } else { eservicesdv = ESERVICESDV( - pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), + pIDCOLUMNNAME: dateString, pRETURNMSG: "null", pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, - pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy-MM-dd hh:mm:ss').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? reverseFormatStandardDate(formatDate(dateString)) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); } getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { - calGetValueSetValues(model); + await calGetValueSetValues(model); } if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { - getDefaultValues(model); + await getDefaultValues(model); } }, ).paddingOnly(bottom: 12); } else if (model.fORMATTYPE == "Y") { String displayText = model.eSERVICESDV?.pIDCOLUMNNAME ?? (getEitDffStructureList![index].fieldAnswer ?? ""); if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { - if (displayText.contains(" 00:00:00")) { - displayText = displayText.replaceAll(" 00:00:00", ""); - } - if (!displayText.contains("-")) { - displayText = DateFormat('yyyy-MM-dd').format(DateFormat("yyyy/MM/dd").parse(displayText)); - } + displayText = reverseFormatDate(displayText); + // if (displayText.contains(" 00:00:00")) { + // displayText = displayText.replaceAll(" 00:00:00", ""); + // } + // if (!displayText.contains("-")) { + // displayText = DateFormat('yyyy-MM-dd').format(DateFormat("yyyy/MM/dd").parse(displayText)); + // } } return DynamicTextFieldWidget( (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), @@ -297,41 +526,40 @@ class _DynamicInputScreenState extends State { if (tempDate.contains("00:00:00")) { tempDate = tempDate.replaceAll("00:00:00", '').trim(); } - if(tempDate.contains("/")) { + if (tempDate.contains("/")) { selectedDate = DateFormat("yyyy/MM/dd").parse(tempDate); } else { selectedDate = DateFormat("yyyy-MM-dd").parse(tempDate); } - } else { selectedDate = DateTime.parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!); } } DateTime date = await _selectDate(context); - DateTime date1 = DateTime(date.year, date.month, date.day); + String dateString = date.toString().split(' ').first; // getEitDffStructureList![index].fieldAnswer = date.toString(); ESERVICESDV eservicesdv; if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { eservicesdv = ESERVICESDV( - pIDCOLUMNNAME: DateFormat('yyyy/MM/dd HH:MM:SS').format(date1), + pIDCOLUMNNAME: formatDate(dateString), pRETURNMSG: "null", pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, - pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy-MM-dd HH:MM:SS').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? reverseFormatStandardDate(formatDate(dateString)) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); } else { eservicesdv = ESERVICESDV( - pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), + pIDCOLUMNNAME: dateString, pRETURNMSG: "null", pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, - pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy-MM-dd hh:mm:ss').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? reverseFormatStandardDate(formatDate(dateString)) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); } getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { - calGetValueSetValues(model); + await calGetValueSetValues(model); } if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { - getDefaultValues(model); + await getDefaultValues(model); } }, ).paddingOnly(bottom: 12); @@ -347,21 +575,22 @@ class _DynamicInputScreenState extends State { isReadOnly: model.rEADONLY == "Y", ).paddingOnly(bottom: 12), itemBuilder: (_) => >[ - for (int i = 0; i < model.eSERVICESVS!.length; i++) PopupMenuItem(child: Text(model.eSERVICESVS![i].vALUECOLUMNNAME!), value: i), + if (model.rEADONLY != "Y") + for (int i = 0; i < model.eSERVICESVS!.length; i++) PopupMenuItem(child: Text(model.eSERVICESVS![i].vALUECOLUMNNAME!), value: i), ], - onSelected: (int popipIndex) { + onSelected: (int popipIndex) async { ESERVICESDV eservicesdv = ESERVICESDV( pIDCOLUMNNAME: model.eSERVICESVS![popipIndex].iDCOLUMNNAME, pRETURNMSG: "null", - pRETURNSTATUS: getEitDffStructureList![popipIndex].dEFAULTVALUE, + pRETURNSTATUS: "null", //getEitDffStructureList![popipIndex].dEFAULTVALUE, pVALUECOLUMNNAME: model.eSERVICESVS![popipIndex].vALUECOLUMNNAME); getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { - calGetValueSetValues(model); + await calGetValueSetValues(model); } if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { - getDefaultValues(model); + await getDefaultValues(model); } }); } @@ -380,21 +609,19 @@ class _DynamicInputScreenState extends State { isReadOnly: model.rEADONLY == "Y", ).paddingOnly(bottom: 12), itemBuilder: (_) => >[ - for (int i = 0; i < model.eSERVICESVS!.length; i++) PopupMenuItem(child: Text(model.eSERVICESVS![i].vALUECOLUMNNAME!), value: i), + if (model.rEADONLY != "Y") + for (int i = 0; i < model.eSERVICESVS!.length; i++) PopupMenuItem(value: i, child: Text(model.eSERVICESVS![i].vALUECOLUMNNAME!)), ], - onSelected: (int popipIndex) { - ESERVICESDV eservicesdv = ESERVICESDV( - pIDCOLUMNNAME: model.eSERVICESVS![popipIndex].iDCOLUMNNAME, - pRETURNMSG: "null", - pRETURNSTATUS: getEitDffStructureList![popipIndex].dEFAULTVALUE, - pVALUECOLUMNNAME: model.eSERVICESVS![popipIndex].vALUECOLUMNNAME); + onSelected: (int popipIndex) async { + ESERVICESDV eservicesdv = + ESERVICESDV(pIDCOLUMNNAME: model.eSERVICESVS![popipIndex].iDCOLUMNNAME, pRETURNMSG: "null", pRETURNSTATUS: "null", pVALUECOLUMNNAME: model.eSERVICESVS![popipIndex].vALUECOLUMNNAME); getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { - calGetValueSetValues(model); + await calGetValueSetValues(model); } if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { - getDefaultValues(model); + await getDefaultValues(model); } }); } @@ -431,20 +658,20 @@ class _DynamicInputScreenState extends State { } } DateTime date = await _selectDate(context); - DateTime date1 = DateTime(date.year, date.month, date.day); + String dateString = date.toString().split(' ').first; getEitDffStructureList![index].fieldAnswer = date.toString(); ESERVICESDV eservicesdv = ESERVICESDV( - pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), + pIDCOLUMNNAME: dateString, pRETURNMSG: "null", pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, - pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy-MM-dd hh:mm:ss').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? reverseFormatStandardDate(formatDate(dateString)) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { - calGetValueSetValues(model); + await calGetValueSetValues(model); } if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { - getDefaultValues(model); + await getDefaultValues(model); } }, ).paddingOnly(bottom: 12); @@ -471,10 +698,10 @@ class _DynamicInputScreenState extends State { getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { - calGetValueSetValues(model); + await calGetValueSetValues(model); } if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { - getDefaultValues(model); + await getDefaultValues(model); } }, ).paddingOnly(bottom: 12); @@ -487,7 +714,7 @@ class _DynamicInputScreenState extends State { ).objectContainerView(); } - DateTime selectedDate = DateTime.now(); + DateTime selectedDate = DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day); Future _selectDate(BuildContext context) async { DateTime time = selectedDate; @@ -516,6 +743,7 @@ class _DynamicInputScreenState extends State { time = picked; } } + time = DateTime(time.year, time.month, time.day); return time; } @@ -559,4 +787,59 @@ class _DynamicInputScreenState extends State { } return time; } + + String reverseFormatDate(String date) { + String formattedDate; + if (date.isNotEmpty) { + formattedDate = date.replaceAll('/', '-'); + formattedDate = formattedDate.replaceAll(' 00:00:00', ''); + } else { + formattedDate = date; + } + return formattedDate; + } + + String formatStandardDate(String date) { + String formattedDate; + if (date.isNotEmpty) { + formattedDate = date.replaceAll('-', '/'); + } else { + formattedDate = date; + } + return formattedDate; + } + + String reverseFormatStandardDate(String date) { + String formattedDate; + if (date.isNotEmpty) { + formattedDate = date.replaceAll('/', '-'); + } else { + formattedDate = date; + } + return formattedDate; + } + + String formatDate(String date) { + String formattedDate; + + if (date.isNotEmpty) { + date = date.substring(0, 10); + formattedDate = date.replaceAll('-', '/'); + formattedDate = formattedDate + ' 00:00:00'; + } else { + formattedDate = date; + } + return formattedDate; + } + + String formatDateNew(String date) { + String formattedDate; + if (date.isNotEmpty) { + formattedDate = date.split('T')[0]; + formattedDate = formattedDate + ' 00:00:00'; + } else { + formattedDate = date; + } + return formattedDate; + } } 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 54aee5c..8dd78f7 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart @@ -91,8 +91,8 @@ class _DynamicListViewScreenState extends State { separatorBuilder: (cxt, index) => 12.height, itemCount: getEITTransactionList!.length)), floatingActionButton: Container( - height: 50, - width: 50, + height: 54, + width: 54, decoration: const BoxDecoration( shape: BoxShape.circle, gradient: LinearGradient(transform: GradientRotation(.83), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [ diff --git a/lib/ui/my_attendance/my_attendance_screen.dart b/lib/ui/my_attendance/my_attendance_screen.dart index 0c0b11a..207e2c7 100644 --- a/lib/ui/my_attendance/my_attendance_screen.dart +++ b/lib/ui/my_attendance/my_attendance_screen.dart @@ -27,34 +27,18 @@ class MyAttendanceScreen extends StatelessWidget { title: LocaleKeys.myAttendance.tr(), ), body: SizedBox( - width: double.infinity, - height: double.infinity, - child: list.isEmpty - ? Utils.getNoDataWidget(context) - : Column( - children: [ - //commenting this because missing wipe coming as duplicate in the screen - // itemView( - // "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, - ListView.separated( - padding: const EdgeInsets.all(21), - itemBuilder: (cxt, index) => itemView( - "assets/images/pdf.svg", - //LocaleKeys.missingSwipes.tr(), - list[index].prompt!, - ).onPress(() { - Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(list[index].prompt!, list[index].functionName!)); - }), - separatorBuilder: (cxt, index) => 12.height, - itemCount: list.length) - .expanded - ], - )), + width: double.infinity, + height: double.infinity, + child: list.isEmpty + ? Utils.getNoDataWidget(context) + : ListView.separated( + padding: const EdgeInsets.all(21), + itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", list[index].prompt!).onPress(() { + Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(list[index].prompt!, list[index].functionName!)); + }), + separatorBuilder: (cxt, index) => 12.height, + itemCount: list.length), + ), ); } diff --git a/lib/ui/profile/add_update_family_member.dart b/lib/ui/profile/add_update_family_member.dart index cd94a8e..9a0bd66 100644 --- a/lib/ui/profile/add_update_family_member.dart +++ b/lib/ui/profile/add_update_family_member.dart @@ -47,18 +47,6 @@ class _AddUpdateFamilyMemberState extends State { super.initState(); } - // void callFamilyMemberData() async { - // try { - // Utils.showLoading(context); - // callAddAndUpdateFamilyMember(); - // Utils.hideLoading(context); - // setState(() {}); - // } catch (ex) { - // Utils.hideLoading(context); - // Utils.handleException(ex, context, null); - // } - // } - void callAddAndUpdateFamilyMember() async { try { Utils.showLoading(context); @@ -367,28 +355,31 @@ class _AddUpdateFamilyMemberState extends State { } Widget footer() { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - color: MyColors.gradiantEndColor, - margin: EdgeInsets.only(bottom: 20, top: 20), - padding: EdgeInsets.only(left: 50, right: 50), - child: TextButton( - style: TextButton.styleFrom( - primary: MyColors.white, - onSurface: MyColors.white, - backgroundColor: MyColors.gradiantEndColor, - ), - onPressed: () { - submitUpdateForm(); - }, - child: Text( - LocaleKeys.next.tr(), - style: TextStyle(fontStyle: FontStyle.normal, fontSize: 16, color: Colors.white, fontWeight: FontWeight.w600), - ), - )), - ], + return Container( + color: MyColors.white, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + color: MyColors.gradiantEndColor, + margin: EdgeInsets.only(bottom: 20, top: 20), + padding: EdgeInsets.only(left: 50, right: 50), + child: TextButton( + style: TextButton.styleFrom( + primary: MyColors.white, + onSurface: MyColors.white, + backgroundColor: MyColors.gradiantEndColor, + ), + onPressed: () { + submitUpdateForm(); + }, + child: Text( + LocaleKeys.next.tr(), + style: TextStyle(fontStyle: FontStyle.normal, fontSize: 16, color: Colors.white, fontWeight: FontWeight.w600), + ), + )), + ], + ), ); } diff --git a/lib/ui/profile/basic_details.dart b/lib/ui/profile/basic_details.dart index 2976601..eae5c3d 100644 --- a/lib/ui/profile/basic_details.dart +++ b/lib/ui/profile/basic_details.dart @@ -22,6 +22,7 @@ class BasicDetails extends StatefulWidget { @override _BasicDetailsState createState() => _BasicDetailsState(); } +// TODO(Sultan): kindly follow structure of code written. use extension methods for widgets, use localization and format code class _BasicDetailsState extends State { String? fullName = ""; @@ -149,13 +150,13 @@ class _BasicDetailsState extends State { void showAlertDialog(BuildContext context) { Widget cancelButton = TextButton( - child: Text("Cancel"), + child: Text(LocaleKeys.cancel.tr()), onPressed: () { Navigator.pop(context); }, ); Widget continueButton = TextButton( - child: Text("Next"), + child: Text(LocaleKeys.next.tr()), onPressed: () { continueDynamicForms(); }, @@ -163,7 +164,7 @@ class _BasicDetailsState extends State { StatefulBuilder alert = StatefulBuilder(builder: (context, setState) { return AlertDialog( shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10.0))), - title: Text("Confirm"), + title: Text(LocaleKeys.confirm.tr()), 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; @@ -171,14 +172,14 @@ class _BasicDetailsState extends State { height: height, child: Column(children: [ Text( - "Select the type of change you want to make.", + LocaleKeys.selectType.tr(), style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), ), Divider(), Column( children: [ ListTile( - title: Text("correct or complete the current details"), + title: Text(LocaleKeys.correctCurrentDatails.tr()), leading: Radio( value: 1, groupValue: correctOrNew, @@ -191,7 +192,7 @@ class _BasicDetailsState extends State { ), ), ListTile( - title: Text("Enter new Information because of a real change to the current details (e.g because of a change in marital status)"), + title: Text(LocaleKeys.enterNewInfo.tr()), leading: Radio( value: 2, groupValue: correctOrNew, diff --git a/lib/ui/profile/delete_family_member.dart b/lib/ui/profile/delete_family_member.dart index 764eed9..58ec825 100644 --- a/lib/ui/profile/delete_family_member.dart +++ b/lib/ui/profile/delete_family_member.dart @@ -70,7 +70,7 @@ class _DeleteFamilyMemberState extends State { body: Column( children: [ DynamicTextFieldWidget( - "*End Date", date.toString(), + LocaleKeys.endDate.tr(), date.toString(), // suffixIconData: Icons.calendar_today, isEnable: false, onTap: () async { @@ -90,28 +90,31 @@ class _DeleteFamilyMemberState extends State { } Widget footer() { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - color: MyColors.gradiantEndColor, - margin: EdgeInsets.only(bottom: 20, top: 20), - padding: EdgeInsets.only(left: 50, right: 50), - child: TextButton( - style: TextButton.styleFrom( - primary: MyColors.white, - onSurface: MyColors.white, - backgroundColor: MyColors.gradiantEndColor, - ), - onPressed: () { - deleteFamilyMember(datePar); - }, - child: Text( - LocaleKeys.next.tr(), - style: TextStyle(fontStyle: FontStyle.normal, fontSize: 16, color: Colors.white, fontWeight: FontWeight.w600), - ), - )), - ], + return Container( + color: MyColors.white, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + color: MyColors.gradiantEndColor, + margin: EdgeInsets.only(bottom: 20, top: 20), + padding: EdgeInsets.only(left: 50, right: 50), + child: TextButton( + style: TextButton.styleFrom( + primary: MyColors.white, + onSurface: MyColors.white, + backgroundColor: MyColors.gradiantEndColor, + ), + onPressed: () { + deleteFamilyMember(datePar); + }, + child: Text( + LocaleKeys.next.tr(), + style: TextStyle(fontStyle: FontStyle.normal, fontSize: 16, color: Colors.white, fontWeight: FontWeight.w600), + ), + )), + ], + ), ); } diff --git a/lib/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart index 0fa6845..7278318 100644 --- a/lib/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart +++ b/lib/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart @@ -5,24 +5,9 @@ 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/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_contacts.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 DynamicFamilyMembersParams { String title; diff --git a/lib/ui/profile/family_members.dart b/lib/ui/profile/family_members.dart index 69b3e7c..2dd84ea 100644 --- a/lib/ui/profile/family_members.dart +++ b/lib/ui/profile/family_members.dart @@ -23,7 +23,6 @@ class _FamilyMembersState extends State { List getEmployeeContactsList = []; int? relationId; - int? flag; @override void initState() { @@ -112,7 +111,7 @@ class _FamilyMembersState extends State { child: InkWell( onTap: () { relationId = getEmployeeContactsList[index]!.cONTACTRELATIONSHIPID!.toInt(); - showUpdateAlertDialog(context, relationId!.toInt(), 2, "UPDATE"); + showUpdateAlertDialog(context, relationId!.toInt(), 2, LocaleKeys.update.tr()); }, child: RichText( text: TextSpan( @@ -173,6 +172,19 @@ class _FamilyMembersState extends State { ), ), )), + // ElevatedButton.icon( + // icon: Icon( + // Icons.delete, + // size: 15, + // color: Color(0x99FF0000), + // ), + // style: ElevatedButton.styleFrom( + // shadowColor: Colors.white, + // primary: Colors.white, + // ), + // label: "remove".toText12(color: MyColors.DarkRedColor), + // onPressed: (){}, + // ), ], ), ]), @@ -197,7 +209,7 @@ class _FamilyMembersState extends State { BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), ], ), - child: DefaultButton("Add New Family Member", () async { + 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(); @@ -224,14 +236,13 @@ class _FamilyMembersState extends State { AppRoutes.addUpdateFamilyMember, arguments: {"relationID": relationId, "flag": flag, "actionType": "UPDATE"}, ); - // continueDynamicForms(); }, ); AlertDialog alert = AlertDialog( title: Text( LocaleKeys.confirm.tr(), ), - content: Text("Are You Sure You Want to Update this Member?"), + content: Text(LocaleKeys.updateThisMember.tr()), actions: [ cancelButton, continueButton, @@ -259,7 +270,6 @@ class _FamilyMembersState extends State { LocaleKeys.ok.tr(), ), onPressed: () { - // var relationId = getEmployeeContactsList[index]!.cONTACTRELATIONSHIPID!.toInt(); Navigator.pushNamed(context, AppRoutes.deleteFamilyMember, arguments: relationId); // continueDynamicForms(); }, @@ -268,7 +278,7 @@ class _FamilyMembersState extends State { title: Text( LocaleKeys.confirm.tr(), ), - content: Text("Are You Sure You Want to Remove this Member?"), + content: Text(LocaleKeys.removeThisMember.tr()), actions: [ cancelButton, continueButton, @@ -283,8 +293,6 @@ class _FamilyMembersState extends State { } // void continueDynamicForms() { - // Navigator.pushNamed(context, AppRoutes.addDynamicInputProfile, - // arguments: DynamicFamilyMembersParams(LocaleKeys.profile_familyDetails.tr(), getEmployeeContactsList: getEmployeeContactsList)); + // Navigator.pushNamed(context, AppRoutes.addDynamicInputProfile, arguments: DynamicFamilyMembersParams(LocaleKeys.profile_familyDetails.tr(), getEmployeeContactsList: getEmployeeContactsList)); // } - } diff --git a/lib/ui/profile/phone_numbers.dart b/lib/ui/profile/phone_numbers.dart index 1d8958f..4b27b19 100644 --- a/lib/ui/profile/phone_numbers.dart +++ b/lib/ui/profile/phone_numbers.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart'; @@ -64,7 +63,7 @@ class _PhoneNumbersState extends State { color: Color(0xff259CB8), ), Text( - 'Add new row', + LocaleKeys.addRow.tr(), style: TextStyle(color: Color(0xff259CB8), fontWeight: FontWeight.bold), ) ]), @@ -101,7 +100,7 @@ class _PhoneNumbersState extends State { child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ PopupMenuButton( child: DynamicTextFieldWidget( - "Please Select *", + LocaleKeys.pleaseSelect.tr(), e.pHONETYPEMEANING ?? "", isEnable: false, isPopup: true, @@ -130,7 +129,7 @@ class _PhoneNumbersState extends State { size: 18, ), Text( - 'Delete', + LocaleKeys.delete.tr(), style: TextStyle(color: Colors.red, fontWeight: FontWeight.bold), ) ]), @@ -159,6 +158,7 @@ class _PhoneNumbersState extends State { Widget footer() { return Container( decoration: BoxDecoration( + // borderRadius: BorderRadius.circular(10), color: MyColors.white, boxShadow: [ BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), @@ -166,6 +166,8 @@ class _PhoneNumbersState extends State { ), child: DefaultButton(LocaleKeys.update.tr(), () async { updatePhone(); + // context.setLocale(const Locale("en", "US")); // to change Loacle + // Profile(); }).insideContainer, ); } diff --git a/lib/ui/screens/announcements/announcement_details.dart b/lib/ui/screens/announcements/announcement_details.dart index 6909be5..a788b5d 100644 --- a/lib/ui/screens/announcements/announcement_details.dart +++ b/lib/ui/screens/announcements/announcement_details.dart @@ -1,9 +1,11 @@ import 'dart:convert'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_html/flutter_html.dart'; import 'package:mohem_flutter_app/api/pending_transactions_api_client.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_announcement_details.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; @@ -33,7 +35,7 @@ class _AnnouncementDetailsState extends State { backgroundColor: Colors.white, appBar: AppBarWidget( context, - title: "Announcements", + title: LocaleKeys.announcements.tr(), ), body: SingleChildScrollView( child: Container( diff --git a/lib/ui/screens/announcements/announcements.dart b/lib/ui/screens/announcements/announcements.dart index cad3a9a..f367157 100644 --- a/lib/ui/screens/announcements/announcements.dart +++ b/lib/ui/screens/announcements/announcements.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/pending_transactions_api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; @@ -8,6 +9,7 @@ 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/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_announcements.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; @@ -40,7 +42,7 @@ class _AnnouncementsState extends State { backgroundColor: Colors.white, appBar: AppBarWidget( context, - title: "Announcements", + title: LocaleKeys.announcements.tr(), ), body: getAnnouncementsObject.isNotEmpty ? Container( @@ -54,7 +56,7 @@ class _AnnouncementsState extends State { margin: const EdgeInsets.fromLTRB(12.0, 0.0, 12.0, 0.0), child: DynamicTextFieldWidget( "Search", - "Search Announcements", + LocaleKeys.searchAnnouncements.tr(), isEnable: true, suffixIconData: Icons.search, isPopup: false, diff --git a/lib/ui/screens/eit/add_eit.dart b/lib/ui/screens/eit/add_eit.dart index 0dbcd1c..629fbd0 100644 --- a/lib/ui/screens/eit/add_eit.dart +++ b/lib/ui/screens/eit/add_eit.dart @@ -1,5 +1,7 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/classes/colors.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/dashboard/menus.dart'; import 'package:mohem_flutter_app/provider/eit_provider_model.dart'; @@ -45,10 +47,10 @@ class AddEITScreen extends StatelessWidget { labelColor: Colors.white, tabs: [ Tab( - text: "Missing Swipe", + text: LocaleKeys.missingSwipes.tr(), ), Tab( - text: "Swipe Request", + text: LocaleKeys.swipeRequest.tr(), ), ], ), diff --git a/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart b/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart index f3ae4f8..edf6b03 100644 --- a/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart +++ b/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart @@ -34,7 +34,7 @@ class _MowadhafhiHomeState extends State { backgroundColor: Colors.white, appBar: AppBarWidget( context, - title: "Mowadhafhi Request", + title: LocaleKeys.mowadhafhiRequest.tr(), ), body: Container( margin: const EdgeInsets.only(top: 10.0), diff --git a/lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart b/lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart index 4ee819d..b557ab9 100644 --- a/lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart +++ b/lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:io'; +import 'package:easy_localization/easy_localization.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/mowadhafhi/mowadhafhi_api_client.dart'; @@ -9,6 +10,7 @@ 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/mowadhafhi/get_department_sections.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_project_departments.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_projects.dart'; @@ -56,7 +58,7 @@ class _MowadhafhiHRRequestState extends State { backgroundColor: Colors.white, appBar: AppBarWidget( context, - title: "Mowadhafhi Request", + title: LocaleKeys.mowadhafhiRequest.tr(), ), body: SingleChildScrollView( child: getTicketTypesList.isNotEmpty @@ -78,7 +80,7 @@ class _MowadhafhiHRRequestState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Service Type: ".toText16(), + LocaleKeys.serviceType.tr().toText16(), 12.height, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -108,11 +110,11 @@ class _MowadhafhiHRRequestState extends State { ], ), 12.height, - "Department Name: ".toText16(), + LocaleKeys.departmentName.tr().toText16(), 12.height, PopupMenuButton( child: DynamicTextFieldWidget( - "Select Department", + LocaleKeys.selectDepartment.tr(), selectedDepartment?.departmentName ?? "", isEnable: false, isPopup: true, @@ -128,11 +130,11 @@ class _MowadhafhiHRRequestState extends State { setState(() {}); }), 12.height, - "Related Section: ".toText16(), + LocaleKeys.relatedSection.tr().toText16(), 12.height, PopupMenuButton( child: DynamicTextFieldWidget( - "Select Section", + LocaleKeys.selectSection.tr(), selectedSection?.sectionName ?? "", isEnable: false, isPopup: true, @@ -148,11 +150,11 @@ class _MowadhafhiHRRequestState extends State { setState(() {}); }), 12.height, - "Related Topic: ".toText16(), + LocaleKeys.relatedTopic.tr().toText16(), 12.height, PopupMenuButton( child: DynamicTextFieldWidget( - "Select Topic", + LocaleKeys.selectTopic.tr(), selectedTopic?.topicName ?? "", isEnable: false, isPopup: true, @@ -168,11 +170,11 @@ class _MowadhafhiHRRequestState extends State { setState(() {}); }), 12.height, - "Supporting Document: ".toText16(), + LocaleKeys.supportingDocument.tr().toText16(), 12.height, attachmentView("Attachments"), 12.height, - "Description: ".toText16(), + LocaleKeys.description.tr().toText16(), 12.height, DynamicTextFieldWidget( "", @@ -203,7 +205,7 @@ class _MowadhafhiHRRequestState extends State { 12.width, Expanded( child: DefaultButton( - "Submit", + LocaleKeys.submit.tr(), !checkValidation() ? null : () { diff --git a/lib/ui/screens/mowadhafhi/request_details.dart b/lib/ui/screens/mowadhafhi/request_details.dart index 9426929..aa22bdd 100644 --- a/lib/ui/screens/mowadhafhi/request_details.dart +++ b/lib/ui/screens/mowadhafhi/request_details.dart @@ -1,9 +1,11 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/mowadhafhi/mowadhafhi_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/generated/locale_keys.g.dart'; 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/widgets/app_bar_widget.dart'; @@ -41,7 +43,7 @@ class _RequestDetailsState extends State { backgroundColor: Colors.white, appBar: AppBarWidget( context, - title: "Mowadhafhi Request", + title: LocaleKeys.mowadhafhiRequest.tr(), ), body: SingleChildScrollView( child: getTicketsByEmployeeList.length != 0 @@ -74,16 +76,16 @@ class _RequestDetailsState extends State { ], ), 8.height, - "Ticket Reference: ".toText12(color: MyColors.grey98Color), + LocaleKeys.ticketReference.tr().toText12(color: MyColors.grey98Color), getTicketsByEmployeeList![0].ticketReferenceNo!.toText14(color: MyColors.grey57Color), 8.height, - "Section: ".toText12(color: MyColors.grey98Color), + LocaleKeys.section.tr().toText12(color: MyColors.grey98Color), getTicketsByEmployeeList![0].sectionName!.toText14(color: MyColors.grey57Color), 8.height, - "Topic: ".toText12(color: MyColors.grey98Color), + LocaleKeys.topic.tr().toText12(color: MyColors.grey98Color), getTicketsByEmployeeList![0].topicName!.toText14(color: MyColors.grey57Color), 8.height, - "Description: ".toText12(color: MyColors.grey98Color), + LocaleKeys.description.tr().toText12(color: MyColors.grey98Color), getTicketsByEmployeeList![0].description!.toText14(color: MyColors.grey57Color), ], ), @@ -125,7 +127,7 @@ class _RequestDetailsState extends State { children: [ Row( children: [ - "Action By: ".toText14(color: MyColors.grey57Color), + LocaleKeys.actionBy.tr().toText14(color: MyColors.grey57Color), getTicketTransactionsList![index].actionBy!.toText14(color: MyColors.grey57Color), ], ), diff --git a/lib/ui/screens/pending_transactions/pending_transactions.dart b/lib/ui/screens/pending_transactions/pending_transactions.dart index 98d7fe3..997ec0d 100644 --- a/lib/ui/screens/pending_transactions/pending_transactions.dart +++ b/lib/ui/screens/pending_transactions/pending_transactions.dart @@ -42,7 +42,7 @@ class _PendingTransactionsState extends State { backgroundColor: Colors.white, appBar: AppBarWidget( context, - title: "Pending Transactions", + title: LocaleKeys.pendingTransactions.tr(), ), body: SingleChildScrollView( child: Container( @@ -65,7 +65,7 @@ class _PendingTransactionsState extends State { 12.height, PopupMenuButton( child: DynamicTextFieldWidget( - "Please select request type", + LocaleKeys.selectRequestType.tr(), selectedFunction?.fUNCTIONPROMPT ?? "", isEnable: false, isPopup: true, @@ -81,7 +81,7 @@ class _PendingTransactionsState extends State { }), 12.height, DynamicTextFieldWidget( - "Date From: ", + LocaleKeys.dateFrom.tr(), selectedDateFrom.toString().split(" ")[0], suffixIconData: Icons.calendar_today, isEnable: false, @@ -92,7 +92,7 @@ class _PendingTransactionsState extends State { ).paddingOnly(bottom: 12), 12.height, DynamicTextFieldWidget( - "Date To: ", + LocaleKeys.dateTo.tr(), selectedDateTo.toString().split(" ")[0], suffixIconData: Icons.calendar_today, isEnable: false, diff --git a/lib/ui/screens/pending_transactions/pending_transactions_details.dart b/lib/ui/screens/pending_transactions/pending_transactions_details.dart index 1877c5b..2c8895a 100644 --- a/lib/ui/screens/pending_transactions/pending_transactions_details.dart +++ b/lib/ui/screens/pending_transactions/pending_transactions_details.dart @@ -1,9 +1,11 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/pending_transactions_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/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/pending_transactions/get_pending_transactions_details.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; @@ -43,7 +45,7 @@ class _PendingTransactionsDetailsState extends State backgroundColor: Colors.white, appBar: AppBarWidget( context, - title: "Pending Transactions", + title: LocaleKeys.pendingTransactions.tr(), ), body: getPendingTransactionsDetails.isNotEmpty ? Container( @@ -105,7 +107,7 @@ class _PendingTransactionsDetailsState extends State padding: const EdgeInsets.only(top: 0.0), child: Row( children: [ - "Request Type: ".toText14(color: MyColors.grey57Color), + LocaleKeys.requestType.tr().toText14(color: MyColors.grey57Color), getPendingTransactionsDetails[index].rEQUESTTYPE!.toText14(color: MyColors.redColor), ], ), diff --git a/lib/ui/screens/profile/profile_screen.dart b/lib/ui/screens/profile/profile_screen.dart index 0578faf..35c4a57 100644 --- a/lib/ui/screens/profile/profile_screen.dart +++ b/lib/ui/screens/profile/profile_screen.dart @@ -1,5 +1,7 @@ +import 'dart:ui'; import 'dart:convert'; import 'dart:ui'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -7,6 +9,7 @@ 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'; +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/screens/profile/widgets/header.dart'; @@ -29,9 +32,7 @@ class _ProfileScreenState extends State { @override void initState() { super.initState(); - memberInformationList = AppState().memberInformationList!; - setState(() {}); //getEmployeeBasicDetails(); } @@ -43,53 +44,63 @@ class _ProfileScreenState extends State { backgroundColor: const Color(0xffefefef), body: Stack(children: [ Container( - height: 300, - margin: EdgeInsets.only(top: 50), - decoration: BoxDecoration(image: DecorationImage(image: MemoryImage(Utils.getPostBytes(memberInformationList.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)), - ), - )), + height: 300, + margin: EdgeInsets.only(top: 50), + decoration: BoxDecoration(image: DecorationImage(image: MemoryImage(Utils.getPostBytes(memberInformationList.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: [ - SizedBox( - height: 80, - ), - Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + height: 80, + ), + 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, - )), + onPressed: () { + Navigator.pop(context); + }, + icon: Icon( + Icons.arrow_back_ios, + 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)), - child: Row(children: [ - Icon(Icons.photo, color: Colors.white), - Text( - 'Edit', - style: TextStyle(color: Colors.white, fontSize: 12), - ) - ]))), + 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)), + child: Row( + children: [ + Icon(Icons.photo, color: Colors.white), + Text( + 'Edit', + style: TextStyle(color: Colors.white, fontSize: 12), + ) + ], + ), + ), + ), ], - )), - HeaderPanel(memberInformationList), - ProfilePanle(memberInformationList) - ]), + ), + ), + HeaderPanel(memberInformationList), + ProfilePanle(memberInformationList) + ], + ), ) ])); } @@ -102,7 +113,7 @@ class _ProfileScreenState extends State { padding: EdgeInsets.only(left: 20, right: 20), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [Text('OK'), Text('CANCEL')], + children: [Text(LocaleKeys.ok.tr()), Text(LocaleKeys.cancel.tr())], )), BottomSheetItem( onTap: () { diff --git a/lib/ui/screens/profile/widgets/header.dart b/lib/ui/screens/profile/widgets/header.dart index ca3d829..abd5ce6 100644 --- a/lib/ui/screens/profile/widgets/header.dart +++ b/lib/ui/screens/profile/widgets/header.dart @@ -4,16 +4,19 @@ import 'package:mohem_flutter_app/models/member_information_list_model.dart'; class HeaderPanel extends StatelessWidget { HeaderPanel(this.memberInformationList); + late MemberInformationListModel memberInformationList; + @override Widget build(BuildContext context) { double _width = MediaQuery.of(context).size.width; return Container( - padding: EdgeInsets.symmetric(horizontal: _width / 10, vertical: 0), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [], - )); + padding: EdgeInsets.symmetric(horizontal: _width / 10, vertical: 0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [], + ), + ); } } diff --git a/lib/ui/screens/profile/widgets/profile_info.dart b/lib/ui/screens/profile/widgets/profile_info.dart index 064ea7e..029e50a 100644 --- a/lib/ui/screens/profile/widgets/profile_info.dart +++ b/lib/ui/screens/profile/widgets/profile_info.dart @@ -16,6 +16,7 @@ import 'package:provider/provider.dart'; class ProfileInFo extends StatefulWidget { ProfileInFo(this.memberInfo); + MemberInformationListModel memberInfo; @override @@ -41,65 +42,70 @@ class _ProfileInFoState extends State { @override Widget build(BuildContext context) { return Container( - child: Column(crossAxisAlignment: CrossAxisAlignment.center, children: [ - /// card header - customLabel(widget.memberInfo.eMPLOYEENAME.toString(), 22, Colors.black, true), - - customLabel(widget.memberInfo.eMPLOYEENUMBER.toString() + ' | ' + widget.memberInfo.jOBNAME.toString(), 14, Colors.grey, false), - - customLabel(widget.memberInfo.eMPLOYEEEMAILADDRESS.toString(), 13, Colors.black, true), - - Divider(height: 40, thickness: 8, color: const Color(0xffefefef)), - - customLabel(LocaleKeys.completingYear.tr(), 10, Colors.black, true), - - SizedBox(height: 10), - Container( - child: Row(mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Column( - children: [customLabel(LocaleKeys.year.tr(), 14, const Color(0xff808080), true), customLabel(widget.memberInfo.sERVICEYEARS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)], - ), - Column( - children: [customLabel(LocaleKeys.month.tr(), 14, const Color(0xff808080), true), customLabel(widget.memberInfo.sERVICEMONTHS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)], - ), - Column( - children: [customLabel(LocaleKeys.day.tr(), 14, const Color(0xff808080), true), customLabel(widget.memberInfo.sERVICEDAYS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)], - ) - ])), - - Divider(height: 40, thickness: 8, color: const Color(0xffefefef)), - Container( - padding: EdgeInsets.only( - left: 20, - right: 20, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + /// card header + customLabel(widget.memberInfo.eMPLOYEENAME.toString(), 22, Colors.black, true), + + customLabel(widget.memberInfo.eMPLOYEENUMBER.toString() + ' | ' + widget.memberInfo.jOBNAME.toString(), 14, Colors.grey, false), + + customLabel(widget.memberInfo.eMPLOYEEEMAILADDRESS.toString(), 13, Colors.black, true), + + Divider(height: 40, thickness: 8, color: const Color(0xffefefef)), + + customLabel(LocaleKeys.completingYear.tr(), 10, Colors.black, true), + + SizedBox(height: 10), + Container( + child: Row(mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [ + Column( + children: [customLabel(LocaleKeys.year.tr(), 14, const Color(0xff808080), true), customLabel(widget.memberInfo.sERVICEYEARS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)], + ), + Column( + children: [customLabel(LocaleKeys.month.tr(), 14, const Color(0xff808080), true), customLabel(widget.memberInfo.sERVICEMONTHS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)], + ), + Column( + children: [customLabel(LocaleKeys.day.tr(), 14, const Color(0xff808080), true), customLabel(widget.memberInfo.sERVICEDAYS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)], + ) + ])), + + Divider(height: 40, thickness: 8, color: const Color(0xffefefef)), + Container( + padding: EdgeInsets.only( + left: 20, + right: 20, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + customLabel(LocaleKeys.profile_profileCompletionPer.tr() + ' 75%', 18, Colors.black, true), + const SizedBox(height: 10), + Row( + children: [ + for (var i = 0; i < 4; i++) + if (i < 3) Expanded(child: drawSlider(Color(0xff2BB8A6))) else Expanded(child: drawSlider(const Color(0xffefefef))) + ], + ), + const SizedBox(height: 10), + Text( + LocaleKeys.profile_completeProfile.tr(), + style: TextStyle(color: Color(0xff2BB8A6), fontWeight: FontWeight.bold, decoration: TextDecoration.underline), + ), + ], + ), ), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - customLabel(LocaleKeys.profile_profileCompletionPer.tr() + ' 75%', 18, Colors.black, true), - const SizedBox(height: 10), - Row( - children: [ - for (var i = 0; i < 4; i++) - if (i < 3) Expanded(child: drawSlider(Color(0xff2BB8A6))) else Expanded(child: drawSlider(const Color(0xffefefef))) - ], - ), - const SizedBox(height: 10), - Text( - LocaleKeys.profile_completeProfile.tr(), - style: TextStyle(color: Color(0xff2BB8A6), fontWeight: FontWeight.bold, decoration: TextDecoration.underline), - ), - ], - )), - /// description - Divider(height: 50, thickness: 8, color: const Color(0xffefefef)), + /// description + Divider(height: 50, thickness: 8, color: const Color(0xffefefef)), - Column( - children: menu.map((i) => rowItem(i, context)).toList(), - ) - ])); + Column( + children: menu.map((i) => rowItem(i, context)).toList(), + ) + ], + ), + ); } Widget drawSlider(color) { diff --git a/lib/ui/screens/profile/widgets/profile_panel.dart b/lib/ui/screens/profile/widgets/profile_panel.dart index fd99abb..1facf52 100644 --- a/lib/ui/screens/profile/widgets/profile_panel.dart +++ b/lib/ui/screens/profile/widgets/profile_panel.dart @@ -6,7 +6,9 @@ import 'package:mohem_flutter_app/ui/screens/profile/widgets/profile_info.dart'; class ProfilePanle extends StatelessWidget { ProfilePanle(this.memberInformationList); + late MemberInformationListModel memberInformationList; + @override Widget build(BuildContext context) { double _width = MediaQuery.of(context).size.width; @@ -19,9 +21,10 @@ class ProfilePanle extends StatelessWidget { margin: EdgeInsets.only(top: 50), padding: EdgeInsets.only(top: 50), decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), - boxShadow: [BoxShadow(color: Colors.white60, blurRadius: 10, spreadRadius: 10)]), + color: Colors.white, + borderRadius: const BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), + boxShadow: [BoxShadow(color: Colors.white60, blurRadius: 10, spreadRadius: 10)], + ), child: ProfileInFo(memberInformationList), ), Container(height: 100, alignment: Alignment.center, child: ProfileImage()) diff --git a/lib/ui/work_list/worklist_detail_screen.dart b/lib/ui/work_list/worklist_detail_screen.dart index 6ad0a79..d2a0e0b 100644 --- a/lib/ui/work_list/worklist_detail_screen.dart +++ b/lib/ui/work_list/worklist_detail_screen.dart @@ -395,8 +395,8 @@ class _WorkListDetailScreenState extends State { showDialog( context: context, builder: (cxt) => ConfirmDialog( - message: "Are you sure want to reject?", - okTitle: "Reject", + message: LocaleKeys.wantToReject.tr(), + okTitle: LocaleKeys.reject.tr(), onTap: () async { Navigator.pop(cxt); Utils.showLoading(context); diff --git a/lib/ui/work_list/worklist_fragments/actions_fragment.dart b/lib/ui/work_list/worklist_fragments/actions_fragment.dart index 056ca1f..db40be1 100644 --- a/lib/ui/work_list/worklist_fragments/actions_fragment.dart +++ b/lib/ui/work_list/worklist_fragments/actions_fragment.dart @@ -8,7 +8,6 @@ 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_action_history_list_model.dart'; import 'package:mohem_flutter_app/ui/work_list/sheets/delegate_sheet.dart'; -import 'package:mohem_flutter_app/ui/work_list/sheets/request_more_info_sheet.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; @@ -126,9 +125,3 @@ class ActionsFragment extends StatelessWidget { } } } - -List actionsList = [ - Colors.black, - Colors.red, - Colors.green, -]; diff --git a/lib/widgets/app_logo.dart b/lib/widgets/app_logo.dart index 1c0bc37..3140c29 100644 --- a/lib/widgets/app_logo.dart +++ b/lib/widgets/app_logo.dart @@ -1,19 +1,26 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; class AppLogo extends StatelessWidget { AppLogo({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - // TODO: implement build - return Row(children: [ - SvgPicture.asset( - "assets/mohemm_logo.svg", - height: 100, - width: 100, - alignment: Alignment.centerRight, - ), - ],); + return Row( + children: [ + SvgPicture.asset( + "assets/mohemm_logo.svg", + height: 48, + width: 48, + alignment: Alignment.centerRight, + ), + 8.width, + LocaleKeys.mohemm.tr().toText14() + ], + ); } } diff --git a/lib/widgets/dialogs/dialogs.dart b/lib/widgets/dialogs/dialogs.dart new file mode 100644 index 0000000..9a5a822 --- /dev/null +++ b/lib/widgets/dialogs/dialogs.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; + +void showMDialog( + context, { + Widget? child, +}) async { + return showDialog( + context: context, + barrierDismissible: true, + builder: (context) { + return Dialog( + child: child, + ); + }, + ); +} diff --git a/lib/widgets/qr_scanner_dialog.dart b/lib/widgets/qr_scanner_dialog.dart new file mode 100644 index 0000000..a3adb79 --- /dev/null +++ b/lib/widgets/qr_scanner_dialog.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:qr_code_scanner/qr_code_scanner.dart'; + +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; + +class QrScannerDialog extends StatefulWidget { + @override + State createState() => _QrScannerDialogState(); +} + +class _QrScannerDialogState extends State { + final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); + Barcode? result; + QRViewController? controller; + bool isPicked = false; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + width: double.infinity, + height: double.infinity, + color: Colors.white, + child: Column( + children: [ + Expanded( + flex: 1, + child: QRView( + key: qrKey, + onQRViewCreated: _onQRViewCreated, + ), + ), + // Expanded( + // flex: 1, + // child: Center( + // child: (result != null) + // ? Text( + // 'Barcode Type: ${result!.format} Data: ${result!.code}') + // : Text('Scan a code'), + // ), + // ), + Padding( + padding: const EdgeInsets.all(12.0), + child: DefaultButton( + "Cancel", + () { + Navigator.pop(context); + }, + ), + ), + ], + ), + ), + ); + } + + void _onQRViewCreated(QRViewController controller) { + this.controller = controller; + + controller.scannedDataStream.listen((scanData) { + setState(() { + result = scanData; + if (!isPicked) { + isPicked = true; + Navigator.pop(context, result!.code); + } + }); + }); + } + + @override + void dispose() { + controller?.dispose(); + super.dispose(); + } +} diff --git a/lib/widgets/shimmer/dashboard_shimmer_widget.dart b/lib/widgets/shimmer/dashboard_shimmer_widget.dart index 5b5bd60..cd5d88f 100644 --- a/lib/widgets/shimmer/dashboard_shimmer_widget.dart +++ b/lib/widgets/shimmer/dashboard_shimmer_widget.dart @@ -174,7 +174,7 @@ class ServicesMenuShimmer extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.end, children: [ Expanded( - child: "Attendance".toText11(isBold: false).toShimmer(), + child: LocaleKeys.attendance.tr().toText11(isBold: false).toShimmer(), ), 6.width, SvgPicture.asset("assets/images/arrow_next.svg").paddingOnly(bottom: 4).toShimmer() diff --git a/pubspec.yaml b/pubspec.yaml index 365819d..789d51c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -40,7 +40,7 @@ dependencies: easy_localization: ^3.0.0 http: ^0.13.4 permission_handler: ^9.2.0 - flutter_svg: ^0.23.0+1 + flutter_svg: any sizer: ^2.0.15 local_auth: ^1.1.9 fluttertoast: ^8.0.8 @@ -68,6 +68,14 @@ dependencies: open_file: ^3.2.1 wifi_iot: ^0.3.16 flutter_html: ^2.2.1 +# flutter_barcode_scanner: ^2.0.0 + qr_code_scanner: ^1.0.0 + qr_flutter: ^4.0.0 + + + + + dev_dependencies: flutter_test: