diff --git a/analysis_options.yaml b/analysis_options.yaml index 90c25c1..a84033c 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -9,6 +9,17 @@ # packages, and plugins designed to encourage good coding practices. include: package:flutter_lints/flutter.yaml +analyzer: + errors: + always_use_package_imports: error + camel_case_types: error + always_declare_return_types: error + null_check_on_nullable_type_parameter: error + avoid_annotating_with_dynamic: error + unnecessary_null_checks: error + unnecessary_brace_in_string_interps: error + + linter: # The lint rules applied to this project can be customized in the # section below to disable rules from the `package:flutter_lints/flutter.yaml` @@ -25,8 +36,19 @@ linter: always_specify_types: true always_declare_return_types: true always_use_package_imports: true + avoid_unnecessary_containers: true + unnecessary_this: true + unnecessary_new: true + camel_case_types: true + null_check_on_nullable_type_parameter: true + sort_child_properties_last: true + camel_case_extensions: true + require_trailing_commas: true avoid_empty_else: true avoid_annotating_with_dynamic: true + unnecessary_null_checks: true + unnecessary_brace_in_string_interps: true + unnecessary_string_interpolations: true # avoid_print: false # Uncomment to disable the `avoid_print` rule # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 6bbb0ca..dd9a8de 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -11,7 +11,8 @@ + android:networkSecurityConfig="@xml/network_security_config" + android:roundIcon="@mipmap/ic_launcher_round"> + + #ffffff + \ No newline at end of file diff --git a/assets/images/not_found.svg b/assets/images/not_found.svg new file mode 100644 index 0000000..80aed53 --- /dev/null +++ b/assets/images/not_found.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index bf33153..f26ddca 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -24,7 +24,7 @@ "checkIn": "تحقق في", "workList": "قائمة العمل", "leaveBalance": "رصيد الاجازات", - "missingSwipes": "الضربات الشديدة في عداد المفقودين", + "missingSwipes": "تسجيل بصمة حضور", "ticketBalance": "رصيد التذكرة", "other": "آخر", "services": "خدمات", @@ -56,10 +56,10 @@ "order": "الطلبات", "earlyOut": "الخروج مبكرا", "shortage": "ساعات التقصير", - "excess": "Excess", + "excess": "فائض", "lateIn": "القدوم المتاخر", - "approvedCheckOut": "وقت الخروج", - "approvedCheckIn": "وقت الدخول", + "approvedCheckOut": "اعتماد وقت الخروج", + "approvedCheckIn": "اعتماد وقت الدخول", "actualCheckOut": "وقت الخروج", "actualCheckIn": "وقت الدخول", "present": "حضور", @@ -229,22 +229,40 @@ "approvalLevel": "مستوى الموافقة", "requesterDetails": "تفاصيل مقدم الطلب", "myAttendance": "حضوري", - "workOnBreak": "العمل على استراحة", + "workOnBreak": "التعويض عن العمل اثناءالاستراحه", "next": "التالي", "mobile": "التليفون المحمول", "completingYear": "نحن نقدر لك لاستكمال خدمة", "year": "سنة", "month": "شهر", "day": "يوم", - "address" : "العنوان", + "address": "العنوان", "phoneNumber": "رقم الجوال", "businessGroup": "مجموعة العمل", "Payroll": "الراتب", "civilIdentityNumber": "رقم الهويه", - "dateOfBirth" : "تاريخ الميلاد", + "dateOfBirth": "تاريخ الميلاد", "maritalStatus ": "الحالة الاجتماعية", "fullName": "الأسم الكامل", "remove": "حذف", + "submit": "ارسال", + "areYouSureYouWantToSubmit": "هل أنت متأكد أنك تريد أن تقدم؟", + "comments": "تعليقات", + "writeComment": "أكتب تعليقا", + "approversList": "قائمة الموافقين", + "yourRequestHasBeenSubmittedForApprovals": "تم تقديم طلبك للموافقات", + "monthlyPaySlip": "قسيمة الراتب الشهرية", + "particular": "خاص", + "earnings": "أرباح", + "deductions": "الخصومات", + "paymentMethodName": "اسم طريقة الدفع", + "bankName": "اسم البنك", + "branchCode": "رمز الفرع", + "accountNo": "رقم الحساب", + "summaryOfInformation": "ملخص المعلومات", + "totalPayAmount": "المبلغ الإجمالي للدفع", + "paymentInformation": "معلومات الدفع", + "amount": "مقدار", "profile": { "reset_password": { "label": "Reset Password", @@ -266,14 +284,6 @@ "many": "You clicked {} times!", "other": "You clicked {} times!" }, - "amount": { - "zero": "Your amount : {} ", - "one": "Your amount : {} ", - "two": "Your amount : {} ", - "few": "Your amount : {} ", - "many": "Your amount : {} ", - "other": "Your amount : {} " - }, "gender": { "male": "Hi man ;) ", "female": "Hello girl :)", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 8b9a6e6..bfcac3c 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -62,10 +62,10 @@ "approvedCheckIn": "Approved Check In", "actualCheckOut": "Actual Check Out", "actualCheckIn": "Actual Check In", - "present": "PRESENT 11", + "present": "PRESENT", "pres": "present", "shiftTime": "Shift Time", - "absent": "ABSENT 10", + "absent": "ABSENT", "attendance": "Attendance", "scheduleDays": "Schedule\nDays", "offDays": "Off\nDays", @@ -245,6 +245,25 @@ "maritalStatus ": "Marital Status ", "fullName": "Full Name", "remove": "Remove", + "Attendance": "Attendance", + "submit": "Submit", + "areYouSureYouWantToSubmit": "Are you sure you want to submit?", + "comments": "Comments", + "writeComment": "Write a comment", + "approversList": "Approvers List", + "yourRequestHasBeenSubmittedForApprovals": "Your request has been submitted for approvals", + "monthlyPaySlip": "Monthly Pay Slip", + "particular": "Particular", + "earnings": "Earnings", + "deductions": "Deductions", + "paymentMethodName": "Payment Method Name", + "bankName": "Bank Name", + "branchCode": "Branch Code", + "accountNo": "Account No", + "summaryOfInformation": "Summary of Information", + "totalPayAmount": "Total Pay Amount", + "paymentInformation": "Payment Information", + "amount": "Amount", "profile": { "reset_password": { "label": "Reset Password", @@ -266,14 +285,6 @@ "many": "You clicked {} times!", "other": "You clicked {} times!" }, - "amount": { - "zero": "Your amount : {} ", - "one": "Your amount : {} ", - "two": "Your amount : {} ", - "few": "Your amount : {} ", - "many": "Your amount : {} ", - "other": "Your amount : {} " - }, "gender": { "male": "Hi man ;) ", "female": "Hello girl :)", diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..4745144 Binary files /dev/null and b/icon.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index d36b1fa..e83c3bf 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,122 +1,128 @@ { - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" + "images":[ + { + "idiom":"iphone", + "size":"20x20", + "scale":"2x", + "filename":"Icon-App-20x20@2x.png" + }, + { + "idiom":"iphone", + "size":"20x20", + "scale":"3x", + "filename":"Icon-App-20x20@3x.png" + }, + { + "idiom":"iphone", + "size":"29x29", + "scale":"1x", + "filename":"Icon-App-29x29@1x.png" + }, + { + "idiom":"iphone", + "size":"29x29", + "scale":"2x", + "filename":"Icon-App-29x29@2x.png" + }, + { + "idiom":"iphone", + "size":"29x29", + "scale":"3x", + "filename":"Icon-App-29x29@3x.png" + }, + { + "idiom":"iphone", + "size":"40x40", + "scale":"2x", + "filename":"Icon-App-40x40@2x.png" + }, + { + "idiom":"iphone", + "size":"40x40", + "scale":"3x", + "filename":"Icon-App-40x40@3x.png" + }, + { + "idiom":"iphone", + "size":"60x60", + "scale":"2x", + "filename":"Icon-App-60x60@2x.png" + }, + { + "idiom":"iphone", + "size":"60x60", + "scale":"3x", + "filename":"Icon-App-60x60@3x.png" + }, + { + "idiom":"iphone", + "size":"76x76", + "scale":"2x", + "filename":"Icon-App-76x76@2x.png" + }, + { + "idiom":"ipad", + "size":"20x20", + "scale":"1x", + "filename":"Icon-App-20x20@1x.png" + }, + { + "idiom":"ipad", + "size":"20x20", + "scale":"2x", + "filename":"Icon-App-20x20@2x.png" + }, + { + "idiom":"ipad", + "size":"29x29", + "scale":"1x", + "filename":"Icon-App-29x29@1x.png" + }, + { + "idiom":"ipad", + "size":"29x29", + "scale":"2x", + "filename":"Icon-App-29x29@2x.png" + }, + { + "idiom":"ipad", + "size":"40x40", + "scale":"1x", + "filename":"Icon-App-40x40@1x.png" + }, + { + "idiom":"ipad", + "size":"40x40", + "scale":"2x", + "filename":"Icon-App-40x40@2x.png" + }, + { + "idiom":"ipad", + "size":"76x76", + "scale":"1x", + "filename":"Icon-App-76x76@1x.png" + }, + { + "idiom":"ipad", + "size":"76x76", + "scale":"2x", + "filename":"Icon-App-76x76@2x.png" + }, + { + "idiom":"ipad", + "size":"83.5x83.5", + "scale":"2x", + "filename":"Icon-App-83.5x83.5@2x.png" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "scale" : "1x", + "filename" : "ItunesArtwork@2x.png" + } + ], + "info":{ + "version":1, + "author":"easyappicon" } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } } diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png index 28c6bf0..adf1ee5 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 2ccbfd9..b1f58f0 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index f091b6b..d2e39f8 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png index 4cde121..f561dd4 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index d0ef06e..88904d6 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index dcdc230..5b7f086 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 2ccbfd9..b1f58f0 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index c8f9ed8..78594ee 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index a6d6b86..4476421 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index a6d6b86..4476421 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 75b2d16..addf702 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index c4df70d..74bfa80 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 6a84f41..fa967ed 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png index d0e1f58..d1851c6 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png new file mode 100644 index 0000000..35dc759 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png differ diff --git a/lib/api/api_client.dart b/lib/api/api_client.dart index 3263bf4..2f53f78 100644 --- a/lib/api/api_client.dart +++ b/lib/api/api_client.dart @@ -7,8 +7,8 @@ import 'package:http/http.dart'; import 'package:http/io_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/exceptions/api_exception.dart'; - -import '../main.dart'; +import 'package:mohem_flutter_app/main.dart'; +// ignore_for_file: avoid_annotating_with_dynamic typedef FactoryConstructor = U Function(dynamic); @@ -89,7 +89,7 @@ class ApiClient { return factoryConstructor(jsonData); } else { APIError? apiError; - apiError = APIError(jsonData['ErrorCode'], jsonData['ErrorMessage']); + apiError = APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage']); throw APIException(APIException.BAD_REQUEST, error: apiError); } // } catch (ex) { diff --git a/lib/api/dashboard_api_client.dart b/lib/api/dashboard_api_client.dart index dbfaa4e..1dd58b1 100644 --- a/lib/api/dashboard_api_client.dart +++ b/lib/api/dashboard_api_client.dart @@ -1,17 +1,13 @@ 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'; -import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; -import 'package:mohem_flutter_app/models/member_login_list_model.dart'; import 'package:uuid/uuid.dart'; -import 'api_client.dart'; - class DashboardApiClient { static final DashboardApiClient _instance = DashboardApiClient._internal(); diff --git a/lib/api/eit_api_client.dart b/lib/api/eit_api_client.dart index e3f78bf..9e4f292 100644 --- a/lib/api/eit_api_client.dart +++ b/lib/api/eit_api_client.dart @@ -10,7 +10,7 @@ import 'package:mohem_flutter_app/models/eit/get_eit_transaction_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/member_login_list_model.dart'; -import 'api_client.dart'; +import 'package:mohem_flutter_app/api/api_client.dart'; class EITApiClient { static final EITApiClient _instance = EITApiClient._internal(); @@ -24,7 +24,7 @@ class EITApiClient { Map postParams = {'P_FUNCTION_NAME': functionName, "P_MENU_TYPE": "E", "P_PAGE_LIMIT": 50, "P_PAGE_NUM": 1}; postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { - List? responseData = GET_EIT_Transactions_Model.fromJson(json['GetEITTransactionList'][0]).collectionTransaction; + List? responseData = GetEitTransactionsModel.fromJson(json['GetEITTransactionList'][0]).collectionTransaction; return responseData; }, url, postParams); } diff --git a/lib/api/login_api_client.dart b/lib/api/login_api_client.dart index 2761ebe..8016ab9 100644 --- a/lib/api/login_api_client.dart +++ b/lib/api/login_api_client.dart @@ -8,7 +8,7 @@ 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 'api_client.dart'; +import 'package:mohem_flutter_app/api/api_client.dart'; class LoginApiClient { static final LoginApiClient _instance = LoginApiClient._internal(); @@ -90,6 +90,8 @@ class LoginApiClient { AppState().postParamsObject?.pSessionId = responseData.pSESSIONID; AppState().postParamsObject?.pUserName = AppState().getUserName; AppState().postParamsObject?.pSelectedEmployeeNumber = AppState().getUserName; + AppState().postParamsObject?.setPLegislationCode = responseData.basicMemberInformation!.pLEGISLATIONCODE; + AppState().postParamsObject?.setPayrollCodeStr = responseData.memberInformationList!.first.pAYROLLCODE; return responseData; }, url, postParams); diff --git a/lib/api/monthlyAttendance_api_client.dart b/lib/api/monthlyAttendance_api_client.dart index 4f6aca7..543addb 100644 --- a/lib/api/monthlyAttendance_api_client.dart +++ b/lib/api/monthlyAttendance_api_client.dart @@ -8,8 +8,9 @@ import 'package:mohem_flutter_app/models/get_day_hours_type_details_list_model.d import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart'; import 'package:mohem_flutter_app/models/get_schedule_shifts_details_list_model.dart'; import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart'; -import 'api_client.dart'; +import 'package:mohem_flutter_app/api/api_client.dart'; +// todo '@fatima' change file name according to structure class MonthlyAttendanceApiClient { static final MonthlyAttendanceApiClient _instance = MonthlyAttendanceApiClient._internal(); @@ -17,7 +18,6 @@ class MonthlyAttendanceApiClient { factory MonthlyAttendanceApiClient() => _instance; - Future getTimeCardSummary(String month, int year) async { String url = "${ApiConsts.erpRest}GET_TIME_CARD_SUMMARY"; Map postParams = { @@ -26,9 +26,11 @@ class MonthlyAttendanceApiClient { "SearchMonth": month, "SearchYear": year, }; + postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + print(responseData); return (responseData.getTimeCardSummaryList?.length ?? 0) > 0 ? responseData.getTimeCardSummaryList!.first : null; }, url, postParams); } @@ -48,7 +50,6 @@ class MonthlyAttendanceApiClient { // postParams["DeviceType"] = deviceType; return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); - print("Response Data______"); print(responseData.getDayHoursTypeDetailsList!.length); return responseData.getDayHoursTypeDetailsList ?? []; }, url, postParams); diff --git a/lib/api/monthly_pay_slip_api_client.dart b/lib/api/monthly_pay_slip_api_client.dart new file mode 100644 index 0000000..95bf847 --- /dev/null +++ b/lib/api/monthly_pay_slip_api_client.dart @@ -0,0 +1,68 @@ +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/monthly_pay_slip/get_deductions_List_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_earnings_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_pay_slip_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_payment_information_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_summary_of_payment_list_model.dart'; + +class MonthlyPaySlipApiClient { + static final MonthlyPaySlipApiClient _instance = MonthlyPaySlipApiClient._internal(); + + MonthlyPaySlipApiClient._internal(); + + factory MonthlyPaySlipApiClient() => _instance; + + Future> getPaySlip() async { + String url = "${ApiConsts.erpRest}GET_PAYSLIP"; + Map postParams = {"P_MENU_TYPE": "E", "P_SELECTED_RESP_ID": -999}; + postParams.addAll(AppState().postParamsJson); + print(postParams); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getPayslipList ?? []; + }, url, postParams); + } + + Future> getSummaryOfPayment(int pActionContextID) async { + String url = "${ApiConsts.erpRest}GET_SUMMARY_OF_PAYMENT"; + Map postParams = {"P_ACTION_CONTEXT_ID": pActionContextID}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getSummaryOfPaymentList ?? []; + }, url, postParams); + } + + Future> getPaymentInformation(int pActionContextID) async { + String url = "${ApiConsts.erpRest}GET_PAYMENT_INFORMATION"; + Map postParams = {"P_ACTION_CONTEXT_ID": pActionContextID}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getPaymentInformationList ?? []; + }, url, postParams); + } + + Future> getDeductions(int pActionContextID) async { + String url = "${ApiConsts.erpRest}GET_DEDUCTIONS"; + Map postParams = {"P_ACTION_CONTEXT_ID": pActionContextID, "P_PAGE_LIMIT": 100, "P_PAGE_NUM": 1}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getDeductionsList ?? []; + }, url, postParams); + } + + Future> getEarnings(int pActionContextID) async { + String url = "${ApiConsts.erpRest}GET_EARNINGS"; + Map postParams = {"P_ACTION_CONTEXT_ID": pActionContextID, "P_PAGE_LIMIT": 100, "P_PAGE_NUM": 1}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getEarningsList ?? []; + }, url, postParams); + } +} diff --git a/lib/api/mowadhafhi/mowadhafhi_api_client.dart b/lib/api/mowadhafhi/mowadhafhi_api_client.dart new file mode 100644 index 0000000..e5ecc4b --- /dev/null +++ b/lib/api/mowadhafhi/mowadhafhi_api_client.dart @@ -0,0 +1,135 @@ +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/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'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_section_topics.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/models/mowadhafhi/get_ticket_types.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_tickets_list.dart'; + +class MowadhafhiApiClient { + static final MowadhafhiApiClient _instance = MowadhafhiApiClient._internal(); + + MowadhafhiApiClient._internal(); + + factory MowadhafhiApiClient() => _instance; + + Future> getTicketsByEmployee() async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetTicketsByEmployee"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgPageSize": 10, "ItgPageNo": 1}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getTicketsByEmployeeList ?? []; + }, url, postParams); + } + + Future> getTicketDetailsByEmployee(String? itgTicketID) async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetTicketDetails"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgTicketId": itgTicketID}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getTicketDetailsByEmployee ?? []; + }, url, postParams); + } + + Future> getTicketTransactions(String? itgTicketID) async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetTicketTransaction"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgTicketId": itgTicketID}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getTicketTransactions ?? []; + }, url, postParams); + } + + Future> getTicketTypes() async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetTicketTypes"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getTicketTypes ?? []; + }, url, postParams); + } + + Future> getProjects() async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetProjects"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgProjectCode": AppState().memberInformationList?.pAYROLLCODE}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getMowadhafhiProjects ?? []; + }, url, postParams); + } + + Future> getProjectDepartments(int projectID) async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetProjectDepartments"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgProjectId": projectID}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getProjectDepartments ?? []; + }, url, postParams); + } + + Future> getDepartmentSections(int? projectDepartmentID) async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetDepartmentSections"; + Map postParams = { + "EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, + "ItgDepartmentSectionId": projectDepartmentID, + "ItgProjectDepartmentId": projectDepartmentID + }; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getDepartmentSections ?? []; + }, url, postParams); + } + + Future> getSectionTopics(int? departmentSectionID) async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetSectionTopics"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgDepartmentSectionId": departmentSectionID}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getSectionTopics ?? []; + }, url, postParams); + } + + Future submitRequest(int? departmentID, String description, int? projectID, String? sectionID, String? sectionTopicID, int? ticketTypeID, List> attachmentList) async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_CreateTicketMobile"; + Map postParams = { + "EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, + "ItgImageCollList": attachmentList, + "channelId": 3, + "departmentId": departmentID, + "description": description, + "employeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, + "projectId": projectID, + "sectionId": sectionID, + "sectionTopicId": sectionTopicID, + "ticketStatus": "new", + "ticketTypeId": ticketTypeID + }; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.messageStatus; + }, url, postParams); + } +} diff --git a/lib/api/my_attendance_api_client.dart b/lib/api/my_attendance_api_client.dart index f49aa1e..b98aed4 100644 --- a/lib/api/my_attendance_api_client.dart +++ b/lib/api/my_attendance_api_client.dart @@ -3,10 +3,13 @@ import 'dart:async'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/get_approves_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart'; +import 'package:mohem_flutter_app/models/start_eit_approval_process_model.dart'; +import 'package:mohem_flutter_app/models/submit_eit_transaction_list_model.dart'; -import 'api_client.dart'; +import 'package:mohem_flutter_app/api/api_client.dart'; class MyAttendanceApiClient { static final MyAttendanceApiClient _instance = MyAttendanceApiClient._internal(); @@ -54,4 +57,104 @@ class MyAttendanceApiClient { return responseData.getValueSetValuesList!.first; }, url, postParams); } + + Future getDefaultValue(String pSegmentName, String pDescFlexContextCode, String pDescFlexName, List> list) async { + String url = "${ApiConsts.erpRest}GET_DEFAULT_VALUE"; + Map postParams = { + "P_SELECTED_RESP_ID": -999, + "P_MENU_TYPE": "E", + "P_PARENT_VALUE": null, + "P_SEGMENT_NAME": pSegmentName, + "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, + "P_DESC_FLEX_NAME": pDescFlexName, + "GetValueSetValuesTBL": list, + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); + }, url, postParams); + } + + Future validateEitTransaction(String pDescFlexContextCode, String pFunctionName, List> list) async { + String url = "${ApiConsts.erpRest}VALIDATE_EIT_TRANSACTION"; + Map postParams = { + "P_SELECTED_RESP_ID": -999, + "P_MENU_TYPE": "E", + "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, + "P_FUNCTION_NAME": pFunctionName, + // "EITTransactionTBL": list, + }; + print(postParams); + postParams["EITTransactionTBL"] =list; + + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); + }, url, postParams); + } + + Future submitEitTransaction(String pDescFlexContextCode, String pFunctionName, List> list) async { + String url = "${ApiConsts.erpRest}SUBMIT_EIT_TRANSACTION"; + Map postParams = { + "P_SELECTED_RESP_ID": -999, + "P_MENU_TYPE": "E", + "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, + "P_FUNCTION_NAME": pFunctionName, + //"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()); + }, url, postParams); + } + + Future> getApproversList(String pAmeTransactionType, int pTransactionId) async { + String url = "${ApiConsts.erpRest}GET_APPROVERS_LIST"; + Map postParams = { + "P_AME_TRANSACTION_TYPE": pAmeTransactionType, + "P_PAGE_LIMIT": 1000, + "P_PAGE_NUM": 1, + "P_TRANSACTION_ID": pTransactionId, + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getApprovesList ?? []; + }, url, postParams); + } + + Future> addAttachment(List> list) async { + String url = "${ApiConsts.erpRest}ADD_ATTACHMENT"; + Map postParams = {"AddAttachmentList": list}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getApprovesList ?? []; + }, url, postParams); + } + + Future startEitApprovalProcess(String action, String comments, String itemKey, int transactionId) async { + String url = "${ApiConsts.erpRest}START_EIT_APPROVAL_PROCESS"; + Map postParams = { + "P_SELECTED_RESP_ID": -999, + "P_MENU_TYPE": "E", + "P_ACTION_MODE": action, + "P_COMMENTS": comments, + "P_ITEM_KEY": itemKey, + "P_TRANSACTION_ID": transactionId, + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.startEitApprovalProcess; + }, url, postParams); + } } diff --git a/lib/api/pending_transactions_api_client.dart b/lib/api/pending_transactions_api_client.dart new file mode 100644 index 0000000..b8ddd60 --- /dev/null +++ b/lib/api/pending_transactions_api_client.dart @@ -0,0 +1,48 @@ +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/pending_transactions/get_pending_transactions_details.dart'; +import 'package:mohem_flutter_app/models/pending_transactions/get_req_functions.dart'; + +// todo '@haroon' kindly format code + +class PendingTransactionsApiClient { + static final PendingTransactionsApiClient _instance = PendingTransactionsApiClient._internal(); + + PendingTransactionsApiClient._internal(); + + factory PendingTransactionsApiClient() => _instance; + + Future> getPendingReqFunctions() async { + String url = "${ApiConsts.erpRest}GET_PENDING_REQ_FUNCTIONS"; + Map postParams = {}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getPendingTransactionsFunctions ?? []; + }, url, postParams); + } + + Future> getPendingTransactionsDetails(String functionID, String dateFrom, String dateTo) async { + String url = "${ApiConsts.erpRest}GET_PENDING_REQ_DETAILS"; + Map postParams = {"P_FUNCTION_ID": functionID, "P_PAGE_LIMIT": 20, "P_PAGE_NUM": 1, "P_CREATION_DATE_FROM": dateFrom, "P_CREATION_DATE_TO": dateTo}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getPendingTransactionsDetails ?? []; + }, url, postParams); + } + + Future getAnnouncements(int itgAwarenessID, int itgPageNo, int itgRowID) async { + String url = "${ApiConsts.cocRest}GetAnnouncementDiscountsConfigData"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER.toString(), "ItgAwarenessID": itgAwarenessID, "ItgPageNo": itgPageNo, "ItgPageSize": 5, "ItgRowID": itgRowID}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.mohemmITGResponseItem ?? ""; + }, url, postParams); + } +} diff --git a/lib/api/profile_api_client.dart b/lib/api/profile_api_client.dart index 3039e67..2d08952 100644 --- a/lib/api/profile_api_client.dart +++ b/lib/api/profile_api_client.dart @@ -9,7 +9,7 @@ import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; import 'package:mohem_flutter_app/models/get_employee_phones_model.dart'; import 'package:mohem_flutter_app/models/profile/phone_number_types_modek.dart'; -import 'api_client.dart'; +import 'package:mohem_flutter_app/api/api_client.dart'; class ProfileApiClient { static final ProfileApiClient _instance = ProfileApiClient._internal(); @@ -27,6 +27,7 @@ class ProfileApiClient { postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + print(responseData); return responseData.getEmployeeContactsList ?? []; }, url, postParams); } diff --git a/lib/api/tangheem_user_api_client.dart b/lib/api/tangheem_user_api_client.dart deleted file mode 100644 index 32a5a82..0000000 --- a/lib/api/tangheem_user_api_client.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'dart:async'; - -import 'package:mohem_flutter_app/classes/consts.dart'; -import 'package:mohem_flutter_app/models/content_info_model.dart'; -import 'package:mohem_flutter_app/models/member_login_list_model.dart'; -import 'package:mohem_flutter_app/models/surah_model.dart'; - -import 'api_client.dart'; - -class TangheemUserApiClient { - static final TangheemUserApiClient _instance = TangheemUserApiClient._internal(); - - TangheemUserApiClient._internal(); - - factory TangheemUserApiClient() => _instance; - - // Future getSurahs() async { - // String url = "${ApiConsts.tangheemUsers}AlSuar_Get"; - // var postParams = {}; - // return await ApiClient().postJsonForObject((json) => SurahModel.fromJson(json), url, postParams); - // } - // - // Future getMembers() async { - // String url = "${ApiConsts.tangheemUsers}Committee_Get"; - // var postParams = {}; - // return await ApiClient().postJsonForObject((json) => MemberModel.fromJson(json), url, postParams); - // } - // - // Future getContentInfo(int contentId) async { - // String url = "${ApiConsts.tangheemUsers}ContentInfo_Get"; - // var postParams = {"contentTypeId": contentId}; - // return await ApiClient().postJsonForObject((json) => ContentInfoModel.fromJson(json), url, postParams); - // } -} diff --git a/lib/api/worklist/worklist_api_client.dart b/lib/api/worklist/worklist_api_client.dart index 2cb4a5c..bc05627 100644 --- a/lib/api/worklist/worklist_api_client.dart +++ b/lib/api/worklist/worklist_api_client.dart @@ -20,17 +20,14 @@ import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_mod import 'package:mohem_flutter_app/models/itg_forms_models/itg_request_model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_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'; +import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_contact_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/get_phones_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; -import '../../models/worklist/hr/eit_otification_body_model.dart'; -import '../../models/worklist/get_favorite_replacements_model.dart'; -import '../../models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; -import '../../models/worklist/hr/get_contact_notification_body_list_model.dart'; -import '../../models/worklist/hr/get_phones_notification_body_list_model.dart'; -import '../../models/worklist/hr/get_phones_notification_body_list_model.dart'; - class WorkListApiClient { static final WorkListApiClient _instance = WorkListApiClient._internal(); diff --git a/lib/classes/app_permissions.dart b/lib/classes/app_permissions.dart index a70342c..983b400 100644 --- a/lib/classes/app_permissions.dart +++ b/lib/classes/app_permissions.dart @@ -1,7 +1,7 @@ import 'package:permission_handler/permission_handler.dart'; class AppPermissions{ - static location(Function(bool) completion) { + static void location(Function(bool) completion) { Permission.location.isGranted.then((isGranted){ if(!isGranted){ Permission.location.request().then((granted){ @@ -13,7 +13,7 @@ class AppPermissions{ } - static checkAll(Function(bool) completion){ + static void checkAll(Function(bool) completion){ [ Permission.location ].request().then((value){ diff --git a/lib/classes/date_uitl.dart b/lib/classes/date_uitl.dart index c350cb6..8754fdb 100644 --- a/lib/classes/date_uitl.dart +++ b/lib/classes/date_uitl.dart @@ -61,7 +61,7 @@ class DateUtil { static String convertDateToString(DateTime date) { const start = "/Date("; - const end = "+0300)"; + const end = "+0300)/"; int milliseconds = date.millisecondsSinceEpoch; return start + "$milliseconds" + end; @@ -133,7 +133,7 @@ class DateUtil { /// get month by /// [month] convert month number in to month name - static getMonth(int month) { + static String getMonth(int month) { switch (month) { case 1: return "January"; @@ -159,12 +159,14 @@ class DateUtil { return "November"; case 12: return "December"; + default: + return ""; } } /// get month by /// [month] convert month number in to month name in Arabic - static getMonthArabic(int month) { + static String getMonthArabic(int month) { switch (month) { case 1: return "يناير"; @@ -190,10 +192,12 @@ class DateUtil { return " نوفمبر"; case 12: return "ديسمبر"; + default: + return ""; } } - static getMonthByName(String month) { + static int getMonthByName(String month) { switch (month.toLowerCase()) { case 'january': return 1; @@ -219,6 +223,8 @@ class DateUtil { return 11; case 'december': return 12; + default: + return 0; } } @@ -234,7 +240,7 @@ class DateUtil { /// get month by /// [weekDay] convert week day in int to week day name - static getWeekDay(int weekDay) { + static String getWeekDay(int weekDay) { switch (weekDay) { case 1: return "Monday"; @@ -250,12 +256,14 @@ class DateUtil { return "Saturday "; case 7: return "Sunday"; + default: + return ""; } } /// get month by /// [weekDay] convert week day in int to week day name arabic - static getWeekDayArabic(int weekDay) { + static String getWeekDayArabic(int weekDay) { switch (weekDay) { case 1: return "الاثنين"; @@ -271,10 +279,12 @@ class DateUtil { return "السبت "; case 7: return "الاحد"; + default: + return ""; } } - static getWeekDayEnglish(int weekDay) { + static String getWeekDayEnglish(int weekDay) { switch (weekDay) { case 1: return "Monday"; @@ -290,6 +300,8 @@ class DateUtil { return "Saturday "; case 7: return "Sunday"; + default: + return ""; } } @@ -415,7 +427,7 @@ class DateUtil { return DateFormat(formattedString).format(dateTime); } - static convertISODateToJsonDate(String isoDate) { + static String convertISODateToJsonDate(String isoDate) { return "/Date(" + DateFormat('mm-dd-yyy').parse(isoDate).millisecondsSinceEpoch.toString() + ")/"; } diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 4393e8b..292bc4c 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -1,25 +1,37 @@ import 'dart:convert'; import 'dart:typed_data'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/config/routes.dart'; - -// import 'package:fluttertoast/fluttertoast.dart'; import 'package:mohem_flutter_app/exceptions/api_exception.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/widgets/dialogs/confirm_dialog.dart'; import 'package:mohem_flutter_app/widgets/loading_dialog.dart'; import 'package:shared_preferences/shared_preferences.dart'; +// ignore_for_file: avoid_annotating_with_dynamic class Utils { static bool _isLoadingVisible = false; static bool get isLoading => _isLoadingVisible; - static void showToast(String message) { + static void showToast(String message, {bool longDuration = false}) { Fluttertoast.showToast( - msg: message, toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, timeInSecForIosWeb: 1, backgroundColor: Colors.black54, textColor: Colors.white, fontSize: 16.0); + msg: message, + toastLength: longDuration ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM, + timeInSecForIosWeb: 1, + backgroundColor: Colors.black54, + textColor: Colors.white, + fontSize: 16.0); } static dynamic getNotNullValue(List list, int index) { @@ -39,7 +51,7 @@ class Utils { } static void showLoading(BuildContext context) { - WidgetsBinding.instance?.addPostFrameCallback((_) { + WidgetsBinding.instance.addPostFrameCallback((_) { _isLoadingVisible = true; showDialog( context: context, @@ -112,12 +124,30 @@ class Utils { ); } - static getPostBytes(img) { + static Widget getNoDataWidget(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset('assets/images/not_found.svg', width: 110.0, height: 110.0), + Container(margin: const EdgeInsets.only(top: 15.0), child: LocaleKeys.noDataAvailable.tr().toText16().center), + ], + ).center; + } + + static Uint8List getPostBytes(img) { try { var b64 = img.replaceFirst('data:image/png;base64,', ''); if (img != null && Utils.isBase64(b64)) return Utils.dataFromBase64String(b64); } catch (e) {} - return null; + return Uint8List.fromList([]); + } + + static String getBase64FromJpeg(img) { + try { + var b64 = img.replaceFirst('data:image/jpeg;base64,', ''); + return b64; + } catch (e) {} + return ""; } static bool isBase64(String str) { @@ -128,4 +158,38 @@ class Utils { static Uint8List dataFromBase64String(String base64String) { return base64Decode(base64String); } + + static Widget tableColumnTitle(String? text, {bool showDivider = true, bool alignCenter = false}) { + text ??= ""; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + 6.height, + alignCenter ? text.toText12().center : text.toText12(), + 5.height, + if (showDivider) + const Divider( + height: 1, + color: Color(0xff2E303A), + thickness: 1, + ) + ], + ); + } + + static Widget tableColumnValue(String text, {bool isCapitable = true, bool alignCenter = false}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + 12.height, + if (alignCenter) + (isCapitable ? text.toLowerCase().capitalizeFirstofEach : text).toText12(color: MyColors.normalTextColor).center + else + (isCapitable ? text.toLowerCase().capitalizeFirstofEach : text).toText12(color: MyColors.normalTextColor), + 12.height, + ], + ); + } } diff --git a/lib/config/routes.dart b/lib/config/routes.dart index e377b8a..0f71ab5 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/ui/attendance/monthly_attendance.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'; import 'package:mohem_flutter_app/ui/login/forgot_password_screen.dart'; @@ -6,26 +8,33 @@ import 'package:mohem_flutter_app/ui/login/login_screen.dart'; import 'package:mohem_flutter_app/ui/login/new_password_screen.dart'; import 'package:mohem_flutter_app/ui/login/verify_last_login_screen.dart'; import 'package:mohem_flutter_app/ui/login/verify_login_screen.dart'; +import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart'; +import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/my_attendance_screen.dart'; +import 'package:mohem_flutter_app/ui/payslip/monthly_pay_slip_screen.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/delete_familyMember.dart'; import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_profile_screen.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/screens/announcements/announcement_details.dart'; +import 'package:mohem_flutter_app/ui/screens/announcements/announcements.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'; +import 'package:mohem_flutter_app/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart'; +import 'package:mohem_flutter_app/ui/screens/mowadhafhi/request_details.dart'; +import 'package:mohem_flutter_app/ui/screens/pending_transactions/pending_transactions.dart'; +import 'package:mohem_flutter_app/ui/screens/pending_transactions/pending_transactions_details.dart'; import 'package:mohem_flutter_app/ui/screens/profile/profile_screen.dart'; import 'package:mohem_flutter_app/ui/screens/submenu_screen.dart'; -import 'package:mohem_flutter_app/ui/profile/family_members.dart'; -import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/item_history_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/itg_detail_screen.dart'; -import 'package:mohem_flutter_app/ui/work_list/worklist_detail_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/work_list_screen.dart'; -import 'package:mohem_flutter_app/ui/bottom_sheets/attendence_details_bottom_sheet.dart'; -import 'package:mohem_flutter_app/ui/attendance/monthly_attendance.dart'; -import 'package:mohem_flutter_app/ui/profile/profile.dart'; -import 'package:mohem_flutter_app/ui/profile/personal_info.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/family_members.dart'; +import 'package:mohem_flutter_app/ui/work_list/worklist_detail_screen.dart'; class AppRoutes { static const String splash = "/splash"; @@ -52,10 +61,12 @@ class AppRoutes { static const String myAttendance = "/myAttendance"; static const String dynamicScreen = "/dynamicScreen"; static const String addDynamicInput = "/addDynamicInput"; + static const String requestSubmitScreen = "/requestSubmitScreen"; //profile static const String addDynamicInputProfile = 'addDynamicInputProfile'; + //Attendance static const String attendance = "/attendance"; static const String monthlyAttendance = "/monthlyAttendance"; @@ -69,6 +80,23 @@ class AppRoutes { static const String basicDetails = "/basicDetails"; static const String contactDetails = "/contactDetails"; static const String familyMembers = "/familyMembers"; + static const String deleteFamilyMember = "/deleteFamilyMember"; + + // Mowadhafhi + static const String mowadhafhi = "/mowadhafhi"; + static const String mowadhafhiDetails = "/mowadhafhiDetails"; + static const String mowadhafhiHRRequest = "/mowadhafhiHRRequest"; + + // Pending Transactions + static const String pendingTransactions = "/pendingTransactions"; + static const String pendingTransactionsDetails = "/pendingTransactionsDetails"; + + // Announcements + static const String announcements = "/announcements"; + static const String announcementsDetails = "/announcementsDetails"; + + //Pay slip + static const String monthlyPaySlip = "/monthlyPaySlip"; static final Map routes = { login: (context) => LoginScreen(), @@ -110,5 +138,21 @@ class AppRoutes { dynamicScreen: (context) => DynamicListViewScreen(), addDynamicInput: (context) => DynamicInputScreen(), addDynamicInputProfile: (context) => DynamicInputScreenProfile(), + deleteFamilyMember: (context) => DeleteFamilyMember(), + requestSubmitScreen: (context) => RequestSubmitScreen(), + + //mowadhafhi + mowadhafhi: (context) => MowadhafhiHome(), + mowadhafhiDetails: (context) => MowadhafhiRequestDetails(), + mowadhafhiHRRequest: (context) => MowadhafhiHRRequest(), + + pendingTransactions: (context) => PendingTransactions(), + pendingTransactionsDetails: (context) => PendingTransactionsDetails(), + + announcements: (context) => Announcements(), + announcementsDetails: (context) => AnnouncementDetails(), + + //pay slip + monthlyPaySlip: (context) => MonthlyPaySlipScreen(), }; } diff --git a/lib/dialogs/otp_dialog.dart b/lib/dialogs/otp_dialog.dart index 3789980..b761f00 100644 --- a/lib/dialogs/otp_dialog.dart +++ b/lib/dialogs/otp_dialog.dart @@ -218,12 +218,12 @@ class OtpDialog { } } - static getSignature() async { - // if (Platform.isAndroid) { - // return await SmsRetriever.getAppSignature(); - // } else { - // return null; - // } - } + // static getSignature() async { + // // if (Platform.isAndroid) { + // // return await SmsRetriever.getAppSignature(); + // // } else { + // // return null; + // // } + // } } diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 36ed7d3..869b61c 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -1,8 +1,6 @@ -import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/cupertino.dart'; import 'package:intl/intl.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; -import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; extension CapExtension on String { String get toCamelCase => "${this[0].toUpperCase()}${this.substring(1)}"; @@ -25,11 +23,12 @@ extension EmailValidator on String { Widget toText11({Color? color, bool isUnderLine = false, bool isBold = false}) => Text( this, style: TextStyle( - fontSize: 11, - fontWeight: isBold ? FontWeight.bold : FontWeight.w600, - color: color ?? MyColors.darkTextColor, - letterSpacing: -0.33, - decoration: isUnderLine ? TextDecoration.underline : null), + fontSize: 11, + fontWeight: isBold ? FontWeight.bold : FontWeight.w600, + color: color ?? MyColors.darkTextColor, + letterSpacing: -0.33, + decoration: isUnderLine ? TextDecoration.underline : null, + ), ); Widget toText12({Color? color, bool isUnderLine = false, bool isBold = false, bool isCenter = false, int maxLine = 0}) => Text( @@ -37,11 +36,12 @@ extension EmailValidator on String { textAlign: isCenter ? TextAlign.center : null, maxLines: (maxLine > 0) ? maxLine : null, style: TextStyle( - fontSize: 12, - fontWeight: isBold ? FontWeight.bold : FontWeight.w600, - color: color ?? MyColors.darkTextColor, - letterSpacing: -0.72, - decoration: isUnderLine ? TextDecoration.underline : null), + fontSize: 12, + fontWeight: isBold ? FontWeight.bold : FontWeight.w600, + color: color ?? MyColors.darkTextColor, + letterSpacing: -0.72, + decoration: isUnderLine ? TextDecoration.underline : null, + ), ); Widget toText13({Color? color, bool isUnderLine = false}) => Text( @@ -54,7 +54,7 @@ extension EmailValidator on String { style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 14, letterSpacing: -0.48, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), ); - Widget toText16({Color? color, bool isBold = false,int? maxlines}) => Text( + Widget toText16({Color? color, bool isBold = false, int? maxlines}) => Text( this, maxLines: maxlines, style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 16, letterSpacing: -0.64, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), @@ -66,9 +66,9 @@ extension EmailValidator on String { ); Widget toText20({Color? color, bool isBold = false}) => Text( - this, - style: TextStyle(height: 1, color: color ?? MyColors.darkTextColor, fontSize: 20, letterSpacing: -1.44, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), - ); + this, + style: TextStyle(fontSize: 20, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4), + ); Widget toText22({Color? color, bool isBold = false}) => Text( this, @@ -86,9 +86,9 @@ extension EmailValidator on String { ); Widget toText44({Color? color, bool isBold = false}) => Text( - this, - style: TextStyle(height: 32 / 32, color: color ?? MyColors.darkTextColor, fontSize: 44, letterSpacing: -2.64, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), - ); + this, + style: TextStyle(height: 32 / 32, color: color ?? MyColors.darkTextColor, fontSize: 44, letterSpacing: -2.64, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), + ); Widget toSectionHeading({String upperHeading = "", String lowerHeading = ""}) { String upper = ""; @@ -133,7 +133,7 @@ extension EmailValidator on String { return "${dates[2]} ${getMonth(int.parse(dates[1]))} ${dates[0]} ${DateFormat('hh:mm a').format(DateFormat('hh:mm:ss').parse(time))}"; } - getMonth(int month) { + String getMonth(int month) { switch (month) { case 1: return "January"; @@ -159,6 +159,8 @@ extension EmailValidator on String { return "November"; case 12: return "December"; + default: + return ""; } } } diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index f511422..36d523a 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -21,8 +21,8 @@ extension WidgetExtensions on Widget { baseColor: Color(0xffe8eff0), highlightColor: Colors.white, child: Container( - child: this, color: Colors.white, + child: this, ), ) : Container( diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index c5e0f05..8ab7d0b 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -40,7 +40,7 @@ class CodegenLoader extends AssetLoader{ "checkIn": "تحقق في", "workList": "قائمة العمل", "leaveBalance": "رصيد الاجازات", - "missingSwipes": "الضربات الشديدة في عداد المفقودين", + "missingSwipes": "تسجيل بصمة حضور", "ticketBalance": "رصيد التذكرة", "other": "آخر", "services": "خدمات", @@ -69,6 +69,29 @@ class CodegenLoader extends AssetLoader{ "passwordChangedSuccessfully": "تم تغيير الرقم السري بنجاح", "itemsForSale": "سلع للبيع", "attendanceDetails": "تفاصيل الحضور", + "order": "الطلبات", + "earlyOut": "الخروج مبكرا", + "shortage": "ساعات التقصير", + "excess": "فائض", + "lateIn": "القدوم المتاخر", + "approvedCheckOut": "اعتماد وقت الخروج", + "approvedCheckIn": "اعتماد وقت الدخول", + "actualCheckOut": "وقت الخروج", + "actualCheckIn": "وقت الدخول", + "present": "حضور", + "pres": "حضور", + "shiftTime": "وقت التناوب", + "absent": "غياب", + "attendance": "الحضور", + "scheduleDays": "ايام العمل", + "offDays": "ايام الراحه", + "nonAnalyzed": "لايوجد تحليل", + "shortageHour": "ساعات التقصير", + "stats": "الحاله", + "completed": "تم اكمال", + "msg": "Hello {} in the {} world ", + "msg_named": "{} are written in the {lang} language", + "clickMe": "Click me", "doNotUseRecentPassword": "لا تستخدم كلمة مرور حديثة", "atLeastOneLowercase": "حرف صغير واحد على الأقل", "atLeastOneUppercase": "حرف كبير واحد على الأقل", @@ -188,9 +211,6 @@ class CodegenLoader extends AssetLoader{ "rfqUOM": "RFQ UOM", "rfqQty": "RFQ الكمية", "rfqNumber": "رقم RFQ", - "msg": "Hello {} in the {} world ", - "msg_named": "{} are written in the {lang} language", - "clickMe": "Click me", "human": "بشري", "resources": "موارد", "details": "تفاصيل", @@ -225,14 +245,52 @@ class CodegenLoader extends AssetLoader{ "approvalLevel": "مستوى الموافقة", "requesterDetails": "تفاصيل مقدم الطلب", "myAttendance": "حضوري", - "workOnBreak": "العمل على استراحة", + "workOnBreak": "التعويض عن العمل اثناءالاستراحه", "next": "التالي", + "mobile": "التليفون المحمول", + "completingYear": "نحن نقدر لك لاستكمال خدمة", + "year": "سنة", + "month": "شهر", + "day": "يوم", + "address": "العنوان", + "phoneNumber": "رقم الجوال", + "businessGroup": "مجموعة العمل", + "Payroll": "الراتب", + "civilIdentityNumber": "رقم الهويه", + "dateOfBirth": "تاريخ الميلاد", + "maritalStatus ": "الحالة الاجتماعية", + "fullName": "الأسم الكامل", + "remove": "حذف", + "submit": "ارسال", + "areYouSureYouWantToSubmit": "هل أنت متأكد أنك تريد أن تقدم؟", + "comments": "تعليقات", + "writeComment": "أكتب تعليقا", + "approversList": "قائمة الموافقين", + "yourRequestHasBeenSubmittedForApprovals": "تم تقديم طلبك للموافقات", + "monthlyPaySlip": "قسيمة الراتب الشهرية", + "particular": "خاص", + "earnings": "أرباح", + "deductions": "الخصومات", + "paymentMethodName": "اسم طريقة الدفع", + "bankName": "اسم البنك", + "branchCode": "رمز الفرع", + "accountNo": "رقم الحساب", + "summaryOfInformation": "ملخص المعلومات", + "totalPayAmount": "المبلغ الإجمالي للدفع", + "paymentInformation": "معلومات الدفع", + "amount": "مقدار", "profile": { "reset_password": { "label": "Reset Password", "username": "Username", "password": "password" - } + }, + "profileCompletionPer": "استكمال الملف الشخصي", + "completeProfile": "الملف الشخصي الكامل", + "personalInformation": "معلومات شخصية", + "basicDetails": "تفاصيل أساسية", + "contactDetails": "بيانات التواصل", + "familyDetails": "تفاصيل عائلية" }, "clicked": { "zero": "You clicked {} times!", @@ -242,14 +300,6 @@ class CodegenLoader extends AssetLoader{ "many": "You clicked {} times!", "other": "You clicked {} times!" }, - "amount": { - "zero": "Your amount : {} ", - "one": "Your amount : {} ", - "two": "Your amount : {} ", - "few": "Your amount : {} ", - "many": "Your amount : {} ", - "other": "Your amount : {} " - }, "gender": { "male": "Hi man ;) ", "female": "Hello girl :)", @@ -314,6 +364,27 @@ static const Map en_US = { "confirm": "Confirm", "passwordChangedSuccessfully": "Password changed successfully", "itemsForSale": "Items for Sale", + "attendanceDetails": "Attendance Details", + "order": "order", + "earlyOut": "Early Out", + "shortage": "Shortage", + "excess": "Excess", + "lateIn": "Late In", + "approvedCheckOut": "Approved Check Out", + "approvedCheckIn": "Approved Check In", + "actualCheckOut": "Actual Check Out", + "actualCheckIn": "Actual Check In", + "present": "PRESENT", + "pres": "present", + "shiftTime": "Shift Time", + "absent": "ABSENT", + "attendance": "Attendance", + "scheduleDays": "Schedule\nDays", + "offDays": "Off\nDays", + "nonAnalyzed": "Non\nAnalyzed", + "shortageHour": "Shortage\nHour", + "stats": "Stats", + "completed": "Completed", "doNotUseRecentPassword": "Do not use recent password", "atLeastOneLowercase": "At least one lowercase", "atLeastOneUppercase": "At least one uppercase", @@ -328,7 +399,6 @@ static const Map en_US = { "whatsapp": "Whatsapp", "reject": "Reject", "approve": "Approve", - "attendanceDetails": "Attendence Details", "cancel": "Cancel", "requestedItems": "Requested Items", "request": "Request", @@ -473,12 +543,51 @@ static const Map en_US = { "myAttendance": "My Attendance", "workOnBreak": "Work On Break", "next": "Next", + "mobile": "Mobile", + "year": "Year", + "month": "Month", + "day": "Day", + "completingYear": "We appreciate you for completing the service of", + "address": "Address", + "phoneNumber": "Phone Number", + "businessGroup": "Business", + "Payroll": "Payroll", + "civilIdentityNumber": "Civil Identity Number", + "dateOfBirth": "Date of Birth", + "maritalStatus ": "Marital Status ", + "fullName": "Full Name", + "remove": "Remove", + "Attendance": "Attendance", + "submit": "Submit", + "areYouSureYouWantToSubmit": "Are you sure you want to submit?", + "comments": "Comments", + "writeComment": "Write a comment", + "approversList": "Approvers List", + "yourRequestHasBeenSubmittedForApprovals": "Your request has been submitted for approvals", + "monthlyPaySlip": "Monthly Pay Slip", + "particular": "Particular", + "earnings": "Earnings", + "deductions": "Deductions", + "paymentMethodName": "Payment Method Name", + "bankName": "Bank Name", + "branchCode": "Branch Code", + "accountNo": "Account No", + "summaryOfInformation": "Summary of Information", + "totalPayAmount": "Total Pay Amount", + "paymentInformation": "Payment Information", + "amount": "Amount", "profile": { "reset_password": { "label": "Reset Password", "username": "Username", "password": "password" - } + }, + "profileCompletionPer": "Profile Completion", + "completeProfile": "Complete Profile", + "personalInformation": "Personal Information", + "basicDetails": "Basic Details", + "contactDetails": "Contact Details", + "familyDetails": "Family Members" }, "clicked": { "zero": "You clicked {} times!", @@ -488,14 +597,6 @@ static const Map en_US = { "many": "You clicked {} times!", "other": "You clicked {} times!" }, - "amount": { - "zero": "Your amount : {} ", - "one": "Your amount : {} ", - "two": "Your amount : {} ", - "few": "Your amount : {} ", - "many": "Your amount : {} ", - "other": "Your amount : {} " - }, "gender": { "male": "Hi man ;) ", "female": "Hello girl :)", diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 230e45b..5271370 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -232,6 +232,7 @@ abstract class LocaleKeys { static const myAttendance = 'myAttendance'; static const workOnBreak = 'workOnBreak'; static const next = 'next'; + static const mobile = 'mobile'; static const completingYear = 'completingYear'; static const year = 'year'; static const month = 'month'; @@ -245,6 +246,24 @@ abstract class LocaleKeys { static const maritalStatus = 'maritalStatus '; static const fullName = 'fullName'; static const remove = 'remove'; + static const submit = 'submit'; + static const areYouSureYouWantToSubmit = 'areYouSureYouWantToSubmit'; + static const comments = 'comments'; + static const writeComment = 'writeComment'; + static const approversList = 'approversList'; + static const yourRequestHasBeenSubmittedForApprovals = 'yourRequestHasBeenSubmittedForApprovals'; + static const monthlyPaySlip = 'monthlyPaySlip'; + static const particular = 'particular'; + static const earnings = 'earnings'; + static const deductions = 'deductions'; + static const paymentMethodName = 'paymentMethodName'; + static const bankName = 'bankName'; + static const branchCode = 'branchCode'; + static const accountNo = 'accountNo'; + static const summaryOfInformation = 'summaryOfInformation'; + static const totalPayAmount = 'totalPayAmount'; + static const paymentInformation = 'paymentInformation'; + static const amount = 'amount'; 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'; @@ -257,7 +276,6 @@ abstract class LocaleKeys { static const profile_familyDetails = 'profile.familyDetails'; static const profile = 'profile'; static const clicked = 'clicked'; - static const amount = 'amount'; static const gender_with_arg = 'gender.with_arg'; static const gender = 'gender'; static const reset_locale = 'reset_locale'; diff --git a/lib/main.dart b/lib/main.dart index c894b70..cd00082 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,23 +1,19 @@ import 'dart:io'; -import 'dart:typed_data'; import 'package:easy_localization/easy_localization.dart'; +import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; +import 'package:logger/logger.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; -import 'package:mohem_flutter_app/config/app_provider.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/generated/codegen_loader.g.dart'; import 'package:mohem_flutter_app/models/post_params_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/eit_provider_model.dart'; import 'package:mohem_flutter_app/theme/app_theme.dart'; -import 'package:mohem_flutter_app/widgets/nfc/nfc_reader_sheet.dart'; -import 'package:nfc_manager/nfc_manager.dart'; -import 'package:nfc_manager/platform_tags.dart'; +import 'package:month_year_picker/month_year_picker.dart'; import 'package:provider/provider.dart'; import 'package:sizer/sizer.dart'; -import 'package:firebase_core/firebase_core.dart'; -import 'config/routes.dart'; -import 'package:logger/logger.dart'; var logger = Logger( // filter: null, // Use the default LogFilter (-> only log in debug mode) @@ -30,7 +26,7 @@ Future main() async { await EasyLocalization.ensureInitialized(); await Firebase.initializeApp(); AppState().setPostParamsModel( - PostParamsModel(channel: 31, versionID: 3.7, mobileType: Platform.isAndroid ? "android" : "ios"), + PostParamsModel(channel: 31, versionID: 5.0, mobileType: Platform.isAndroid ? "android" : "ios"), ); runApp( EasyLocalization( @@ -70,10 +66,15 @@ class MyApp extends StatelessWidget { var obj = AppState().postParamsObject; obj?.languageID = EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2; AppState().setPostParamsModel(obj!); + List delegates = context.localizationDelegates; + // delegates.add(GlobalMaterialLocalizations.delegate); + delegates.add( + MonthYearPickerLocalizations.delegate, + ); return MaterialApp( theme: AppTheme.getTheme(EasyLocalization.of(context)?.locale.languageCode == "ar"), debugShowCheckedModeBanner: false, - localizationsDelegates: context.localizationDelegates, + localizationsDelegates: delegates, supportedLocales: context.supportedLocales, locale: context.locale, initialRoute: AppRoutes.initialRoute, diff --git a/lib/models/add_att_success_list_model.dart b/lib/models/add_att_success_list_model.dart new file mode 100644 index 0000000..e33fff2 --- /dev/null +++ b/lib/models/add_att_success_list_model.dart @@ -0,0 +1,18 @@ +class AddAttSuccessList { + bool? addSuccess; + int? attachmentID; + + AddAttSuccessList({this.addSuccess, this.attachmentID}); + + AddAttSuccessList.fromJson(Map json) { + addSuccess = json['AddSuccess']; + attachmentID = json['AttachmentID']; + } + + Map toJson() { + final Map data = new Map(); + data['AddSuccess'] = this.addSuccess; + data['AttachmentID'] = this.attachmentID; + return data; + } +} \ No newline at end of file diff --git a/lib/models/add_attachment_list_model.dart b/lib/models/add_attachment_list_model.dart new file mode 100644 index 0000000..e34d80c --- /dev/null +++ b/lib/models/add_attachment_list_model.dart @@ -0,0 +1,18 @@ +class AddAttachmentList { + String? pRETURNMSG; + String? pRETURNSTATUS; + + AddAttachmentList({this.pRETURNMSG, this.pRETURNSTATUS}); + + AddAttachmentList.fromJson(Map json) { + pRETURNMSG = json['P_RETURN_MSG']; + pRETURNSTATUS = json['P_RETURN_STATUS']; + } + + Map toJson() { + final Map data = new Map(); + data['P_RETURN_MSG'] = this.pRETURNMSG; + data['P_RETURN_STATUS'] = this.pRETURNSTATUS; + return data; + } +} \ No newline at end of file diff --git a/lib/models/attachment_model.dart b/lib/models/attachment_model.dart new file mode 100644 index 0000000..eb51dcf --- /dev/null +++ b/lib/models/attachment_model.dart @@ -0,0 +1,27 @@ +class AttachmentModel { + int? attachmentID; + String? pFILECONTENTTYPE; + String? pFILEDATA; + String? pFILENAME; + int? pTRANSACTIONID; + + AttachmentModel({this.attachmentID, this.pFILECONTENTTYPE, this.pFILEDATA, this.pFILENAME, this.pTRANSACTIONID}); + + AttachmentModel.fromJson(Map json) { + attachmentID = json['AttachmentID']; + pFILECONTENTTYPE = json['P_FILE_CONTENT_TYPE']; + pFILEDATA = json['P_FILE_DATA']; + pFILENAME = json['P_FILE_NAME']; + pTRANSACTIONID = json['P_TRANSACTION_ID']; + } + + Map toJson() { + final Map data = new Map(); + data['AttachmentID'] = this.attachmentID; + data['P_FILE_CONTENT_TYPE'] = this.pFILECONTENTTYPE; + data['P_FILE_DATA'] = this.pFILEDATA; + data['P_FILE_NAME'] = this.pFILENAME; + data['P_TRANSACTION_ID'] = this.pTRANSACTIONID; + return data; + } +} diff --git a/lib/models/dyanmic_forms/validate_eit_transaction_model.dart b/lib/models/dyanmic_forms/validate_eit_transaction_model.dart new file mode 100644 index 0000000..a543e5c --- /dev/null +++ b/lib/models/dyanmic_forms/validate_eit_transaction_model.dart @@ -0,0 +1,27 @@ +class ValidateEitTransactionModel { + int? tRANSACTIONNUMBER; + String? nAME; + String? vARCHAR2VALUE; + int? nUMBERVALUE; + String? dATEVALUE; + + ValidateEitTransactionModel({this.tRANSACTIONNUMBER, this.nAME, this.vARCHAR2VALUE, this.nUMBERVALUE, this.dATEVALUE}); + + ValidateEitTransactionModel.fromJson(Map json) { + tRANSACTIONNUMBER = json['TRANSACTION_NUMBER']; + nAME = json['NAME']; + vARCHAR2VALUE = json['VARCHAR2_VALUE']; + nUMBERVALUE = json['NUMBER_VALUE']; + dATEVALUE = json['DATE_VALUE']; + } + + Map toJson() { + final Map data = new Map(); + data['TRANSACTION_NUMBER'] = this.tRANSACTIONNUMBER; + data['NAME'] = this.nAME; + data['VARCHAR2_VALUE'] = this.vARCHAR2VALUE; + data['NUMBER_VALUE'] = this.nUMBERVALUE; + data['DATE_VALUE'] = this.dATEVALUE; + return data; + } +} diff --git a/lib/models/eit/get_eit_transaction_model.dart b/lib/models/eit/get_eit_transaction_model.dart index 186ef9c..309c0a4 100644 --- a/lib/models/eit/get_eit_transaction_model.dart +++ b/lib/models/eit/get_eit_transaction_model.dart @@ -1,9 +1,9 @@ -class GET_EIT_Transactions_Model { +class GetEitTransactionsModel { List? collectionTransaction; - GET_EIT_Transactions_Model({this.collectionTransaction}); + GetEitTransactionsModel({this.collectionTransaction}); - GET_EIT_Transactions_Model.fromJson(Map json) { + GetEitTransactionsModel.fromJson(Map json) { if (json['Collection_Transaction'] != null) { collectionTransaction = []; json['Collection_Transaction'].forEach((v) { diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index 1bf3f25..289b92b 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -1,10 +1,20 @@ +import 'package:mohem_flutter_app/models/add_att_success_list_model.dart'; +import 'package:mohem_flutter_app/models/add_attachment_list_model.dart'; +import 'package:mohem_flutter_app/models/basic_member_information_model.dart'; +import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart'; +import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; +import 'package:mohem_flutter_app/models/dashboard/get_open_missing_swipes_list_model.dart'; +import 'package:mohem_flutter_app/models/dashboard/get_open_notifications_list.dart'; +import 'package:mohem_flutter_app/models/dashboard/list_menu.dart'; +import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; import 'package:mohem_flutter_app/models/get_absence_collection_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_action_history_list_model.dart'; +import 'package:mohem_flutter_app/models/get_approves_list_model.dart'; import 'package:mohem_flutter_app/models/get_attachement_list_model.dart'; -import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; +import 'package:mohem_flutter_app/models/get_day_hours_type_details_list_model.dart'; +import 'package:mohem_flutter_app/models/get_default_value_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart'; -import 'package:mohem_flutter_app/models/get_day_hours_type_details_list_model.dart'; import 'package:mohem_flutter_app/models/get_employee_address_model.dart'; import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; @@ -12,6 +22,7 @@ import 'package:mohem_flutter_app/models/get_employee_phones_model.dart'; import 'package:mohem_flutter_app/models/get_item_creation_ntf_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_mo_Item_history_list_model.dart'; import 'package:mohem_flutter_app/models/get_mo_notification_body_list_model.dart'; +import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart'; import 'package:mohem_flutter_app/models/get_notification_buttons_list_model.dart'; import 'package:mohem_flutter_app/models/get_po_Item_history_list_model.dart'; import 'package:mohem_flutter_app/models/get_po_notification_body_list_model.dart'; @@ -20,31 +31,41 @@ import 'package:mohem_flutter_app/models/get_schedule_shifts_details_list_model. import 'package:mohem_flutter_app/models/get_stamp_ms_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart'; +import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/models/member_login_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_deductions_List_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_earnings_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_pay_slip_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_payment_information_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_summary_of_payment_list_model.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'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_section_topics.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/models/mowadhafhi/get_ticket_types.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_tickets_list.dart'; import 'package:mohem_flutter_app/models/notification_action_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart'; +import 'package:mohem_flutter_app/models/pending_transactions/get_pending_transactions_details.dart'; +import 'package:mohem_flutter_app/models/pending_transactions/get_req_functions.dart'; +import 'package:mohem_flutter_app/models/privilege_list_model.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart'; import 'package:mohem_flutter_app/models/profile/phone_number_types_modek.dart'; +import 'package:mohem_flutter_app/models/start_eit_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/worklist/hr/eit_otification_body_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'; +import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/get_contact_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/get_phones_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; -import 'basic_member_information_model.dart'; -import 'dashboard/get_accrual_balances_list_model.dart'; -import 'dashboard/get_attendance_tracking_list_model.dart'; -import 'dashboard/get_open_missing_swipes_list_model.dart'; -import 'dashboard/get_open_notifications_list.dart'; -import 'dashboard/list_menu.dart'; -import 'dashboard/menu_entries.dart'; -import 'get_mobile_login_info_list_model.dart'; -import 'member_information_list_model.dart'; -import 'privilege_list_model.dart'; - class GenericResponseModel { String? date; int? languageID; @@ -72,8 +93,8 @@ class GenericResponseModel { String? successMsg; String? successMsgN; String? vidaUpdatedResponse; - String? addAttSuccessList; - String? addAttachmentList; + List? addAttSuccessList; + AddAttachmentList? addAttachmentList; String? bCDomain; String? bCLogo; BasicMemberInformationModel? basicMemberInformation; @@ -102,7 +123,7 @@ class GenericResponseModel { List? getActionHistoryList; List? getAddressDffStructureList; List? getAddressNotificationBodyList; - List? getApprovesList; + List? getApprovesList; List? getAttachementList; GetAttendanceTracking? getAttendanceTrackingList; List? getBasicDetColsStructureList; @@ -122,12 +143,12 @@ class GenericResponseModel { GetContactNotificationBodyList? getContactNotificationBodyList; List? getCountriesList; List? getDayHoursTypeDetailsList; - List? getDeductionsList; - List? getDefaultValueList; + List? getDeductionsList; + GetDefaultValueList? getDefaultValueList; List? getEITCollectionNotificationBodyList; List? getEITDFFStructureList; List? getEITTransactionList; - List? getEarningsList; + List? getEarningsList; List? getEmployeeAddressList; List? getEmployeeBasicDetailsList; List? getEmployeeContactsList; @@ -151,10 +172,11 @@ class GenericResponseModel { List? getOpenNotificationsNumList; List? getOpenPeriodDatesList; List? getOrganizationsSalariesList; - List? getPaymentInformationList; - List? getPayslipList; - List? getPendingReqDetailsList; - List? getPendingReqFunctionsList; + List? getPaymentInformationList; + List? getPayslipList; + + // List? getPendingReqDetailsList; + // List? getPendingReqFunctionsList; List? getPerformanceAppraisalList; List? getPhonesNotificationBodyList; List? getPoItemHistoryList; @@ -173,12 +195,22 @@ class GenericResponseModel { List? getSubordinatesAttdStatusList; List? getSubordinatesLeavesList; List? getSubordinatesLeavesTotalVacationsList; - List? getSummaryOfPaymentList; + List? getSummaryOfPaymentList; List? getSwipesList; List? getTermColsStructureList; List? getTermDffStructureList; List? getTermNotificationBodyList; List? getTimeCardSummaryList; + List? getTicketsByEmployeeList; + List? getTicketDetailsByEmployee; + List? getTicketTransactions; + List? getTicketTypes; + List? getSectionTopics; + List? getMowadhafhiProjects; + List? getProjectDepartments; + List? getDepartmentSections; + List? getPendingTransactionsFunctions; + List? getPendingTransactionsDetails; List? getUserItemTypesList; List? getVacationRulesList; List? getVaccinationOnHandList; @@ -257,7 +289,7 @@ class GenericResponseModel { String? startBasicDetApprProcessList; String? startCeiApprovalProcess; String? startContactApprovalProcessList; - String? startEitApprovalProcess; + StartEitApprovalProcess? startEitApprovalProcess; String? startHrApprovalProcessList; String? startPhonesApprovalProcessList; String? startSitApprovalProcess; @@ -267,7 +299,7 @@ class GenericResponseModel { String? submitCEITransactionList; String? submitCcpTransactionList; String? submitContactTransactionList; - String? submitEITTransactionList; + SubmitEITTransactionList? submitEITTransactionList; String? submitHrTransactionList; String? submitPhonesTransactionList; String? submitSITTransactionList; @@ -286,7 +318,7 @@ class GenericResponseModel { String? vHRGetProjectByCodeList; bool? vHRIsVerificationCodeValid; String? validateAbsenceTransactionList; - String? validateEITTransactionList; + ValidateEITTransactionList? validateEITTransactionList; String? validatePhonesTransactionList; String? vrItemTypesList; String? wFLookUpList; @@ -406,8 +438,8 @@ class GenericResponseModel { this.getOrganizationsSalariesList, this.getPaymentInformationList, this.getPayslipList, - this.getPendingReqDetailsList, - this.getPendingReqFunctionsList, + // this.getPendingReqDetailsList, + // this.getPendingReqFunctionsList, this.getPerformanceAppraisalList, this.getPhonesNotificationBodyList, this.getPoItemHistoryList, @@ -432,6 +464,16 @@ class GenericResponseModel { this.getTermDffStructureList, this.getTermNotificationBodyList, this.getTimeCardSummaryList, + this.getTicketsByEmployeeList, + this.getTicketDetailsByEmployee, + this.getTicketTransactions, + this.getTicketTypes, + this.getSectionTopics, + this.getMowadhafhiProjects, + this.getProjectDepartments, + this.getDepartmentSections, + this.getPendingTransactionsFunctions, + this.getPendingTransactionsDetails, this.getUserItemTypesList, this.getVacationRulesList, this.getVaccinationOnHandList, @@ -578,8 +620,13 @@ class GenericResponseModel { successMsg = json['SuccessMsg']; successMsgN = json['SuccessMsgN']; vidaUpdatedResponse = json['VidaUpdatedResponse']; - addAttSuccessList = json['AddAttSuccessList']; - addAttachmentList = json['AddAttachment_List']; + if (json['AddAttSuccessList'] != null) { + addAttSuccessList = []; + json['AddAttSuccessList'].forEach((v) { + addAttSuccessList!.add(new AddAttSuccessList.fromJson(v)); + }); + } + addAttachmentList = json['AddAttachment_List'] != null ? new AddAttachmentList.fromJson(json['AddAttachment_List']) : null; bCDomain = json['BC_Domain']; bCLogo = json['BC_Logo']; basicMemberInformation = json['BasicMemberInformation'] != null ? new BasicMemberInformationModel.fromJson(json['BasicMemberInformation']) : null; @@ -622,7 +669,13 @@ class GenericResponseModel { getAddressDffStructureList = json['GetAddressDffStructureList']; getAddressNotificationBodyList = json['GetAddressNotificationBodyList']; - getApprovesList = json['GetApprovesList']; + + if (json['GetApprovesList'] != null) { + getApprovesList = []; + json['GetApprovesList'].forEach((v) { + getApprovesList!.add(new GetApprovesList.fromJson(v)); + }); + } if (json['GetAttachementList'] != null) { getAttachementList = []; @@ -662,7 +715,7 @@ class GenericResponseModel { getContactColsStructureList = json['GetContactColsStructureList']; getContactDetailsList = json['GetContactDetailsList']; getContactDffStructureList = json['GetContactDffStructureList']; - getContactNotificationBodyList= json["GetContactNotificationBodyList"] == null ? null : GetContactNotificationBodyList.fromJson(json["GetContactNotificationBodyList"]); + getContactNotificationBodyList = json["GetContactNotificationBodyList"] == null ? null : GetContactNotificationBodyList.fromJson(json["GetContactNotificationBodyList"]); getCountriesList = json['GetCountriesList']; if (json['GetDayHoursTypeDetailsList'] != null) { getDayHoursTypeDetailsList = []; @@ -670,8 +723,14 @@ class GenericResponseModel { getDayHoursTypeDetailsList!.add(new GetDayHoursTypeDetailsList.fromJson(v)); }); } - getDeductionsList = json['GetDeductionsList']; - getDefaultValueList = json['GetDefaultValueList']; + + if (json['GetDeductionsList'] != null) { + getDeductionsList = []; + json['GetDeductionsList'].forEach((v) { + getDeductionsList!.add(new GetDeductionsList.fromJson(v)); + }); + } + getDefaultValueList = json['GetDefaultValueList'] != null ? GetDefaultValueList.fromJson(json['GetDefaultValueList']) : null; getEITCollectionNotificationBodyList = json["GetEITCollectionNotificationBodyList"] == null ? null : List.from(json["GetEITCollectionNotificationBodyList"].map((x) => GetEitCollectionNotificationBodyList.fromJson(x))); @@ -687,7 +746,13 @@ class GenericResponseModel { getEITTransactionList!.add(new GetEITTransactionList.fromJson(v)); }); } - getEarningsList = json['GetEarningsList']; + + if (json['GetEarningsList'] != null) { + getEarningsList = []; + json['GetEarningsList'].forEach((v) { + getEarningsList!.add(new GetEarningsList.fromJson(v)); + }); + } if (json['GetEmployeeAddressList'] != null) { getEmployeeAddressList = []; json['GetEmployeeAddressList'].forEach((v) { @@ -756,12 +821,25 @@ class GenericResponseModel { getOpenNotificationsNumList = json['GetOpenNotificationsNumList']; getOpenPeriodDatesList = json['GetOpenPeriodDatesList']; getOrganizationsSalariesList = json['GetOrganizationsSalariesList']; - getPaymentInformationList = json['GetPaymentInformationList']; - getPayslipList = json['GetPayslipList']; - getPendingReqDetailsList = json['GetPendingReqDetailsList']; - getPendingReqFunctionsList = json['GetPendingReqFunctionsList']; + + if (json['GetPaymentInformationList'] != null) { + getPaymentInformationList = []; + json['GetPaymentInformationList'].forEach((v) { + getPaymentInformationList!.add(new GetPaymentInformationList.fromJson(v)); + }); + } + + if (json['GetPayslipList'] != null) { + getPayslipList = []; + json['GetPayslipList'].forEach((v) { + getPayslipList!.add(new GetPayslipList.fromJson(v)); + }); + } + // getPendingReqDetailsList = json['GetPendingReqDetailsList']; + // getPendingReqFunctionsList = json['GetPendingReqFunctionsList']; getPerformanceAppraisalList = json['GetPerformanceAppraisalList']; - getPhonesNotificationBodyList= json["GetPhonesNotificationBodyList"] == null ? null : List.from(json["GetPhonesNotificationBodyList"].map((x) => GetPhonesNotificationBodyList.fromJson(x))); + getPhonesNotificationBodyList = + json["GetPhonesNotificationBodyList"] == null ? null : List.from(json["GetPhonesNotificationBodyList"].map((x) => GetPhonesNotificationBodyList.fromJson(x))); if (json['GetPoItemHistoryList'] != null) { getPoItemHistoryList = []; json['GetPoItemHistoryList'].forEach((v) { @@ -812,7 +890,12 @@ class GenericResponseModel { } getSubordinatesLeavesTotalVacationsList = json['GetSubordinatesLeavesTotalVacationsList']; - getSummaryOfPaymentList = json['GetSummaryOfPaymentList']; + if (json['GetSummaryOfPaymentList'] != null) { + getSummaryOfPaymentList = []; + json['GetSummaryOfPaymentList'].forEach((v) { + getSummaryOfPaymentList!.add(new GetSummaryOfPaymentList.fromJson(v)); + }); + } getSwipesList = json['GetSwipesList']; getTermColsStructureList = json['GetTermColsStructureList']; getTermDffStructureList = json['GetTermDffStructureList']; @@ -824,6 +907,77 @@ class GenericResponseModel { getTimeCardSummaryList!.add(new GetTimeCardSummaryList.fromJson(v)); }); } + + if (json['Mohemm_ITG_TicketsByEmployeeList'] != null) { + getTicketsByEmployeeList = []; + json['Mohemm_ITG_TicketsByEmployeeList'].forEach((v) { + getTicketsByEmployeeList!.add(new GetTicketsByEmployeeList.fromJson(v)); + }); + } + + if (json['Mohemm_ITG_TicketDetailsList'] != null) { + getTicketDetailsByEmployee = []; + json['Mohemm_ITG_TicketDetailsList'].forEach((v) { + getTicketDetailsByEmployee!.add(new GetTicketDetailsByEmployee.fromJson(v)); + }); + } + + if (json['Mohemm_ITG_TicketTransactionsList'] != null) { + getTicketTransactions = []; + json['Mohemm_ITG_TicketTransactionsList'].forEach((v) { + getTicketTransactions!.add(new GetTicketTransactions.fromJson(v)); + }); + } + + if (json['Mohemm_Itg_TicketTypesList'] != null) { + getTicketTypes = []; + json['Mohemm_Itg_TicketTypesList'].forEach((v) { + getTicketTypes!.add(new GetTicketTypes.fromJson(v)); + }); + } + + if (json['Mohemm_Itg_ProjectsList'] != null) { + getMowadhafhiProjects = []; + json['Mohemm_Itg_ProjectsList'].forEach((v) { + getMowadhafhiProjects!.add(new GetMowadhafhiProjects.fromJson(v)); + }); + } + + if (json['Mohemm_ITG_ProjectDepartmentsList'] != null) { + getProjectDepartments = []; + json['Mohemm_ITG_ProjectDepartmentsList'].forEach((v) { + getProjectDepartments!.add(new GetProjectDepartments.fromJson(v)); + }); + } + + if (json['Mohemm_ITG_DepartmentSectionsList'] != null) { + getDepartmentSections = []; + json['Mohemm_ITG_DepartmentSectionsList'].forEach((v) { + getDepartmentSections!.add(new GetDepartmentSections.fromJson(v)); + }); + } + + if (json['Mohemm_ITG_SectionTopicsList'] != null) { + getSectionTopics = []; + json['Mohemm_ITG_SectionTopicsList'].forEach((v) { + getSectionTopics!.add(new GetSectionTopics.fromJson(v)); + }); + } + + if (json['GetPendingReqFunctionsList'] != null) { + getPendingTransactionsFunctions = []; + json['GetPendingReqFunctionsList'].forEach((v) { + getPendingTransactionsFunctions!.add(new GetPendingTransactionsFunctions.fromJson(v)); + }); + } + + if (json['GetPendingReqDetailsList'] != null) { + getPendingTransactionsDetails = []; + json['GetPendingReqDetailsList'].forEach((v) { + getPendingTransactionsDetails!.add(new GetPendingTransactionsDetails.fromJson(v)); + }); + } + getUserItemTypesList = json['GetUserItemTypesList']; getVacationRulesList = json['GetVacationRulesList']; getVaccinationOnHandList = json['GetVaccinationOnHandList']; @@ -946,7 +1100,8 @@ class GenericResponseModel { startBasicDetApprProcessList = json['StartBasicDetApprProcessList']; startCeiApprovalProcess = json['StartCeiApprovalProcess']; startContactApprovalProcessList = json['StartContactApprovalProcessList']; - startEitApprovalProcess = json['StartEitApprovalProcess']; + + startEitApprovalProcess = json['StartEitApprovalProcess'] != null ? new StartEitApprovalProcess.fromJson(json['StartEitApprovalProcess']) : null; startHrApprovalProcessList = json['StartHrApprovalProcessList']; startPhonesApprovalProcessList = json['StartPhonesApprovalProcessList']; startSitApprovalProcess = json['StartSitApprovalProcess']; @@ -956,7 +1111,8 @@ class GenericResponseModel { submitCEITransactionList = json['SubmitCEITransactionList']; submitCcpTransactionList = json['SubmitCcpTransactionList']; submitContactTransactionList = json['SubmitContactTransactionList']; - submitEITTransactionList = json['SubmitEITTransactionList']; + submitEITTransactionList = json['SubmitEITTransactionList'] != null ? new SubmitEITTransactionList.fromJson(json['SubmitEITTransactionList']) : null; + submitHrTransactionList = json['SubmitHrTransactionList']; submitPhonesTransactionList = json['SubmitPhonesTransactionList']; submitSITTransactionList = json['SubmitSITTransactionList']; @@ -982,7 +1138,9 @@ class GenericResponseModel { vHRGetProjectByCodeList = json['VHR_GetProjectByCodeList']; vHRIsVerificationCodeValid = json['VHR_IsVerificationCodeValid']; validateAbsenceTransactionList = json['ValidateAbsenceTransactionList']; - validateEITTransactionList = json['ValidateEITTransactionList']; + + validateEITTransactionList = json['ValidateEITTransactionList'] != null ? new ValidateEITTransactionList.fromJson(json['ValidateEITTransactionList']) : null; + validatePhonesTransactionList = json['ValidatePhonesTransactionList']; vrItemTypesList = json['VrItemTypesList']; wFLookUpList = json['WFLookUpList']; @@ -1023,8 +1181,14 @@ class GenericResponseModel { data['SuccessMsg'] = this.successMsg; data['SuccessMsgN'] = this.successMsgN; data['VidaUpdatedResponse'] = this.vidaUpdatedResponse; - data['AddAttSuccessList'] = this.addAttSuccessList; - data['AddAttachment_List'] = this.addAttachmentList; + + if (this.addAttSuccessList != null) { + data['AddAttSuccessList'] = this.addAttSuccessList!.map((v) => v.toJson()).toList(); + } + if (this.addAttachmentList != null) { + data['AddAttachment_List'] = this.addAttachmentList!.toJson(); + } + data['BC_Domain'] = this.bCDomain; data['BC_Logo'] = this.bCLogo; if (this.basicMemberInformation != null) { @@ -1063,7 +1227,10 @@ class GenericResponseModel { data['GetAddressDffStructureList'] = this.getAddressDffStructureList; data['GetAddressNotificationBodyList'] = this.getAddressNotificationBodyList; - data['GetApprovesList'] = this.getApprovesList; + + if (this.getApprovesList != null) { + data['GetApprovesList'] = this.getApprovesList!.map((v) => v.toJson()).toList(); + } if (this.getAttachementList != null) { data['GetAttachementList'] = this.getAttachementList!.map((v) => v.toJson()).toList(); @@ -1093,8 +1260,13 @@ class GenericResponseModel { if (this.getDayHoursTypeDetailsList != null) { data['GetDayHoursTypeDetailsList'] = this.getDayHoursTypeDetailsList!.map((v) => v.toJson()).toList(); } - data['GetDeductionsList'] = this.getDeductionsList; - data['GetDefaultValueList'] = this.getDefaultValueList; + + if (this.getDeductionsList != null) { + data['GetDeductionsList'] = this.getDeductionsList!.map((v) => v.toJson()).toList(); + } + if (this.getDefaultValueList != null) { + data['GetDefaultValueList'] = this.getDefaultValueList!.toJson(); + } data['GetEITCollectionNotificationBodyList'] = this.getEITCollectionNotificationBodyList; if (this.getEITDFFStructureList != null) { data['GetEITDFFStructureList'] = this.getEITDFFStructureList!.map((v) => v.toJson()).toList(); @@ -1102,7 +1274,10 @@ class GenericResponseModel { if (this.getEITTransactionList != null) { data['GetEITTransactionList'] = this.getEITTransactionList!.map((v) => v.toJson()).toList(); } - data['GetEarningsList'] = this.getEarningsList; + + if (this.getEarningsList != null) { + data['GetEarningsList'] = this.getEarningsList!.map((v) => v.toJson()).toList(); + } if (this.getEmployeeAddressList != null) { data['GetEmployeeAddressList'] = this.getEmployeeAddressList!.map((v) => v.toJson()).toList(); } @@ -1147,10 +1322,14 @@ class GenericResponseModel { data['GetOpenNotificationsNumList'] = this.getOpenNotificationsNumList; data['GetOpenPeriodDatesList'] = this.getOpenPeriodDatesList; data['GetOrganizationsSalariesList'] = this.getOrganizationsSalariesList; - data['GetPaymentInformationList'] = this.getPaymentInformationList; - data['GetPayslipList'] = this.getPayslipList; - data['GetPendingReqDetailsList'] = this.getPendingReqDetailsList; - data['GetPendingReqFunctionsList'] = this.getPendingReqFunctionsList; + if (this.getPaymentInformationList != null) { + data['GetPaymentInformationList'] = this.getPaymentInformationList!.map((v) => v.toJson()).toList(); + } + if (this.getPayslipList != null) { + data['GetPayslipList'] = this.getPayslipList!.map((v) => v.toJson()).toList(); + } + // data['GetPendingReqDetailsList'] = this.getPendingReqDetailsList; + // data['GetPendingReqFunctionsList'] = this.getPendingReqFunctionsList; data['GetPerformanceAppraisalList'] = this.getPerformanceAppraisalList; data['GetPhonesNotificationBodyList'] = this.getPhonesNotificationBodyList; if (this.getPoItemHistoryList != null) { @@ -1191,7 +1370,9 @@ class GenericResponseModel { } data['GetSubordinatesLeavesTotalVacationsList'] = this.getSubordinatesLeavesTotalVacationsList; - data['GetSummaryOfPaymentList'] = this.getSummaryOfPaymentList; + if (this.getSummaryOfPaymentList != null) { + data['GetSummaryOfPaymentList'] = this.getSummaryOfPaymentList!.map((v) => v.toJson()).toList(); + } data['GetSwipesList'] = this.getSwipesList; data['GetTermColsStructureList'] = this.getTermColsStructureList; data['GetTermDffStructureList'] = this.getTermDffStructureList; @@ -1297,7 +1478,10 @@ class GenericResponseModel { data['StartBasicDetApprProcessList'] = this.startBasicDetApprProcessList; data['StartCeiApprovalProcess'] = this.startCeiApprovalProcess; data['StartContactApprovalProcessList'] = this.startContactApprovalProcessList; - data['StartEitApprovalProcess'] = this.startEitApprovalProcess; + + if (this.startEitApprovalProcess != null) { + data['StartEitApprovalProcess'] = this.startEitApprovalProcess!.toJson(); + } data['StartHrApprovalProcessList'] = this.startHrApprovalProcessList; data['StartPhonesApprovalProcessList'] = this.startPhonesApprovalProcessList; data['StartSitApprovalProcess'] = this.startSitApprovalProcess; @@ -1307,7 +1491,11 @@ class GenericResponseModel { data['SubmitCEITransactionList'] = this.submitCEITransactionList; data['SubmitCcpTransactionList'] = this.submitCcpTransactionList; data['SubmitContactTransactionList'] = this.submitContactTransactionList; - data['SubmitEITTransactionList'] = this.submitEITTransactionList; + + if (this.submitEITTransactionList != null) { + data['SubmitEITTransactionList'] = this.submitEITTransactionList!.toJson(); + } + data['SubmitHrTransactionList'] = this.submitHrTransactionList; data['SubmitPhonesTransactionList'] = this.submitPhonesTransactionList; data['SubmitSITTransactionList'] = this.submitSITTransactionList; @@ -1331,7 +1519,11 @@ class GenericResponseModel { data['VHR_GetProjectByCodeList'] = this.vHRGetProjectByCodeList; data['VHR_IsVerificationCodeValid'] = this.vHRIsVerificationCodeValid; data['ValidateAbsenceTransactionList'] = this.validateAbsenceTransactionList; - data['ValidateEITTransactionList'] = this.validateEITTransactionList; + + if (this.validateEITTransactionList != null) { + data['ValidateEITTransactionList'] = this.validateEITTransactionList!.toJson(); + } + data['ValidatePhonesTransactionList'] = this.validatePhonesTransactionList; data['VrItemTypesList'] = this.vrItemTypesList; data['WFLookUpList'] = this.wFLookUpList; diff --git a/lib/models/get_absence_collection_notification_body_list_model.dart b/lib/models/get_absence_collection_notification_body_list_model.dart index 480a81f..057cb64 100644 --- a/lib/models/get_absence_collection_notification_body_list_model.dart +++ b/lib/models/get_absence_collection_notification_body_list_model.dart @@ -1,4 +1,3 @@ - class GetAbsenceCollectionNotificationBodyList { List? collectionNotification; @@ -16,8 +15,7 @@ class GetAbsenceCollectionNotificationBodyList { Map toJson() { final Map data = new Map(); if (this.collectionNotification != null) { - data['Collection_Notification'] = - this.collectionNotification!.map((v) => v.toJson()).toList(); + data['Collection_Notification'] = this.collectionNotification!.map((v) => v.toJson()).toList(); } return data; } @@ -42,20 +40,20 @@ class CollectionNotificationAbsence { CollectionNotificationAbsence( {this.aCTION, - this.aPPLICATIONCOLUMNNAME, - this.dATATYPE, - this.dATEVALUE, - this.dESCFLEXCONTEXTCODE, - this.dESCFLEXNAME, - this.dISPLAYFLAG, - this.nUMBERVALUE, - this.pREVSEGMENTVALUEDSP, - this.sEGMENTNAME, - this.sEGMENTPROMPT, - this.sEGMENTSEQNUM, - this.sEGMENTVALUEDSP, - this.tRANSACTIONNUMBER, - this.vARCHAR2VALUE}); + this.aPPLICATIONCOLUMNNAME, + this.dATATYPE, + this.dATEVALUE, + this.dESCFLEXCONTEXTCODE, + this.dESCFLEXNAME, + this.dISPLAYFLAG, + this.nUMBERVALUE, + this.pREVSEGMENTVALUEDSP, + this.sEGMENTNAME, + this.sEGMENTPROMPT, + this.sEGMENTSEQNUM, + this.sEGMENTVALUEDSP, + this.tRANSACTIONNUMBER, + this.vARCHAR2VALUE}); CollectionNotificationAbsence.fromJson(Map json) { aCTION = json['ACTION']; @@ -94,4 +92,4 @@ class CollectionNotificationAbsence { data['VARCHAR2_VALUE'] = this.vARCHAR2VALUE; return data; } -} \ No newline at end of file +} diff --git a/lib/models/get_announcement_details.dart b/lib/models/get_announcement_details.dart new file mode 100644 index 0000000..33628ce --- /dev/null +++ b/lib/models/get_announcement_details.dart @@ -0,0 +1,72 @@ +class GetAnnouncementDetails { + String? titleEN; + String? titleAR; + String? emailBodyEN; + String? emailBodyAR; + String? bodyEN; + String? bodyAR; + String? bannerImage; + String? rowID; + String? awarenessName; + String? created; + String? publishedDesc; + String? published; + String? twoLanguageTemplateDesc; + String? wFStatus; + String? totalItems; + + GetAnnouncementDetails( + {this.titleEN, + this.titleAR, + this.emailBodyEN, + this.emailBodyAR, + this.bodyEN, + this.bodyAR, + this.bannerImage, + this.rowID, + this.awarenessName, + this.created, + this.publishedDesc, + this.published, + this.twoLanguageTemplateDesc, + this.wFStatus, + this.totalItems}); + + GetAnnouncementDetails.fromJson(Map json) { + titleEN = json['Title_EN']; + titleAR = json['Title_AR']; + emailBodyEN = json['EmailBody_EN']; + emailBodyAR = json['EmailBody_AR']; + bodyEN = json['Body_EN']; + bodyAR = json['Body_AR']; + bannerImage = json['Banner_Image']; + rowID = json['rowID']; + awarenessName = json['awarenessName']; + created = json['created']; + publishedDesc = json['PublishedDesc']; + published = json['Published']; + twoLanguageTemplateDesc = json['TwoLanguageTemplateDesc']; + wFStatus = json['WFStatus']; + totalItems = json['TotalItems']; + } + + Map toJson() { + final Map data = new Map(); + data['Title_EN'] = this.titleEN; + data['Title_AR'] = this.titleAR; + data['EmailBody_EN'] = this.emailBodyEN; + data['EmailBody_AR'] = this.emailBodyAR; + data['Body_EN'] = this.bodyEN; + data['Body_AR'] = this.bodyAR; + data['Banner_Image'] = this.bannerImage; + data['rowID'] = this.rowID; + data['awarenessName'] = this.awarenessName; + data['created'] = this.created; + data['PublishedDesc'] = this.publishedDesc; + data['Published'] = this.published; + data['TwoLanguageTemplateDesc'] = this.twoLanguageTemplateDesc; + data['WFStatus'] = this.wFStatus; + data['TotalItems'] = this.totalItems; + return data; + } +} diff --git a/lib/models/get_announcements.dart b/lib/models/get_announcements.dart new file mode 100644 index 0000000..05b6988 --- /dev/null +++ b/lib/models/get_announcements.dart @@ -0,0 +1,72 @@ +class GetAnnouncementsObject { + String? titleEN; + String? titleAR; + String? bannerImage; + String? rowID; + String? awarenessName; + String? created; + String? publishedDesc; + String? published; + String? twoLanguageTemplateDesc; + String? wFStatus; + String? totalItems; + String? emailBodyEN; + String? emailBodyAR; + String? bodyEN; + String? bodyAR; + + GetAnnouncementsObject( + {this.titleEN, + this.titleAR, + this.bannerImage, + this.rowID, + this.awarenessName, + this.created, + this.publishedDesc, + this.published, + this.twoLanguageTemplateDesc, + this.wFStatus, + this.totalItems, + this.emailBodyEN, + this.emailBodyAR, + this.bodyEN, + this.bodyAR}); + + GetAnnouncementsObject.fromJson(Map json) { + titleEN = json['Title_EN']; + titleAR = json['Title_AR']; + bannerImage = json['Banner_Image']; + rowID = json['rowID']; + awarenessName = json['awarenessName']; + created = json['created']; + publishedDesc = json['PublishedDesc']; + published = json['Published']; + twoLanguageTemplateDesc = json['TwoLanguageTemplateDesc']; + wFStatus = json['WFStatus']; + totalItems = json['TotalItems']; + emailBodyEN = json['EmailBody_EN']; + emailBodyAR = json['EmailBody_AR']; + bodyEN = json['Body_EN']; + bodyAR = json['Body_AR']; + } + + Map toJson() { + final Map data = new Map(); + data['Title_EN'] = this.titleEN; + data['Title_AR'] = this.titleAR; + data['Banner_Image'] = this.bannerImage; + data['rowID'] = this.rowID; + data['awarenessName'] = this.awarenessName; + data['created'] = this.created; + data['PublishedDesc'] = this.publishedDesc; + data['Published'] = this.published; + data['TwoLanguageTemplateDesc'] = this.twoLanguageTemplateDesc; + data['WFStatus'] = this.wFStatus; + data['TotalItems'] = this.totalItems; + data['EmailBody_EN'] = this.emailBodyEN; + data['EmailBody_AR'] = this.emailBodyAR; + data['Body_EN'] = this.bodyEN; + data['Body_AR'] = this.bodyAR; + return data; + } +} diff --git a/lib/models/get_approves_list_model.dart b/lib/models/get_approves_list_model.dart new file mode 100644 index 0000000..f5a4d82 --- /dev/null +++ b/lib/models/get_approves_list_model.dart @@ -0,0 +1,60 @@ +class GetApprovesList { + String? aPPROVALSTATUS; + String? aPPROVER; + String? aPPROVERCATEGORY; + int? aPPROVERORDERNUMBER; + String? aPPROVERTYPE; + String? eMPLOYEEIMAGE; + int? fROMROWNUM; + int? lINENO; + int? nOOFROWS; + String? pOSITIONTITLE; + int? rOWNUM; + int? tOROWNUM; + + GetApprovesList( + {this.aPPROVALSTATUS, + this.aPPROVER, + this.aPPROVERCATEGORY, + this.aPPROVERORDERNUMBER, + this.aPPROVERTYPE, + this.eMPLOYEEIMAGE, + this.fROMROWNUM, + this.lINENO, + this.nOOFROWS, + this.pOSITIONTITLE, + this.rOWNUM, + this.tOROWNUM}); + + GetApprovesList.fromJson(Map json) { + aPPROVALSTATUS = json['APPROVAL_STATUS']; + aPPROVER = json['APPROVER']; + aPPROVERCATEGORY = json['APPROVER_CATEGORY']; + aPPROVERORDERNUMBER = json['APPROVER_ORDER_NUMBER']; + aPPROVERTYPE = json['APPROVER_TYPE']; + eMPLOYEEIMAGE = json['EMPLOYEE_IMAGE']; + fROMROWNUM = json['FROM_ROW_NUM']; + lINENO = json['LINE_NO']; + nOOFROWS = json['NO_OF_ROWS']; + pOSITIONTITLE = json['POSITION_TITLE']; + rOWNUM = json['ROW_NUM']; + tOROWNUM = json['TO_ROW_NUM']; + } + + Map toJson() { + final Map data = new Map(); + data['APPROVAL_STATUS'] = this.aPPROVALSTATUS; + data['APPROVER'] = this.aPPROVER; + data['APPROVER_CATEGORY'] = this.aPPROVERCATEGORY; + data['APPROVER_ORDER_NUMBER'] = this.aPPROVERORDERNUMBER; + data['APPROVER_TYPE'] = this.aPPROVERTYPE; + data['EMPLOYEE_IMAGE'] = this.eMPLOYEEIMAGE; + data['FROM_ROW_NUM'] = this.fROMROWNUM; + data['LINE_NO'] = this.lINENO; + data['NO_OF_ROWS'] = this.nOOFROWS; + data['POSITION_TITLE'] = this.pOSITIONTITLE; + data['ROW_NUM'] = this.rOWNUM; + data['TO_ROW_NUM'] = this.tOROWNUM; + return data; + } +} \ No newline at end of file diff --git a/lib/models/get_day_hours_type_details_list_model.dart b/lib/models/get_day_hours_type_details_list_model.dart index 5d0a0ab..daaac74 100644 --- a/lib/models/get_day_hours_type_details_list_model.dart +++ b/lib/models/get_day_hours_type_details_list_model.dart @@ -1,14 +1,14 @@ class GetDayHoursTypeDetailsList { - Null? aBSENCEATTENDANCEID; - Null? aBSENCEATTENDANCETYPEID; + dynamic? aBSENCEATTENDANCEID; + dynamic? aBSENCEATTENDANCETYPEID; String? aBSENTFLAG; String? aCTUALHRS; String? aNALAYZEDFLAG; String? aPPROVEDTIMEBACKHRS; String? aPPRTIMEBACKFLAG; - int? aSSIGNMENTID; + dynamic? aSSIGNMENTID; String? aTTENDEDFLAG; - Null? cALENDARENTRYID; + dynamic? cALENDARENTRYID; String? cOMPOFFFLAG; String? cOMPOFFHRS; String? cOMPOFFHHRS; @@ -19,18 +19,18 @@ class GetDayHoursTypeDetailsList { String? eARLYOUTHRS; String? eXCESSFLAG; String? eXCESSHRS; - int? fROMROWNUM; + dynamic? fROMROWNUM; String? lATEINFLAG; String? lATEINHRS; String? mISSINGSWIPEFLAG; String? nONSCHEDULEDFLAG; - Null? nOOFROWS; + dynamic? nOOFROWS; String? oNCALLHRS; - Null? pERSONEXTRAINFOID; + dynamic? pERSONEXTRAINFOID; String? pLANNEDOTHRS; String? pLANNEDOTHRSFLAG; String? rEMARKS; - int? rOWNUM; + dynamic? rOWNUM; int? rTPID; String? sCHEDULEDHRS; String? sCHEDULEDONCALLHRS; @@ -40,7 +40,7 @@ class GetDayHoursTypeDetailsList { String? sHORTAGEHRS; String? tIMEBACKFLAG; String? tIMEBACKHRS; - int? tOROWNUM; + dynamic? tOROWNUM; GetDayHoursTypeDetailsList( {this.aBSENCEATTENDANCEID, diff --git a/lib/models/get_default_value_list_model.dart b/lib/models/get_default_value_list_model.dart new file mode 100644 index 0000000..3ee7fc1 --- /dev/null +++ b/lib/models/get_default_value_list_model.dart @@ -0,0 +1,28 @@ +class GetDefaultValueList { + String? pIDCOLUMNNAME; + String? pRETURNMSG; + String? pRETURNSTATUS; + String? pVALUECOLUMNNAME; + + GetDefaultValueList( + {this.pIDCOLUMNNAME, + this.pRETURNMSG, + this.pRETURNSTATUS, + this.pVALUECOLUMNNAME}); + + GetDefaultValueList.fromJson(Map json) { + pIDCOLUMNNAME = json['P_ID_COLUMN_NAME']; + pRETURNMSG = json['P_RETURN_MSG']; + pRETURNSTATUS = json['P_RETURN_STATUS']; + pVALUECOLUMNNAME = json['P_VALUE_COLUMN_NAME']; + } + + Map toJson() { + final Map data = new Map(); + data['P_ID_COLUMN_NAME'] = this.pIDCOLUMNNAME; + data['P_RETURN_MSG'] = this.pRETURNMSG; + data['P_RETURN_STATUS'] = this.pRETURNSTATUS; + data['P_VALUE_COLUMN_NAME'] = this.pVALUECOLUMNNAME; + return data; + } +} \ No newline at end of file diff --git a/lib/models/get_eit_dff_structure_list_model.dart b/lib/models/get_eit_dff_structure_list_model.dart index d559794..5856014 100644 --- a/lib/models/get_eit_dff_structure_list_model.dart +++ b/lib/models/get_eit_dff_structure_list_model.dart @@ -83,8 +83,6 @@ class GetEITDFFStructureList { this.fieldAnswer}); GetEITDFFStructureList.fromJson(Map json) { - print("----------------=============================="); - print("----------------:$json"); aLPHANUMERICALLOWEDFLAG = json['ALPHANUMERIC_ALLOWED_FLAG']; aPPLICATIONCOLUMNNAME = json['APPLICATION_COLUMN_NAME']; cHILDSEGMENTSDV = json['CHILD_SEGMENTS_DV']; @@ -207,6 +205,8 @@ class GetEITDFFStructureList { data['VALIDATION_TYPE_DSP'] = this.vALIDATIONTYPEDSP; return data; } + + bool get isDefaultTypeIsCDPS => (dEFAULTTYPE == "C" || dEFAULTTYPE == "D" || dEFAULTTYPE == "P" || dEFAULTTYPE == "S"); } class ESERVICESDV { diff --git a/lib/models/get_time_card_summary_list_model.dart b/lib/models/get_time_card_summary_list_model.dart index 6799bfa..727e29f 100644 --- a/lib/models/get_time_card_summary_list_model.dart +++ b/lib/models/get_time_card_summary_list_model.dart @@ -2,39 +2,39 @@ class GetTimeCardSummaryList { int? aBSENTDAYS; - int? aCTUALHRS; - int? aPPROVEDTIMEBACKHRS; + dynamic? aCTUALHRS; + dynamic? aPPROVEDTIMEBACKHRS; int? aSSIGNMENTID; int? aTTENDEDDAYS; int? bUSINESSTRIP; - int? cOMPOFFHHRS; - int? cOMPOFFNHRS; - int? cOMPOFFWHRS; - int? dESIREDSCHEDULEDHRS; - int? eARLYOUTHRS; - int? eXCESSHRS; + dynamic? cOMPOFFHHRS; + dynamic? cOMPOFFNHRS; + dynamic? cOMPOFFWHRS; + dynamic? dESIREDSCHEDULEDHRS; + dynamic? eARLYOUTHRS; + dynamic? eXCESSHRS; int? hALFDAYLEAVE; - int? lATEINHRS; - int? lEAVESHOLIDAYSHRS; - int? nONSCHEDULEDAYS; - int? nOTANALYZEDDAYS; + dynamic? lATEINHRS; + dynamic? lEAVESHOLIDAYSHRS; + dynamic? nONSCHEDULEDAYS; + dynamic? nOTANALYZEDDAYS; int? oFFDAYS; - int? oNCALLHRS; - int? pAIDLEAVE; + dynamic? oNCALLHRS; + dynamic? pAIDLEAVE; int? pERIODDAYS; - int? pLANNEDOTHRS; + dynamic? pLANNEDOTHRS; int? pUBLICHOLIDAY; - int? sCHEDULEDHRS; - int? sCHEDULEDONCALLHRS; - int? sCHEDULEDPLANNEDOTHRS; + dynamic? sCHEDULEDHRS; + dynamic? sCHEDULEDONCALLHRS; + dynamic? sCHEDULEDPLANNEDOTHRS; int? sCHEDULEDAYS; - int? sHORTAGEHRS; - int? sHORTAGESCHEDULEHRS; + dynamic? sHORTAGEHRS; + dynamic? sHORTAGESCHEDULEHRS; int? sICKLEAVE; - int? tIMEBACKHRS; - double? tIMEBACKBALANCE; + dynamic? tIMEBACKHRS; + dynamic? tIMEBACKBALANCE; int? uNAUTHORIZEDLEAVE; - int? uNCOVERDSHORTAGEHRS; + dynamic? uNCOVERDSHORTAGEHRS; int? uNPAIDLEAVE; GetTimeCardSummaryList( diff --git a/lib/models/monthly_pay_slip/get_deductions_List_model.dart b/lib/models/monthly_pay_slip/get_deductions_List_model.dart new file mode 100644 index 0000000..7a99447 --- /dev/null +++ b/lib/models/monthly_pay_slip/get_deductions_List_model.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/monthly_pay_slip/get_earnings_list_model.dart b/lib/models/monthly_pay_slip/get_earnings_list_model.dart new file mode 100644 index 0000000..4c38fa6 --- /dev/null +++ b/lib/models/monthly_pay_slip/get_earnings_list_model.dart @@ -0,0 +1,36 @@ +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/monthly_pay_slip/get_pay_slip_list_model.dart b/lib/models/monthly_pay_slip/get_pay_slip_list_model.dart new file mode 100644 index 0000000..7cf8883 --- /dev/null +++ b/lib/models/monthly_pay_slip/get_pay_slip_list_model.dart @@ -0,0 +1,36 @@ +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/monthly_pay_slip/get_payment_information_list_model.dart b/lib/models/monthly_pay_slip/get_payment_information_list_model.dart new file mode 100644 index 0000000..75ed21c --- /dev/null +++ b/lib/models/monthly_pay_slip/get_payment_information_list_model.dart @@ -0,0 +1,32 @@ +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/monthly_pay_slip/get_summary_of_payment_list_model.dart b/lib/models/monthly_pay_slip/get_summary_of_payment_list_model.dart new file mode 100644 index 0000000..72ee89b --- /dev/null +++ b/lib/models/monthly_pay_slip/get_summary_of_payment_list_model.dart @@ -0,0 +1,36 @@ +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/mowadhafhi/get_department_sections.dart b/lib/models/mowadhafhi/get_department_sections.dart new file mode 100644 index 0000000..2d534ba --- /dev/null +++ b/lib/models/mowadhafhi/get_department_sections.dart @@ -0,0 +1,44 @@ +class GetDepartmentSections { + int? departmentId; + String? departmentName; + int? departmentSectionId; + String? projectCode; + int? projectId; + String? projectName; + int? sectionId; + String? sectionName; + + GetDepartmentSections( + {this.departmentId, + this.departmentName, + this.departmentSectionId, + this.projectCode, + this.projectId, + this.projectName, + this.sectionId, + this.sectionName}); + + GetDepartmentSections.fromJson(Map json) { + departmentId = json['departmentId']; + departmentName = json['departmentName']; + departmentSectionId = json['departmentSectionId']; + projectCode = json['projectCode']; + projectId = json['projectId']; + projectName = json['projectName']; + sectionId = json['sectionId']; + sectionName = json['sectionName']; + } + + Map toJson() { + final Map data = new Map(); + data['departmentId'] = this.departmentId; + data['departmentName'] = this.departmentName; + data['departmentSectionId'] = this.departmentSectionId; + data['projectCode'] = this.projectCode; + data['projectId'] = this.projectId; + data['projectName'] = this.projectName; + data['sectionId'] = this.sectionId; + data['sectionName'] = this.sectionName; + return data; + } +} diff --git a/lib/models/mowadhafhi/get_project_departments.dart b/lib/models/mowadhafhi/get_project_departments.dart new file mode 100644 index 0000000..436399d --- /dev/null +++ b/lib/models/mowadhafhi/get_project_departments.dart @@ -0,0 +1,32 @@ +class GetProjectDepartments { + int? departmentId; + String? departmentName; + String? projectCode; + int? projectDepartmentId; + String? projectName; + + GetProjectDepartments( + {this.departmentId, + this.departmentName, + this.projectCode, + this.projectDepartmentId, + this.projectName}); + + GetProjectDepartments.fromJson(Map json) { + departmentId = json['departmentId']; + departmentName = json['departmentName']; + projectCode = json['projectCode']; + projectDepartmentId = json['projectDepartmentId']; + projectName = json['projectName']; + } + + Map toJson() { + final Map data = new Map(); + data['departmentId'] = this.departmentId; + data['departmentName'] = this.departmentName; + data['projectCode'] = this.projectCode; + data['projectDepartmentId'] = this.projectDepartmentId; + data['projectName'] = this.projectName; + return data; + } +} diff --git a/lib/models/mowadhafhi/get_projects.dart b/lib/models/mowadhafhi/get_projects.dart new file mode 100644 index 0000000..62b99c3 --- /dev/null +++ b/lib/models/mowadhafhi/get_projects.dart @@ -0,0 +1,18 @@ +class GetMowadhafhiProjects { + int? projectId; + String? projectName; + + GetMowadhafhiProjects({this.projectId, this.projectName}); + + GetMowadhafhiProjects.fromJson(Map json) { + projectId = json['projectId']; + projectName = json['projectName']; + } + + Map toJson() { + final Map data = new Map(); + data['projectId'] = this.projectId; + data['projectName'] = this.projectName; + return data; + } +} diff --git a/lib/models/mowadhafhi/get_section_topics.dart b/lib/models/mowadhafhi/get_section_topics.dart new file mode 100644 index 0000000..c596527 --- /dev/null +++ b/lib/models/mowadhafhi/get_section_topics.dart @@ -0,0 +1,60 @@ +class GetSectionTopics { + int? departmentId; + String? departmentName; + String? projectCode; + int? projectDepartmentId; + int? projectId; + String? projectName; + int? sectionId; + String? sectionName; + int? sectionTopicId; + int? tatInHours; + int? topicId; + String? topicName; + + GetSectionTopics( + {this.departmentId, + this.departmentName, + this.projectCode, + this.projectDepartmentId, + this.projectId, + this.projectName, + this.sectionId, + this.sectionName, + this.sectionTopicId, + this.tatInHours, + this.topicId, + this.topicName}); + + GetSectionTopics.fromJson(Map json) { + departmentId = json['departmentId']; + departmentName = json['departmentName']; + projectCode = json['projectCode']; + projectDepartmentId = json['projectDepartmentId']; + projectId = json['projectId']; + projectName = json['projectName']; + sectionId = json['sectionId']; + sectionName = json['sectionName']; + sectionTopicId = json['sectionTopicId']; + tatInHours = json['tatInHours']; + topicId = json['topicId']; + topicName = json['topicName']; + } + + Map toJson() { + final Map data = new Map(); + data['departmentId'] = this.departmentId; + data['departmentName'] = this.departmentName; + data['projectCode'] = this.projectCode; + data['projectDepartmentId'] = this.projectDepartmentId; + data['projectId'] = this.projectId; + data['projectName'] = this.projectName; + data['sectionId'] = this.sectionId; + data['sectionName'] = this.sectionName; + data['sectionTopicId'] = this.sectionTopicId; + data['tatInHours'] = this.tatInHours; + data['topicId'] = this.topicId; + data['topicName'] = this.topicName; + return data; + } +} diff --git a/lib/models/mowadhafhi/get_ticket_details.dart b/lib/models/mowadhafhi/get_ticket_details.dart new file mode 100644 index 0000000..5f896bd --- /dev/null +++ b/lib/models/mowadhafhi/get_ticket_details.dart @@ -0,0 +1,80 @@ +class GetTicketDetailsByEmployee { + String? closedBy; + String? created; + int? departmentId; + String? departmentName; + String? description; + String? positionTitle; + int? projectId; + String? projectName; + int? sectionId; + String? sectionName; + String? ticketId; + String? ticketReferenceNo; + String? ticketStatusInternalName; + String? ticketStatusName; + int? ticketTypeId; + int? topicId; + String? topicName; + + GetTicketDetailsByEmployee( + {this.closedBy, + this.created, + this.departmentId, + this.departmentName, + this.description, + this.positionTitle, + this.projectId, + this.projectName, + this.sectionId, + this.sectionName, + this.ticketId, + this.ticketReferenceNo, + this.ticketStatusInternalName, + this.ticketStatusName, + this.ticketTypeId, + this.topicId, + this.topicName}); + + GetTicketDetailsByEmployee.fromJson(Map json) { + closedBy = json['closedBy']; + created = json['created']; + departmentId = json['departmentId']; + departmentName = json['departmentName']; + description = json['description']; + positionTitle = json['positionTitle']; + projectId = json['projectId']; + projectName = json['projectName']; + sectionId = json['sectionId']; + sectionName = json['sectionName']; + ticketId = json['ticketId']; + ticketReferenceNo = json['ticketReferenceNo']; + ticketStatusInternalName = json['ticketStatusInternalName']; + ticketStatusName = json['ticketStatusName']; + ticketTypeId = json['ticketTypeId']; + topicId = json['topicId']; + topicName = json['topicName']; + } + + Map toJson() { + final Map data = new Map(); + data['closedBy'] = this.closedBy; + data['created'] = this.created; + data['departmentId'] = this.departmentId; + data['departmentName'] = this.departmentName; + data['description'] = this.description; + data['positionTitle'] = this.positionTitle; + data['projectId'] = this.projectId; + data['projectName'] = this.projectName; + data['sectionId'] = this.sectionId; + data['sectionName'] = this.sectionName; + data['ticketId'] = this.ticketId; + data['ticketReferenceNo'] = this.ticketReferenceNo; + data['ticketStatusInternalName'] = this.ticketStatusInternalName; + data['ticketStatusName'] = this.ticketStatusName; + data['ticketTypeId'] = this.ticketTypeId; + data['topicId'] = this.topicId; + data['topicName'] = this.topicName; + return data; + } +} diff --git a/lib/models/mowadhafhi/get_ticket_transactions.dart b/lib/models/mowadhafhi/get_ticket_transactions.dart new file mode 100644 index 0000000..9091761 --- /dev/null +++ b/lib/models/mowadhafhi/get_ticket_transactions.dart @@ -0,0 +1,40 @@ +class GetTicketTransactions { + String? actionBy; + String? actionDate; + String? comments; + String? statusDisplayText; + String? statusName; + String? ticketId; + int? ticketTransactionId; + + GetTicketTransactions( + {this.actionBy, + this.actionDate, + this.comments, + this.statusDisplayText, + this.statusName, + this.ticketId, + this.ticketTransactionId}); + + GetTicketTransactions.fromJson(Map json) { + actionBy = json['actionBy']; + actionDate = json['actionDate']; + comments = json['comments']; + statusDisplayText = json['statusDisplayText']; + statusName = json['statusName']; + ticketId = json['ticketId']; + ticketTransactionId = json['ticketTransactionId']; + } + + Map toJson() { + final Map data = new Map(); + data['actionBy'] = this.actionBy; + data['actionDate'] = this.actionDate; + data['comments'] = this.comments; + data['statusDisplayText'] = this.statusDisplayText; + data['statusName'] = this.statusName; + data['ticketId'] = this.ticketId; + data['ticketTransactionId'] = this.ticketTransactionId; + return data; + } +} diff --git a/lib/models/mowadhafhi/get_ticket_types.dart b/lib/models/mowadhafhi/get_ticket_types.dart new file mode 100644 index 0000000..ae68e2d --- /dev/null +++ b/lib/models/mowadhafhi/get_ticket_types.dart @@ -0,0 +1,21 @@ +class GetTicketTypes { + String? ticketIdPrefix; + int? ticketTypeId; + String? typeName; + + GetTicketTypes({this.ticketIdPrefix, this.ticketTypeId, this.typeName}); + + GetTicketTypes.fromJson(Map json) { + ticketIdPrefix = json['ticketIdPrefix']; + ticketTypeId = json['ticketTypeId']; + typeName = json['typeName']; + } + + Map toJson() { + final Map data = new Map(); + data['ticketIdPrefix'] = this.ticketIdPrefix; + data['ticketTypeId'] = this.ticketTypeId; + data['typeName'] = this.typeName; + return data; + } +} diff --git a/lib/models/mowadhafhi/get_tickets_list.dart b/lib/models/mowadhafhi/get_tickets_list.dart new file mode 100644 index 0000000..34005df --- /dev/null +++ b/lib/models/mowadhafhi/get_tickets_list.dart @@ -0,0 +1,184 @@ +class GetTicketsByEmployeeList { + dynamic agentRating; + dynamic assignedSpecialist; + String? assignedSpecialistName; + String? assignedToSpecialistAt; + int? channelId; + String? channelName; + String? closedBy; + String? closedDate; + String? created; + int? departmentId; + String? departmentName; + String? description; + String? employeeEmail; + String? employeeName; + int? employeeNumber; + String? firstName; + dynamic isActive; + bool? isClosedDirectly; + dynamic isEscalated; + bool? isExceedTAT; + String? lastName; + String? mobileNumber; + dynamic pageNo; + dynamic pageSize; + String? positionTitle; + int? projectId; + String? projectManager; + String? projectName; + String? providedSolution; + int? sectionId; + String? sectionName; + dynamic serviceRating; + String? specialistDeadline; + String? ticketId; + String? ticketReferenceNo; + int? ticketStatusId; + String? ticketStatusInternalName; + String? ticketStatusName; + int? ticketTypeId; + String? ticketTypeName; + int? topicId; + String? topicName; + int? totalItemsCount; + + GetTicketsByEmployeeList( + {this.agentRating, + this.assignedSpecialist, + this.assignedSpecialistName, + this.assignedToSpecialistAt, + this.channelId, + this.channelName, + this.closedBy, + this.closedDate, + this.created, + this.departmentId, + this.departmentName, + this.description, + this.employeeEmail, + this.employeeName, + this.employeeNumber, + this.firstName, + this.isActive, + this.isClosedDirectly, + this.isEscalated, + this.isExceedTAT, + this.lastName, + this.mobileNumber, + this.pageNo, + this.pageSize, + this.positionTitle, + this.projectId, + this.projectManager, + this.projectName, + this.providedSolution, + this.sectionId, + this.sectionName, + this.serviceRating, + this.specialistDeadline, + this.ticketId, + this.ticketReferenceNo, + this.ticketStatusId, + this.ticketStatusInternalName, + this.ticketStatusName, + this.ticketTypeId, + this.ticketTypeName, + this.topicId, + this.topicName, + this.totalItemsCount}); + + GetTicketsByEmployeeList.fromJson(Map json) { + agentRating = json['agentRating']; + assignedSpecialist = json['assignedSpecialist']; + assignedSpecialistName = json['assignedSpecialistName']; + assignedToSpecialistAt = json['assignedToSpecialistAt']; + channelId = json['channelId']; + channelName = json['channelName']; + closedBy = json['closedBy']; + closedDate = json['closedDate']; + created = json['created']; + departmentId = json['departmentId']; + departmentName = json['departmentName']; + description = json['description']; + employeeEmail = json['employeeEmail']; + employeeName = json['employeeName']; + employeeNumber = json['employeeNumber']; + firstName = json['firstName']; + isActive = json['isActive']; + isClosedDirectly = json['isClosedDirectly']; + isEscalated = json['isEscalated']; + isExceedTAT = json['isExceedTAT']; + lastName = json['lastName']; + mobileNumber = json['mobileNumber']; + pageNo = json['pageNo']; + pageSize = json['pageSize']; + positionTitle = json['positionTitle']; + projectId = json['projectId']; + projectManager = json['projectManager']; + projectName = json['projectName']; + providedSolution = json['providedSolution']; + sectionId = json['sectionId']; + sectionName = json['sectionName']; + serviceRating = json['serviceRating']; + specialistDeadline = json['specialistDeadline']; + ticketId = json['ticketId']; + ticketReferenceNo = json['ticketReferenceNo']; + ticketStatusId = json['ticketStatusId']; + ticketStatusInternalName = json['ticketStatusInternalName']; + ticketStatusName = json['ticketStatusName']; + ticketTypeId = json['ticketTypeId']; + ticketTypeName = json['ticketTypeName']; + topicId = json['topicId']; + topicName = json['topicName']; + totalItemsCount = json['totalItemsCount']; + } + + Map toJson() { + final Map data = {}; + data['agentRating'] = agentRating; + data['assignedSpecialist'] = assignedSpecialist; + data['assignedSpecialistName'] = assignedSpecialistName; + data['assignedToSpecialistAt'] = assignedToSpecialistAt; + data['channelId'] = channelId; + data['channelName'] = channelName; + data['closedBy'] = closedBy; + data['closedDate'] = closedDate; + data['created'] = created; + data['departmentId'] = departmentId; + data['departmentName'] = departmentName; + data['description'] = description; + data['employeeEmail'] = employeeEmail; + data['employeeName'] = employeeName; + data['employeeNumber'] = employeeNumber; + data['firstName'] = firstName; + data['isActive'] = isActive; + data['isClosedDirectly'] = isClosedDirectly; + data['isEscalated'] = isEscalated; + data['isExceedTAT'] = isExceedTAT; + data['lastName'] = lastName; + data['mobileNumber'] = mobileNumber; + data['pageNo'] = pageNo; + data['pageSize'] = pageSize; + data['positionTitle'] = positionTitle; + data['projectId'] = projectId; + data['projectManager'] = projectManager; + data['projectName'] = projectName; + data['providedSolution'] = providedSolution; + data['sectionId'] = sectionId; + data['sectionName'] = sectionName; + data['serviceRating'] = serviceRating; + data['specialistDeadline'] = specialistDeadline; + data['ticketId'] = ticketId; + data['ticketReferenceNo'] = ticketReferenceNo; + data['ticketStatusId'] = ticketStatusId; + data['ticketStatusInternalName'] = ticketStatusInternalName; + data['ticketStatusName'] = ticketStatusName; + data['ticketTypeId'] = ticketTypeId; + data['ticketTypeName'] = ticketTypeName; + data['topicId'] = topicId; + data['topicName'] = topicName; + data['totalItemsCount'] = totalItemsCount; + return data; + } +} diff --git a/lib/models/mowadhafhi/mowadhafhi_attachement_request.dart b/lib/models/mowadhafhi/mowadhafhi_attachement_request.dart new file mode 100644 index 0000000..a72bd16 --- /dev/null +++ b/lib/models/mowadhafhi/mowadhafhi_attachement_request.dart @@ -0,0 +1,22 @@ +class MowadhafhiRequestAttachment { + String? base64Data; + String? fileName; + String? contentType; + + MowadhafhiRequestAttachment( + {this.base64Data, this.fileName, this.contentType}); + + MowadhafhiRequestAttachment.fromJson(Map json) { + base64Data = json['Base64Data']; + fileName = json['FileName']; + contentType = json['ContentType']; + } + + Map toJson() { + final Map data = new Map(); + data['Base64Data'] = this.base64Data; + data['FileName'] = this.fileName; + data['ContentType'] = this.contentType; + return data; + } +} diff --git a/lib/models/pending_transactions/get_pending_transactions_details.dart b/lib/models/pending_transactions/get_pending_transactions_details.dart new file mode 100644 index 0000000..0752269 --- /dev/null +++ b/lib/models/pending_transactions/get_pending_transactions_details.dart @@ -0,0 +1,56 @@ +class GetPendingTransactionsDetails { + String? cREATIONDATE; + int? fROMROWNUM; + String? iTEMKEY; + int? nOOFROWS; + String? rEQUESTTYPE; + int? rOWNUM; + int? tOROWNUM; + String? tRANSACTIONCREATEDFOR; + int? tRANSACTIONID; + String? tRANSACTIONINITIATOR; + String? uSERFUNCTIONNAME; + + GetPendingTransactionsDetails( + {this.cREATIONDATE, + this.fROMROWNUM, + this.iTEMKEY, + this.nOOFROWS, + this.rEQUESTTYPE, + this.rOWNUM, + this.tOROWNUM, + this.tRANSACTIONCREATEDFOR, + this.tRANSACTIONID, + this.tRANSACTIONINITIATOR, + this.uSERFUNCTIONNAME}); + + GetPendingTransactionsDetails.fromJson(Map json) { + cREATIONDATE = json['CREATION_DATE']; + fROMROWNUM = json['FROM_ROW_NUM']; + iTEMKEY = json['ITEM_KEY']; + nOOFROWS = json['NO_OF_ROWS']; + rEQUESTTYPE = json['REQUEST_TYPE']; + rOWNUM = json['ROW_NUM']; + tOROWNUM = json['TO_ROW_NUM']; + tRANSACTIONCREATEDFOR = json['TRANSACTION_CREATED_FOR']; + tRANSACTIONID = json['TRANSACTION_ID']; + tRANSACTIONINITIATOR = json['TRANSACTION_INITIATOR']; + uSERFUNCTIONNAME = json['USER_FUNCTION_NAME']; + } + + Map toJson() { + final Map data = new Map(); + data['CREATION_DATE'] = this.cREATIONDATE; + data['FROM_ROW_NUM'] = this.fROMROWNUM; + data['ITEM_KEY'] = this.iTEMKEY; + data['NO_OF_ROWS'] = this.nOOFROWS; + data['REQUEST_TYPE'] = this.rEQUESTTYPE; + data['ROW_NUM'] = this.rOWNUM; + data['TO_ROW_NUM'] = this.tOROWNUM; + data['TRANSACTION_CREATED_FOR'] = this.tRANSACTIONCREATEDFOR; + data['TRANSACTION_ID'] = this.tRANSACTIONID; + data['TRANSACTION_INITIATOR'] = this.tRANSACTIONINITIATOR; + data['USER_FUNCTION_NAME'] = this.uSERFUNCTIONNAME; + return data; + } +} diff --git a/lib/models/pending_transactions/get_req_functions.dart b/lib/models/pending_transactions/get_req_functions.dart new file mode 100644 index 0000000..bfb5892 --- /dev/null +++ b/lib/models/pending_transactions/get_req_functions.dart @@ -0,0 +1,22 @@ +class GetPendingTransactionsFunctions { + int? fUNCTIONID; + String? fUNCTIONNAME; + String? fUNCTIONPROMPT; + + GetPendingTransactionsFunctions( + {this.fUNCTIONID, this.fUNCTIONNAME, this.fUNCTIONPROMPT}); + + GetPendingTransactionsFunctions.fromJson(Map json) { + fUNCTIONID = json['FUNCTION_ID']; + fUNCTIONNAME = json['FUNCTION_NAME']; + fUNCTIONPROMPT = json['FUNCTION_PROMPT']; + } + + Map toJson() { + final Map data = new Map(); + data['FUNCTION_ID'] = this.fUNCTIONID; + data['FUNCTION_NAME'] = this.fUNCTIONNAME; + data['FUNCTION_PROMPT'] = this.fUNCTIONPROMPT; + return data; + } +} diff --git a/lib/models/post_params_model.dart b/lib/models/post_params_model.dart index 1ab86f7..0bb48d0 100644 --- a/lib/models/post_params_model.dart +++ b/lib/models/post_params_model.dart @@ -9,6 +9,8 @@ class PostParamsModel { String? pEmailAddress; String? pUserName; String? pSelectedEmployeeNumber; + String? pLegislationCode; + String? payrollCodeStr; int? pSessionId; String? userName; @@ -25,6 +27,8 @@ class PostParamsModel { this.pSessionId, this.pUserName, this.pSelectedEmployeeNumber, + this.payrollCodeStr, + this.pLegislationCode, }); PostParamsModel.fromJson(Map json) { @@ -33,6 +37,8 @@ class PostParamsModel { languageID = json['LanguageID']; mobileType = json['MobileType']; logInTokenID = json['LogInTokenID']; + payrollCodeStr = json['payrollCodeStr']; + pLegislationCode = json['LegislationCodeStr']; tokenID = json['TokenID']; } @@ -43,6 +49,8 @@ class PostParamsModel { data['LanguageID'] = this.languageID; data['MobileType'] = this.mobileType; data['LogInTokenID'] = this.logInTokenID; + data['payrollCodeStr'] = this.payrollCodeStr; + data['LegislationCodeStr'] = this.pLegislationCode; data['TokenID'] = this.tokenID; return data; } @@ -59,9 +67,10 @@ class PostParamsModel { data['UserName'] = this.userName; data['P_EMAIL_ADDRESS'] = this.pEmailAddress; data['P_SESSION_ID'] = this.pSessionId; + data['payrollCodeStr'] = this.payrollCodeStr; + data['LegislationCodeStr'] = this.pLegislationCode; data['P_SELECTED_EMPLOYEE_NUMBER'] = this.pSelectedEmployeeNumber; data['P_USER_NAME'] = this.pUserName; - return data; } @@ -80,4 +89,8 @@ class PostParamsModel { set setPUserName(String? v) => pUserName = v; set setPSelectedEmployeeNumber(String? v) => pSelectedEmployeeNumber = v; + + set setPLegislationCode(String? v) => pLegislationCode = v; + + set setPayrollCodeStr(String? v) => payrollCodeStr = v; } diff --git a/lib/models/start_eit_approval_process_model.dart b/lib/models/start_eit_approval_process_model.dart new file mode 100644 index 0000000..f49043b --- /dev/null +++ b/lib/models/start_eit_approval_process_model.dart @@ -0,0 +1,18 @@ +class StartEitApprovalProcess { + String? pRETURNMSG; + String? pRETURNSTATUS; + + StartEitApprovalProcess({this.pRETURNMSG, this.pRETURNSTATUS}); + + StartEitApprovalProcess.fromJson(Map json) { + pRETURNMSG = json['P_RETURN_MSG']; + pRETURNSTATUS = json['P_RETURN_STATUS']; + } + + Map toJson() { + final Map data = new Map(); + data['P_RETURN_MSG'] = this.pRETURNMSG; + data['P_RETURN_STATUS'] = this.pRETURNSTATUS; + return data; + } +} \ No newline at end of file diff --git a/lib/models/submit_eit_transaction_list_model.dart b/lib/models/submit_eit_transaction_list_model.dart new file mode 100644 index 0000000..288ce8e --- /dev/null +++ b/lib/models/submit_eit_transaction_list_model.dart @@ -0,0 +1,28 @@ +class SubmitEITTransactionList { + String? pITEMKEY; + String? pRETURNMSG; + String? pRETURNSTATUS; + int? pTRANSACTIONID; + + SubmitEITTransactionList( + {this.pITEMKEY, + this.pRETURNMSG, + this.pRETURNSTATUS, + this.pTRANSACTIONID}); + + SubmitEITTransactionList.fromJson(Map json) { + pITEMKEY = json['P_ITEM_KEY']; + pRETURNMSG = json['P_RETURN_MSG']; + pRETURNSTATUS = json['P_RETURN_STATUS']; + pTRANSACTIONID = json['P_TRANSACTION_ID']; + } + + Map toJson() { + final Map data = new Map(); + data['P_ITEM_KEY'] = this.pITEMKEY; + data['P_RETURN_MSG'] = this.pRETURNMSG; + data['P_RETURN_STATUS'] = this.pRETURNSTATUS; + data['P_TRANSACTION_ID'] = this.pTRANSACTIONID; + return data; + } +} \ No newline at end of file diff --git a/lib/models/validate_eit_transaction_list_model.dart b/lib/models/validate_eit_transaction_list_model.dart new file mode 100644 index 0000000..02f2af0 --- /dev/null +++ b/lib/models/validate_eit_transaction_list_model.dart @@ -0,0 +1,18 @@ +class ValidateEITTransactionList { + String? pRETURNMSG; + String? pRETURNSTATUS; + + ValidateEITTransactionList({this.pRETURNMSG, this.pRETURNSTATUS}); + + ValidateEITTransactionList.fromJson(Map json) { + pRETURNMSG = json['P_RETURN_MSG']; + pRETURNSTATUS = json['P_RETURN_STATUS']; + } + + Map toJson() { + final Map data = new Map(); + data['P_RETURN_MSG'] = this.pRETURNMSG; + data['P_RETURN_STATUS'] = this.pRETURNSTATUS; + 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 9316182..a78fd67 100644 --- a/lib/provider/dashboard_provider_model.dart +++ b/lib/provider/dashboard_provider_model.dart @@ -11,7 +11,6 @@ import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.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/models/generic_response_model.dart'; -import 'package:mohem_flutter_app/widgets/Updater.dart'; /// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for the devtool // ignore: prefer_mixin @@ -71,7 +70,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { return ((hour * 60 * 60) + (mints * 60) + seconds); } - update(context) { + void update(context) { fetchAttendanceTracking(context); // isAttendanceTrackingLoading = !isAttendanceTrackingLoading; // isWorkListLoading = !isWorkListLoading; @@ -137,7 +136,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { } //List Menu API's & Methods - fetchListMenu() async { + void fetchListMenu() async { try { GenericResponseModel? genericResponseModel = await DashboardApiClient().getListMenu(); Map map = {}; @@ -156,7 +155,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { } //Menu Entries API's & Methods - fetchMenuEntries() async { + void fetchMenuEntries() async { try { GenericResponseModel? genericResponseModel = await DashboardApiClient().getGetMenuEntries(); getMenuEntriesList = genericResponseModel!.getMenuEntriesList; diff --git a/lib/theme/app_theme.dart b/lib/theme/app_theme.dart index 51987cd..586c3aa 100644 --- a/lib/theme/app_theme.dart +++ b/lib/theme/app_theme.dart @@ -3,7 +3,7 @@ import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/theme/colors.dart'; class AppTheme { - static getTheme(isArabic) => ThemeData( + static ThemeData getTheme(isArabic) => ThemeData( fontFamily: isArabic ? 'Cairo' : 'Poppins', primarySwatch: Colors.red, visualDensity: VisualDensity.adaptivePlatformDensity, diff --git a/lib/ui/attendance/monthly_attendance.dart b/lib/ui/attendance/monthly_attendance.dart index fa531a3..de5c9c9 100644 --- a/lib/ui/attendance/monthly_attendance.dart +++ b/lib/ui/attendance/monthly_attendance.dart @@ -1,22 +1,23 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/src/public_ext.dart'; +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/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_day_hours_type_details_list_model.dart'; import 'package:mohem_flutter_app/models/get_schedule_shifts_details_list_model.dart'; import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart'; import 'package:mohem_flutter_app/widgets/circular_step_progress_bar.dart'; -import 'package:provider/provider.dart'; -import 'package:syncfusion_flutter_calendar/calendar.dart'; -import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; -import 'package:flutter/cupertino.dart'; +import 'package:month_picker_dialog/month_picker_dialog.dart'; import 'package:pie_chart/pie_chart.dart'; +import 'package:syncfusion_flutter_calendar/calendar.dart'; class MonthlyAttendance extends StatefulWidget { MonthlyAttendance({Key? key}) : super(key: key); @@ -27,13 +28,15 @@ class MonthlyAttendance extends StatefulWidget { } } +// todo '@fatima' use extension methods for widgets + class _MonthlyAttendanceState extends State { - bool isPresent = true; - bool isAbsent = true; - bool isMissingDays = true; - bool isOffDays = true; + bool isPresent = false; + bool isAbsent = false; + bool isMissing = false; + bool isOff = false; DateTime date = DateTime.now(); - late var formattedDate; + late DateTime formattedDate; var currentMonth = DateTime.now().month; String searchMonth = getMonth(DateTime.now().month); int searchYear = DateTime.now().year; @@ -41,84 +44,41 @@ class _MonthlyAttendanceState extends State { List getDayHoursTypeDetailsList = []; GetTimeCardSummaryList? getTimeCardSummaryList; - - // GetDayHoursTypeDetailsList? getDayHoursTypeDetailsList; GetScheduleShiftsDetailsList? getScheduleShiftsDetailsList; @override void initState() { super.initState(); - getTimeCardSummary(searchMonth, searchYear); - getDayHoursTypeDetails(date.day, searchMonth, searchYear); - formattedDate = DateFormat('MMM-yyyy').format(date); + formattedDate = date; + callTimeCardAndHourDetails(date.day, searchMonth, searchYear); } - void getTimeCardSummary(searchMonth, searchYear) async { + void callTimeCardAndHourDetails(index, searchMonth, searchYear) async { try { Utils.showLoading(context); getTimeCardSummaryList = await MonthlyAttendanceApiClient().getTimeCardSummary(searchMonth, searchYear); - Utils.hideLoading(context); - setState(() {}); - } catch (ex) { - Utils.hideLoading(context); - Utils.handleException(ex, context, null); - } - } - - void getDayHoursTypeDetails(index, searchMonth, searchYear) async { - try { - Utils.showLoading(context); getDayHoursTypeDetailsList = await MonthlyAttendanceApiClient().getDayHoursTypeDetails(searchMonth, searchYear); Utils.hideLoading(context); - pRTPID = getDayHoursTypeDetailsList[index].rTPID; + _calendarController.displayDate = formattedDate; setState(() {}); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); } - countAllAttendDays(); - getScheduleShiftsDetails(pRTPID); } - getScheduleShiftsDetails(pRTPID) async { + Future getScheduleShiftsDetails(index, pRTPID) async { try { Utils.showLoading(context); getScheduleShiftsDetailsList = await MonthlyAttendanceApiClient().getScheduleShiftsDetails(pRTPID); Utils.hideLoading(context); - setState(() {}); + //setState(() {}); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); } } - countAllAttendDays() { - // print(getDayHoursTypeDetailsList.length); - for (int i = 0; i < getDayHoursTypeDetailsList.length; i++) { - if (getDayHoursTypeDetailsList[i].aTTENDEDFLAG == 'Y') { - isPresent = true; - isAbsent = false; - isMissingDays = false; - isOffDays = false; - } else if (getDayHoursTypeDetailsList[i].aTTENDEDFLAG == 'N' && getDayHoursTypeDetailsList[i].aBSENTFLAG == 'Y') { - isPresent = false; - isAbsent = true; - isMissingDays = false; - isOffDays = false; - } else if (getDayHoursTypeDetailsList[i].aTTENDEDFLAG == 'N' && getDayHoursTypeDetailsList[i].dAYTYPE == 'OFF') { - isPresent = false; - isAbsent = false; - isMissingDays = false; - isOffDays = true; - } else { - isPresent = false; - isAbsent = false; - isMissingDays = true; - isOffDays = false; - } - } - } - final CalendarController _calendarController = CalendarController(); final List _colorList = [Color(0xff2AB2AB), Color(0xff202529)]; @@ -126,8 +86,8 @@ class _MonthlyAttendanceState extends State { @override Widget build(BuildContext context) { Map dataMap = { - "Present": getTimeCardSummaryList!.aTTENDEDDAYS!.toDouble(), - "Absent": getTimeCardSummaryList!.aBSENTDAYS!.toDouble(), + "Present": getTimeCardSummaryList?.aTTENDEDDAYS != null ? getTimeCardSummaryList!.aTTENDEDDAYS!.toDouble() : 0, + "Absent": getTimeCardSummaryList?.aBSENTDAYS != null ? getTimeCardSummaryList!.aBSENTDAYS!.toDouble() : 0, }; return Scaffold( appBar: AppBar( @@ -150,61 +110,42 @@ class _MonthlyAttendanceState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Attendance".toText24(isBold: true, color: MyColors.darkIconColor), + LocaleKeys.attendance.tr().toText24(isBold: true, color: MyColors.darkIconColor), Row( children: [ - Text(formattedDate), + "${DateFormat("MMMM-yyyy").format(formattedDate)}".toText16(color: MyColors.greyACColor), const Icon(Icons.keyboard_arrow_down_rounded, color: MyColors.greyACColor), ], ).onPress(() async { - await showDatePicker( - context: context, - initialDate: DateTime.now(), - firstDate: DateTime(2021), + showMonthPicker( + context: context, //locale: EasyLocalization.of(context)?.locale, + initialDate: formattedDate, + firstDate: DateTime(searchYear - 2), lastDate: DateTime.now(), - builder: (context, child) { - return Theme( - data: ThemeData.dark().copyWith( - colorScheme: const ColorScheme.dark( - primary: MyColors.lightGreenColor, - onPrimary: MyColors.white, - surface: MyColors.lightGreenColor, - onSurface: MyColors.darkTextColor, - ), - dialogBackgroundColor: Colors.white, - ), - child: child!, - ); - }, ).then((selectedDate) { if (selectedDate != null) { - var selectedMonth = DateFormat('MMMM').format(selectedDate); - var selectedYear = DateFormat('yyyy').format(selectedDate); - searchMonth = selectedMonth; - searchYear = int.parse(selectedYear); - setState(() { - // date = selectedDate; - formattedDate = DateFormat('MMMM-yyyy').format(selectedDate); - getTimeCardSummary(searchMonth, searchYear); - getDayHoursTypeDetails(selectedDate.day, searchMonth, searchYear); - }); + searchMonth = getMonth(selectedDate.month); + searchYear = selectedDate.year; + formattedDate = selectedDate; //DateFormat('MMMM-yyyy').format(selectedDate); + // _calendarController.selectedDate = formattedDate; + callTimeCardAndHourDetails(selectedDate.day, searchMonth, searchYear); } }); }) ], ).paddingOnly(left: 21, right: 21), 18.height, - AspectRatio(aspectRatio: 333 / 270, child: calendarWidget()).paddingOnly(left: 21, right: 21), + AspectRatio(aspectRatio: 333 / 270, child: calendarWidget()).paddingOnly(left: 18, right: 25), Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - optionUI("Schedule\nDays", "${getTimeCardSummaryList!.sCHEDULEDAYS}"), + optionUI(LocaleKeys.scheduleDays.tr(), "${getTimeCardSummaryList?.sCHEDULEDAYS}"), 6.width, - optionUI("Off\nDays", "${getTimeCardSummaryList!.oFFDAYS}"), + optionUI(LocaleKeys.offDays.tr(), "${getTimeCardSummaryList?.oFFDAYS}"), 6.width, - optionUI("Non\nAnalyzed", "${getTimeCardSummaryList!.uNAUTHORIZEDLEAVE}"), + optionUI(LocaleKeys.nonAnalyzed.tr(), "${getTimeCardSummaryList?.uNAUTHORIZEDLEAVE}"), 6.width, - optionUI("Shortage\nHour", "${getTimeCardSummaryList!.sHORTAGEHRS}"), + optionUI(LocaleKeys.shortageHour.tr(), "${getTimeCardSummaryList?.sHORTAGEHRS}"), ], ).paddingOnly(left: 21, right: 21), 35.height, @@ -229,10 +170,10 @@ class _MonthlyAttendanceState extends State { children: [ Column( children: [ - "Attendance".toText12(isBold: true, color: MyColors.grey3AColor), - "Stats".toText24(isBold: true, color: MyColors.grey3AColor), + LocaleKeys.attendance.tr().toText12(isBold: true, color: MyColors.grey3AColor), + LocaleKeys.stats.tr().toText24(isBold: true, color: MyColors.grey3AColor), ], - ).paddingOnly(left: 21, top: 29, bottom: 36), + ).paddingOnly(left: 21, top: 29, bottom: 36, right: 23), Row( children: [ Container( @@ -245,7 +186,7 @@ class _MonthlyAttendanceState extends State { ), Container( margin: const EdgeInsets.only(left: 5, right: 5), - child: "PRESENT ${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), @@ -262,13 +203,13 @@ class _MonthlyAttendanceState extends State { ), Container( margin: const EdgeInsets.only(left: 5, right: 5), - child: "ABSENT ${getTimeCardSummaryList!.aBSENTDAYS}".toText16( + child: "${LocaleKeys.absent.tr()} ${getTimeCardSummaryList!.aBSENTDAYS}".toText16( isBold: true, color: MyColors.backgroundBlackColor, ), ) ], - ).paddingOnly(left: 21, top: 8), + ).paddingOnly(left: 21, top: 8, right: 23), ], ), Column( @@ -342,70 +283,116 @@ class _MonthlyAttendanceState extends State { Widget calendarWidget() { return SfCalendar( view: CalendarView.month, - // onViewChanged: viewChanged, + showDatePickerButton: false, controller: _calendarController, headerHeight: 0, todayHighlightColor: MyColors.grey3AColor, + showNavigationArrow: false, + showCurrentTimeIndicator: false, + showWeekNumber: false, + cellBorderColor: Colors.white, + selectionDecoration: BoxDecoration( + border: Border.all(color: MyColors.white, width: 10), + borderRadius: const BorderRadius.all(Radius.circular(100)), + shape: BoxShape.circle, + ), + dataSource: MeetingDataSource(_getDataSource()), + onTap: calendarTapped, + monthViewSettings: const MonthViewSettings( + dayFormat: 'EEE', + showTrailingAndLeadingDates: false, + showAgenda: false, + navigationDirection: MonthNavigationDirection.horizontal, + monthCellStyle: MonthCellStyle( + textStyle: TextStyle( + fontStyle: FontStyle.normal, + fontSize: 13, + color: Colors.white, + ), + ), + ), viewHeaderStyle: const ViewHeaderStyle( dayTextStyle: TextStyle(color: MyColors.grey3AColor, fontSize: 13, fontWeight: FontWeight.w600), ), - monthCellBuilder: (cxt, build) { - int val = build.date.day; - val == countAllAttendDays(); - if (isPresent) { - 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], + monthCellBuilder: (build, details) { + if (details.date.month == formattedDate.month && details.date.year == formattedDate.year) { + int val = details.date.day; + //check day is off + if (getDayHoursTypeDetailsList[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, ), - 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( - "${build.date.day}", - style: const TextStyle( - fontSize: 13, - fontWeight: FontWeight.w500, - color: MyColors.white, ), - ), - ); - } else if (isAbsent) { - 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), + ); + } + //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], ), - ], - ), - alignment: Alignment.center, - child: Text( - "${build.date.day}", - style: const TextStyle( - fontSize: 13, - fontWeight: FontWeight.w500, - color: MyColors.white, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + offset: const Offset(0, 2), + blurRadius: 26, + color: MyColors.blackColor.withOpacity(0.100), + ), + ], ), - ), - ); - } else if (isMissingDays) { + 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( @@ -421,7 +408,7 @@ class _MonthlyAttendanceState extends State { ), alignment: Alignment.center, child: Text( - "${build.date.day}", + "$val", style: const TextStyle( fontSize: 13, fontWeight: FontWeight.w500, @@ -429,66 +416,35 @@ class _MonthlyAttendanceState extends State { ), ), ); - } else if (isOffDays) { - return Container( - margin: const EdgeInsets.all(4), - decoration: BoxDecoration( - color: MyColors.greyACColor.withOpacity(.12), - shape: BoxShape.circle, - ), - alignment: Alignment.center, - child: Text( - "${build.date.day}", - style: const TextStyle( - fontSize: 13, - fontWeight: FontWeight.w500, - color: MyColors.greyA5Color, - ), - ), - ); + // return Container( + // alignment: Alignment.center, + // child: Text("$val"), + // ); } else { - return Container(); + return const SizedBox(); } }, - monthViewSettings: const MonthViewSettings( - dayFormat: 'EEE', - showTrailingAndLeadingDates: false, - appointmentDisplayMode: MonthAppointmentDisplayMode.appointment, - showAgenda: false, - navigationDirection: MonthNavigationDirection.horizontal, - monthCellStyle: MonthCellStyle( - textStyle: TextStyle( - fontStyle: FontStyle.normal, - fontSize: 13, - color: Colors.white, - ), - ), - ), - showNavigationArrow: false, - showDatePickerButton: false, - showCurrentTimeIndicator: false, - showWeekNumber: false, - cellBorderColor: Colors.white, - selectionDecoration: BoxDecoration( - border: Border.all(color: MyColors.white, width: 10), - borderRadius: const BorderRadius.all(Radius.circular(100)), - shape: BoxShape.circle, - ), - dataSource: MeetingDataSource(_getDataSource()), - onTap: calendarTapped, ); } - calendarTapped(CalendarTapDetails details) { - dynamic string = getScheduleShiftsDetailsList!.pERCENTAGE; - dynamic percentage = string!.indexOf('%'); - print(percentage); - print(details.date?.day.toString()); - int? index = details.date?.day; + void calendarTapped(CalendarTapDetails details) async { + dynamic index = details.date?.day; if (index != null) { index = index - 1; } - getDayHoursTypeDetails(index, getMonth(details.date!.month), details.date?.year); + pRTPID = getDayHoursTypeDetailsList[index].rTPID; + await getScheduleShiftsDetails(index, pRTPID); + dynamic value = getScheduleShiftsDetailsList!.pERCENTAGE; + dynamic percentage; + if (value!.indexOf('%') == 3) { + percentage = int.parse(value!.substring(0, 3)); + } else if (value!.indexOf('%') == 2) { + percentage = int.parse(value!.substring(0, 2)); + } else if (value!.indexOf('%') == 1 && value!.indexOf('%') != 0 && value!.indexOf('%') != "") { + percentage = int.parse(value!.substring(0, 1)); + } else if (value!.indexOf('%') == 0 || value!.indexOf('%') == "") { + percentage = 0; + } showModalBottomSheet( context: context, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)), @@ -499,6 +455,8 @@ class _MonthlyAttendanceState extends State { maxChildSize: 0.9, expand: false, builder: (_, controller) { + dynamic dmyString = getScheduleShiftsDetailsList!.sCHEDULEDATE; + DateTime dateTime1 = DateFormat("MM/dd/yyyy hh:mm:ss a").parse(dmyString); return Column( children: [ Container( @@ -524,11 +482,12 @@ class _MonthlyAttendanceState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Column(children: [ - "${getScheduleShiftsDetailsList!.sCHEDULEDATE!.substring(0, 9)}".toText24(isBold: true, color: Colors.white), - "Attendance Details".tr().toText16(color: MyColors.lightGreyEFColor), - 21.height, - ]).paddingOnly(top: 25, left: 21, right: 21, bottom: 10), + Container( + child: "${DateFormat("MMMM-dd-yyyy").format(dateTime1).replaceAll('-', " ")}".toText24(isBold: true, color: Colors.white), + ).paddingOnly(top: 26, left: 21, right: 21), + Container( + child: LocaleKeys.attendanceDetails.tr().toText16(color: MyColors.greyACColor).paddingOnly(left: 21, bottom: 16), + ), Center( child: CircularStepProgressBar( totalSteps: 16 * 4, @@ -542,9 +501,9 @@ class _MonthlyAttendanceState extends State { mainAxisSize: MainAxisSize.min, children: [ "${getScheduleShiftsDetailsList!.pERCENTAGE}".toText44(color: Colors.white, isBold: true), - "Completed".tr().toText11(color: MyColors.greyACColor), + LocaleKeys.completed.tr().toText11(color: MyColors.greyACColor), 19.height, - "Shift Time".tr().toText11(color: MyColors.greyACColor), + LocaleKeys.shiftTime.tr().toText11(color: MyColors.greyACColor), "${getScheduleShiftsDetailsList!.sHTNAME}".toText22(color: Colors.white, isBold: true), ], ), @@ -574,11 +533,13 @@ class _MonthlyAttendanceState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Actual Check In ".tr().toText11( + LocaleKeys.actualCheckIn.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getScheduleShiftsDetailsList!.sHTACTUALSTARTTIME}".toText22(color: Colors.black, isBold: true), + "${getScheduleShiftsDetailsList!.sHTACTUALSTARTTIME}" != "" + ? "${getScheduleShiftsDetailsList!.sHTACTUALSTARTTIME}".toText22(color: Colors.black, isBold: true) + : "__".toText22(color: Colors.black, isBold: true), ], ), ), @@ -586,11 +547,13 @@ class _MonthlyAttendanceState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Actual Check Out".tr().toText11( + LocaleKeys.actualCheckOut.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getScheduleShiftsDetailsList!.sHTACTUALENDTIME}".toText22(color: Colors.black, isBold: true), + "${getScheduleShiftsDetailsList!.sHTACTUALENDTIME}" != "" + ? "${getScheduleShiftsDetailsList!.sHTACTUALENDTIME}".toText22(color: Colors.black, isBold: true) + : "__".toText22(color: Colors.black, isBold: true), ], ), ], @@ -609,11 +572,13 @@ class _MonthlyAttendanceState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Approved Check In".tr().toText11( + LocaleKeys.approvedCheckIn.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getScheduleShiftsDetailsList!.aPPROVEDSTARTTIME}".toText22(color: MyColors.greenColor, isBold: true), + "${getScheduleShiftsDetailsList!.aPPROVEDSTARTTIME}" != "" + ? "${getScheduleShiftsDetailsList!.aPPROVEDSTARTTIME}".toText22(color: MyColors.greenColor, isBold: true) + : "__".toText22(color: MyColors.greenColor, isBold: true), ], ), ), @@ -621,11 +586,13 @@ class _MonthlyAttendanceState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Approved Check Out".tr().toText11( + LocaleKeys.approvedCheckOut.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getScheduleShiftsDetailsList!.aPPROVEDENDTIME}".toText22(color: MyColors.greenColor, isBold: true), + "${getScheduleShiftsDetailsList!.aPPROVEDENDTIME}" != "" + ? "${getScheduleShiftsDetailsList!.aPPROVEDENDTIME}".toText22(color: MyColors.greenColor, isBold: true) + : "__".toText22(color: MyColors.greenColor, isBold: true), ], ), ], @@ -644,11 +611,11 @@ class _MonthlyAttendanceState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Late In".tr().toText11( + LocaleKeys.lateIn.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getDayHoursTypeDetailsList[i].lATEINHRS}".toText22(color: MyColors.redColor, isBold: true), + "${getDayHoursTypeDetailsList[index].lATEINHRS}".toText22(color: MyColors.redColor, isBold: true), ], ), ), @@ -656,11 +623,11 @@ class _MonthlyAttendanceState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Excess".tr().toText11( + LocaleKeys.excess.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getDayHoursTypeDetailsList[i].eXCESSHRS}".toText22(color: Colors.black, isBold: true), + "${getDayHoursTypeDetailsList[index].eXCESSHRS}".toText22(color: Colors.black, isBold: true), ], ), ], @@ -679,11 +646,11 @@ class _MonthlyAttendanceState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Shortage".tr().toText11( + LocaleKeys.shortage.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getDayHoursTypeDetailsList[i].sHORTAGEHRS}".toText22(color: Colors.black, isBold: true), + "${getDayHoursTypeDetailsList[index].sHORTAGEHRS}".toText22(color: Colors.black, isBold: true), ], ), ), @@ -691,11 +658,11 @@ class _MonthlyAttendanceState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Early Out".tr().toText11( + LocaleKeys.earlyOut.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getDayHoursTypeDetailsList[i].eARLYOUTHRS}".toText22(color: Colors.black, isBold: true), + "${getDayHoursTypeDetailsList[index].eARLYOUTHRS}".toText22(color: Colors.black, isBold: true), ], ), ], @@ -723,7 +690,7 @@ class _MonthlyAttendanceState extends State { return meetings; } - static getMonth(int month) { + static String getMonth(int month) { switch (month) { case 1: return "January"; @@ -749,6 +716,39 @@ class _MonthlyAttendanceState extends State { return "November"; case 12: return "December"; + default: + return ""; + } + } + + static String getMonthAr(int month) { + switch (month) { + case 1: + return 'يناير'; + case 2: + return ' فبراير'; + case 3: + return 'مارس'; + case 4: + return 'أبريل'; + case 5: + return 'مايو'; + case 6: + return 'يونيو'; + case 7: + return 'يوليو'; + case 8: + return 'أغسطس'; + case 9: + return 'سبتمبر'; + case 10: + return ' اكتوبر'; + case 11: + return ' نوفمبر'; + case 12: + return 'ديسمبر'; + default: + return ""; } } } diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart index 00cfb54..d23f063 100644 --- a/lib/ui/landing/dashboard_screen.dart +++ b/lib/ui/landing/dashboard_screen.dart @@ -51,275 +51,342 @@ class _DashboardScreenState extends State { List namesD = ["Nostalgia Perfume Perfume", "Al Nafoura", "AlJadi", "Nostalgia Perfume"]; final GlobalKey _key = GlobalKey(); // return Scaffold( - key: _scaffoldState, - body: Column( - children: [ - Row( - children: [ - Builder(builder: (context) { - return Row( - mainAxisSize: MainAxisSize.min, - children: [ - CircularAvatar( - width: 34, - height: 34, - url: "https://cdn4.iconfinder.com/data/icons/professions-2-2/151/89-512.png", + key: _scaffoldState, + body: Column( + children: [ + Row( + children: [ + Builder(builder: (context) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + 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"), + ], + ).onPress(() { + _scaffoldState.currentState!.openDrawer(); + }); + }), + Expanded( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + //AppLogo(), + 8.width, + LocaleKeys.mohemm.tr().toText14() + ], + ), + ), + SizedBox( + width: 36, + height: 36, + child: Stack( + alignment: Alignment.centerLeft, + children: [ + SvgPicture.asset("assets/images/announcements.svg"), + Positioned( + right: 0, + top: 0, + child: Container( + padding: const EdgeInsets.only(left: 5, right: 5), + decoration: BoxDecoration(color: MyColors.redColor, borderRadius: BorderRadius.circular(17)), + child: "3".toText12(color: Colors.white), ), - 8.width, - SvgPicture.asset("assets/images/side_nav.svg"), - ], - ).onPress(() { - _scaffoldState.currentState!.openDrawer(); - }); - }), - Expanded( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - //AppLogo(), - 8.width, - LocaleKeys.mohemm.tr().toText14() - ], - ), + ) + ], ), - SizedBox( - width: 36, - height: 36, - child: Stack( - alignment: Alignment.centerLeft, + ).onPress(() async { + await Navigator.pushNamed(context, AppRoutes.announcements); + + }) + ], + ).paddingOnly(left: 21, right: 21, top: 48, bottom: 7), + Expanded( + child: SingleChildScrollView( + child: Column( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/images/announcements.svg"), - Positioned( - right: 0, - top: 0, - child: Container( - padding: const EdgeInsets.only(left: 5, right: 5), - decoration: BoxDecoration(color: MyColors.redColor, borderRadius: BorderRadius.circular(17)), - child: "3".toText12(color: Colors.white), - ), - ) - ], - ), - ).onPress(() { - data.update(context); - }) - ], - ).paddingOnly(left: 21, right: 21, top: 48, bottom: 7), - Expanded( - child: SingleChildScrollView( - child: Column( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.goodMorning.tr().toText14(color: MyColors.grey77Color), - "Mahmoud Shrouf".toText24(isBold: true), - 16.height, - Row( - children: [ - Expanded( - child: AspectRatio( - aspectRatio: 159 / 159, - child: Consumer( - builder: (context, model, child) { - return (model.isAttendanceTrackingLoading - ? GetAttendanceTrackingShimmer() - : Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15), - gradient: const LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [ - MyColors.gradiantEndColor, - MyColors.gradiantStartColor, - ]), - ), - child: Stack( - alignment: Alignment.center, - children: [ - if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true), - if (model.isTimeRemainingInSeconds == 0) "01-02-2022".toText12(color: Colors.white), - if (model.isTimeRemainingInSeconds != 0) - Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - 9.height, - CountdownTimer( - endTime: model.endTime, - onEnd: null, - endWidget: "00:00:00".toText14(color: Colors.white, isBold: true), - textStyle: TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold), - ), - LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white), - 9.height, - ClipRRect( - borderRadius: BorderRadius.all( - Radius.circular(20), - ), - child: LinearProgressIndicator( - value: model.progress, - minHeight: 8, - valueColor: const AlwaysStoppedAnimation(Colors.white), - backgroundColor: const Color(0xff196D73), - ), - ), - ], - ), - ], - ).paddingOnly(top: 12, right: 15, left: 12), - ), - Row( + LocaleKeys.goodMorning.tr().toText14(color: MyColors.grey77Color), + "Mahmoud Shrouf".toText24(isBold: true), + 16.height, + Row( + children: [ + Expanded( + child: AspectRatio( + aspectRatio: 159 / 159, + child: Consumer( + builder: (context, model, child) { + return (model.isAttendanceTrackingLoading + ? GetAttendanceTrackingShimmer() + : Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + gradient: const LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [ + MyColors.gradiantEndColor, + MyColors.gradiantStartColor, + ]), + ), + child: Stack( + alignment: Alignment.center, + children: [ + if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded( - child: Column( + LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true), + if (model.isTimeRemainingInSeconds == 0) "01-02-2022".toText12(color: Colors.white), + if (model.isTimeRemainingInSeconds != 0) + Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - LocaleKeys.checkIn.tr().toText12(color: Colors.white), - (model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn) - .toString() - .toText14(color: Colors.white, isBold: true), - 4.height, + 9.height, + CountdownTimer( + endTime: model.endTime, + onEnd: null, + endWidget: "00:00:00".toText14(color: Colors.white, isBold: true), + textStyle: TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold), + ), + LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white), + 9.height, + ClipRRect( + borderRadius: BorderRadius.all( + Radius.circular(20), + ), + child: LinearProgressIndicator( + value: model.progress, + minHeight: 8, + valueColor: const AlwaysStoppedAnimation(Colors.white), + backgroundColor: const Color(0xff196D73), + ), + ), ], - ).paddingOnly(left: 12), - ), - Container( - width: 45, - height: 45, - padding: const EdgeInsets.only(left: 14, right: 14), - decoration: const BoxDecoration( - color: Color(0xff259EA4), - borderRadius: BorderRadius.only( - bottomRight: Radius.circular(15), - ), ), - child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/play.svg" : "assets/images/stop.svg"), - ), ], - ), - ], - ), - ], - ), - ).onPress(() { - Navigator.pushNamed(context, AppRoutes.todayAttendance); - })) - .animatedSwither(); - }, - ), + ).paddingOnly(top: 12, right: 15, left: 12), + ), + Row( + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.checkIn.tr().toText12(color: Colors.white), + (model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn) + .toString() + .toText14(color: Colors.white, isBold: true), + 4.height, + ], + ).paddingOnly(left: 12), + ), + Container( + width: 45, + height: 45, + padding: const EdgeInsets.only(left: 14, right: 14), + decoration: const BoxDecoration( + color: Color(0xff259EA4), + borderRadius: BorderRadius.only( + bottomRight: Radius.circular(15), + ), + ), + child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/play.svg" : "assets/images/stop.svg"), + ), + ], + ), + ], + ), + ], + ), + ).onPress(() { + Navigator.pushNamed(context, AppRoutes.todayAttendance); + })) + .animatedSwither(); + }, ), ), - 9.width, - Expanded( - child: MenusWidget(), - ), - ], - ), - ], - ).paddingOnly(left: 21, right: 21, top: 7), - ServicesWidget(), - 8.height, - Container( - width: double.infinity, - padding: EdgeInsets.only(top: 31), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only(topRight: Radius.circular(50), topLeft: Radius.circular(50)), - border: Border.all(color: MyColors.lightGreyEDColor, width: 1), + ), + 9.width, + Expanded( + child: MenusWidget(), + ), + ], ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - LocaleKeys.offers.tr().toText12(), - Row( - children: [ - LocaleKeys.discounts.tr().toText24(isBold: true), - 6.width, - Container( - padding: const EdgeInsets.only(left: 8, right: 8), - decoration: BoxDecoration( - color: MyColors.yellowColor, - borderRadius: BorderRadius.circular(10), - ), - child: LocaleKeys.newString.tr().toText10(isBold: true)), - ], - ), - ], - ), - ), - LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true), - ], - ).paddingOnly(left: 21, right: 21), - SizedBox( - height: 103 + 33, - child: ListView.separated( - shrinkWrap: true, - physics: const BouncingScrollPhysics(), - padding: const EdgeInsets.only(left: 21, right: 21, top: 13), - scrollDirection: Axis.horizontal, - itemBuilder: (cxt, index) { - return SizedBox( - width: 73, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - width: 73, - height: 73, + ], + ).paddingOnly(left: 21, right: 21, top: 7), + ServicesWidget(), + 8.height, + Container( + width: double.infinity, + padding: EdgeInsets.only(top: 31), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only(topRight: Radius.circular(50), topLeft: Radius.circular(50)), + border: Border.all(color: MyColors.lightGreyEDColor, width: 1), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + LocaleKeys.offers.tr().toText12(), + Row( + children: [ + LocaleKeys.discounts.tr().toText24(isBold: true), + 6.width, + Container( + padding: const EdgeInsets.only(left: 8, right: 8), decoration: BoxDecoration( - borderRadius: const BorderRadius.all( - Radius.circular(100), - ), - border: Border.all(color: MyColors.lightGreyEDColor, width: 1), + color: MyColors.yellowColor, + borderRadius: BorderRadius.circular(10), ), - child: ClipRRect( - borderRadius: const BorderRadius.all( - Radius.circular(50), - ), - child: Image.network( - "https://play-lh.googleusercontent.com/NPo88ojmhah4HDiposucJmfQIop4z4xc8kqJK9ITO9o-yCab2zxIp7PPB_XPj2iUojo", - fit: BoxFit.cover, - ), + child: LocaleKeys.newString.tr().toText10(isBold: true)), + ], + ), + ], + ), + ), + LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true), + ], + ).paddingOnly(left: 21, right: 21), + SizedBox( + height: 103 + 33, + child: ListView.separated( + shrinkWrap: true, + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.only(left: 21, right: 21, top: 13), + scrollDirection: Axis.horizontal, + itemBuilder: (cxt, index) { + return SizedBox( + width: 73, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 73, + height: 73, + decoration: BoxDecoration( + borderRadius: const BorderRadius.all( + Radius.circular(100), ), + border: Border.all(color: MyColors.lightGreyEDColor, width: 1), ), - 4.height, - Expanded( - child: namesD[6 % (index + 1)].toText12(isCenter: true, maxLine: 2), + child: ClipRRect( + borderRadius: const BorderRadius.all( + Radius.circular(50), + ), + child: Image.network( + "https://play-lh.googleusercontent.com/NPo88ojmhah4HDiposucJmfQIop4z4xc8kqJK9ITO9o-yCab2zxIp7PPB_XPj2iUojo", + fit: BoxFit.cover, + ), ), - ], - ), - ); - }, - separatorBuilder: (cxt, index) => 8.width, - itemCount: 6), - ), - ], - ), - ) - ], - ), + ), + 4.height, + Expanded( + child: namesD[6 % (index + 1)].toText12(isCenter: true, maxLine: 2), + ), + ], + ), + ); + }, + separatorBuilder: (cxt, index) => 8.width, + itemCount: 6), + ), + ], + ), + ) + ], + ), + ), + ) + ], + ), + drawer: SafeArea( + child: AppDrawer(), + ), + bottomNavigationBar: BottomNavigationBar( + items: [ + BottomNavigationBarItem( + icon: Padding( + padding: const EdgeInsets.all(4.0), + child: SvgPicture.asset( + "assets/icons/home.svg", + width: 20, + height: 20, ), - ) - ], + ), + label: 'Home', + ), + BottomNavigationBarItem( + icon: Padding( + padding: const EdgeInsets.all(4.0), + child: SvgPicture.asset( + "assets/icons/create_req.svg", + width: 20, + height: 20, + ), + ), + label: 'Create Request', + ), + BottomNavigationBarItem( + icon: Padding( + padding: const EdgeInsets.all(4.0), + child: SvgPicture.asset( + "assets/icons/work_list.svg", + width: 20, + height: 20, + ), + ), + label: 'Work List', + ), + BottomNavigationBarItem( + icon: Padding( + padding: const EdgeInsets.all(4.0), + child: SvgPicture.asset( + "assets/icons/item_for_sale.svg", + width: 20, + height: 20, + ), + ), + 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, ), - drawer: SafeArea(child: AppDrawer())); + 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 fcd6b9a..dca2232 100644 --- a/lib/ui/landing/today_attendance_screen.dart +++ b/lib/ui/landing/today_attendance_screen.dart @@ -14,8 +14,10 @@ import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/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'; diff --git a/lib/ui/landing/widget/app_drawer.dart b/lib/ui/landing/widget/app_drawer.dart index ca49a2d..b8e2adf 100644 --- a/lib/ui/landing/widget/app_drawer.dart +++ b/lib/ui/landing/widget/app_drawer.dart @@ -3,7 +3,6 @@ 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:provider/provider.dart'; import '../../../widgets/dialogs/dialogs.dart'; import '../../dialogs/id/business_card_dialog.dart'; @@ -17,6 +16,55 @@ class _AppDrawerState extends State { @override Widget build(BuildContext context) { return Container( + color: Colors.white, + child: Drawer( + child: Column( + children: [ + const SizedBox( + height: 200, + ), + Expanded( + child: ListView( + padding: const EdgeInsets.all(21), + physics: const BouncingScrollPhysics(), + children: [ + const Divider(), + InkWell( + child: const DrawerItem( + 'My Profile', + icon: Icons.person, + color: Colors.grey, + ), + onTap: () { + drawerNavigator(context, AppRoutes.profile); + }), + const Divider(), + InkWell( + child: const DrawerItem( + 'Mowadhafhi', + 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); + }) + ], + ), + ) + ], + ), + ), + ); color: Colors.white, child: Drawer( child: Column( @@ -71,7 +119,7 @@ class _AppDrawerState extends State { ); } - drawerNavigator(context, routeName) { + void drawerNavigator(context, routeName) { Navigator.of(context).pushNamed(routeName); } } diff --git a/lib/ui/landing/widget/drawer_item.dart b/lib/ui/landing/widget/drawer_item.dart index affbb1d..4654e5b 100644 --- a/lib/ui/landing/widget/drawer_item.dart +++ b/lib/ui/landing/widget/drawer_item.dart @@ -1,4 +1,5 @@ import 'dart:ui'; + import 'package:flutter/material.dart'; class DrawerItem extends StatefulWidget { diff --git a/lib/ui/landing/widget/services_widget.dart b/lib/ui/landing/widget/services_widget.dart index f69776c..9500ac4 100644 --- a/lib/ui/landing/widget/services_widget.dart +++ b/lib/ui/landing/widget/services_widget.dart @@ -1,7 +1,6 @@ import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.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'; @@ -9,6 +8,7 @@ import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; +import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart'; import 'package:provider/provider.dart'; @@ -85,10 +85,10 @@ class ServicesWidget extends StatelessWidget { ) ], ).paddingOnly(left: 10, right: 10, bottom: 10, top: 12), - ), - ).onPress(() { - handleOnPress(context, data.homeMenus![parentIndex].menuEntiesList[index]); - }); + ).onPress(() { + handleOnPress(context, data.homeMenus![parentIndex].menuEntiesList[index]); + }), + ); }, separatorBuilder: (cxt, index) => 9.width, itemCount: data.homeMenus![parentIndex].menuEntiesList.length), @@ -108,12 +108,20 @@ class ServicesWidget extends StatelessWidget { } void handleOnPress(context, GetMenuEntriesList menuEntry) { - print(menuEntry.menuName); - if (menuEntry.menuName == "HMG_OTL_SS" || menuEntry.menuName == "HMG_PT_OTL_SS") { - Navigator.pushNamed(context, AppRoutes.myAttendance); + var pro = Provider.of(context, listen: false); + List menuList = pro.getMenuEntriesList?.where((element) => element.parentMenuName == menuEntry.menuName && element.menuEntryType == "FUNCTION").toList() ?? []; + menuEntry.icon = ""; + print(menuEntry.toJson()); + if (menuList.isEmpty) { + if (menuEntry.requestType == "EIT") { + Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(menuEntry.prompt!, menuEntry.functionName!)); + } else if (menuEntry.requestType == "PAYSLIP") { + Navigator.pushNamed(context, AppRoutes.monthlyPaySlip); + } } else { - Utils.showToast("In Progress"); + Navigator.pushNamed(context, AppRoutes.myAttendance, arguments: menuList); } + return; } String firstWord(String value) { diff --git a/lib/ui/misc/request_submit_screen.dart b/lib/ui/misc/request_submit_screen.dart new file mode 100644 index 0000000..a0722da --- /dev/null +++ b/lib/ui/misc/request_submit_screen.dart @@ -0,0 +1,259 @@ +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/my_attendance_api_client.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/attachment_model.dart'; +import 'package:mohem_flutter_app/models/get_approves_list_model.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/button/simple_button.dart'; +import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; +import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart'; +import 'package:mohem_flutter_app/widgets/input_widget.dart'; + +class RequestSubmitScreenParams { + String title; + int transactionId; + String pItemId; + + RequestSubmitScreenParams(this.title, this.transactionId, this.pItemId); +} + +class RequestSubmitScreen extends StatefulWidget { + RequestSubmitScreen({Key? key}) : super(key: key); + + @override + _RequestSubmitScreenState createState() { + return _RequestSubmitScreenState(); + } +} + +class _RequestSubmitScreenState extends State { + RequestSubmitScreenParams? params; + TextEditingController comments = TextEditingController(); + + List approverList = []; + List attachmentFiles = []; + + @override + void initState() { + super.initState(); + } + + void getApproverList() async { + try { + Utils.showLoading(context); + approverList = await MyAttendanceApiClient().getApproversList("SSHRMS", params!.transactionId); + + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void submitRequest() async { + try { + Utils.showLoading(context); + List> list = []; + if (attachmentFiles.isNotEmpty) { + attachmentFiles.asMap().forEach((index, value) async { + String type = value.path.split('.').last; + String name = value.path.split('/').last; + List fileContent = await value.readAsBytes(); + String encodedFile = base64Encode(fileContent); + list.add(AttachmentModel( + attachmentID: index, + pFILECONTENTTYPE: type, + pFILENAME: name, + pFILEDATA: encodedFile, + pTRANSACTIONID: params!.transactionId, + ).toJson()); + }); + } + await MyAttendanceApiClient().addAttachment(list); + await MyAttendanceApiClient().startEitApprovalProcess( + "SUBMIT", + comments.text, + params!.pItemId, + params!.transactionId, + ); + Utils.hideLoading(context); + Utils.showToast(LocaleKeys.yourRequestHasBeenSubmittedForApprovals.tr(), longDuration: true); + Navigator.of(context).popUntil((route) { + return route.settings.name == AppRoutes.dashboard; + }); + Navigator.pushNamed(context, AppRoutes.workList); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + if (params == null) { + params = ModalRoute.of(context)!.settings.arguments as RequestSubmitScreenParams; + getApproverList(); + } + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: params!.title, + ), + body: Column( + children: [ + ListView( + padding: const EdgeInsets.all(21).copyWith(top: 14), + physics: const BouncingScrollPhysics(), + children: [ + attachmentView("Attachments"), + 14.height, + InputWidget( + LocaleKeys.comments.tr(), + LocaleKeys.writeComment.tr(), + comments, + isBackgroundEnable: true, + lines: 3, + onChange: (String note) { + // this.note = note; + }, + ), //.objectContainerView(title: "Comments"), + 14.height, + LocaleKeys.approversList.tr().toSectionHeading(), + 14.height, + ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (cxt, index) { + return approverView(cxt, approverList[index]); + }, + separatorBuilder: (cxt, index) => 12.height, + itemCount: approverList.length, + ) + ], + ).expanded, + DefaultButton( + LocaleKeys.submit.tr(), + () { + showDialog( + context: context, + builder: (cxt) => ConfirmDialog( + message: LocaleKeys.areYouSureYouWantToSubmit.tr(), + onTap: () { + Navigator.pop(context); + submitRequest(); + }, + ), + ); + }, + ).insideContainer, + ], + ), + ); + } + + Widget approverView(BuildContext context, GetApprovesList approver) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CircularAvatar(url: approver.eMPLOYEEIMAGE, isImageBase64: true, height: 40, width: 40), + 9.width, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + approver.aPPROVER!.toText16(), + approver.pOSITIONTITLE!.toText12(color: MyColors.lightTextColor), + ], + ), + ) + ], + ).objectContainerView(); + } + + Widget attachmentView(String title) { + return Container( + padding: const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + title.toText16().expanded, + 6.width, + SimpleButton("Add", () async { + FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true); + if (result != null) { + attachmentFiles = attachmentFiles + result.paths.map((path) => File(path!)).toList(); + attachmentFiles = attachmentFiles.toSet().toList(); + setState(() {}); + } + }, fontSize: 14), + ], + ), + if (attachmentFiles.isNotEmpty) 12.height, + if (attachmentFiles.isNotEmpty) + ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (cxt, index) { + String fileName = attachmentFiles[index].path.split('/').last; + + return Row( + children: [ + fileName.toText13().expanded, + 6.width, + IconButton( + padding: EdgeInsets.zero, + iconSize: 20, + icon: const Icon(Icons.cancel_rounded), + color: MyColors.redColor, + constraints: const BoxConstraints(), + onPressed: () async { + attachmentFiles.removeAt(index); + setState(() {}); + }, + ) + ], + ); + }, + separatorBuilder: (cxt, index) => 6.height, + itemCount: attachmentFiles.length), + ], + ), + ); + } +} 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 114c53c..ef75031 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -5,13 +5,17 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/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'; +import 'package:mohem_flutter_app/models/dyanmic_forms/validate_eit_transaction_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/submit_eit_transaction_list_model.dart'; +import 'package:mohem_flutter_app/ui/misc/request_submit_screen.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'; @@ -40,6 +44,8 @@ class _DynamicInputScreenState extends State { try { Utils.showLoading(context); genericResponseModel = await MyAttendanceApiClient().getEitDffStructure(dynamicParams!.dynamicId); + dESCFLEXCONTEXTCODE = genericResponseModel!.pDESCFLEXCONTEXTCODE ?? ""; + descFlexConTextTitle = genericResponseModel!.pDESCFLEXCONTEXTNAME ?? ""; getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? []; //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); Utils.hideLoading(context); @@ -50,20 +56,60 @@ class _DynamicInputScreenState extends State { } } + void validateTransaction() async { + try { + Utils.showLoading(context); + List> values = getEitDffStructureList!.map((e) { + String tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; + if (e.fORMATTYPE == "X") { + // for date format type, date format is changed + tempVar = e.eSERVICESDV?.pVALUECOLUMNNAME ?? ""; + if (tempVar.isNotEmpty) { + 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); + Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, + arguments: RequestSubmitScreenParams(descFlexConTextTitle, submitEITTransactionList.pTRANSACTIONID!, submitEITTransactionList.pITEMKEY!)); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + String dESCFLEXCONTEXTCODE = ""; + String descFlexConTextTitle = ""; + void calGetValueSetValues(GetEITDFFStructureList structureList) async { try { Utils.showLoading(context); String segmentId = structureList.cHILDSEGMENTSVS!; + if (dESCFLEXCONTEXTCODE.isEmpty) dESCFLEXCONTEXTCODE = structureList.dESCFLEXCONTEXTCODE!; + List filteredList = getEitDffStructureList?.where((element) => element.cHILDSEGMENTSVS == segmentId).toList() ?? []; List> values = filteredList .map((e) => GetSetValuesRequestModel( sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) .toJson()) .toList(); - ESERVICESVS genericResponseModel = await MyAttendanceApiClient().getValueSetValues(structureList.cHILDSEGMENTSVS!, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); - + ESERVICESVS eServicesResponseModel = await MyAttendanceApiClient().getValueSetValues(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); + List abc = genericResponseModel?.getEITDFFStructureList ?? []; + getEitDffStructureList = abc; int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS); - getEitDffStructureList![index].eSERVICESVS!.add(genericResponseModel); + getEitDffStructureList![index].eSERVICESVS!.clear(); + getEitDffStructureList![index].eSERVICESVS!.add(eServicesResponseModel); // getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? []; //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); Utils.hideLoading(context); @@ -74,6 +120,39 @@ class _DynamicInputScreenState extends State { } } + void getDefaultValues(GetEITDFFStructureList structureList) async { + try { + 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 filteredList = + getEitDffStructureList!.where((outerElement) => parentRequired.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); + } + } + @override void dispose() { super.dispose(); @@ -96,7 +175,7 @@ class _DynamicInputScreenState extends State { (getEitDffStructureList == null ? const SizedBox() : (getEitDffStructureList!.isEmpty - ? LocaleKeys.noDataAvailable.tr().toText16().center + ? Utils.getNoDataWidget(context) : ListView.separated( physics: const BouncingScrollPhysics(), padding: const EdgeInsets.all(21), @@ -109,9 +188,11 @@ class _DynamicInputScreenState extends State { LocaleKeys.next.tr(), (getEitDffStructureList ?? []).isEmpty ? null - : () => { - //Navigator.of(context).pushNamed(LOGIN_TYPE) - }, + : () { + validateTransaction(); + + //Navigator.of(context).pushNamed(LOGIN_TYPE) + }, ).insideContainer, ], ), @@ -120,30 +201,202 @@ class _DynamicInputScreenState extends State { Widget parseDynamicFormatType(GetEITDFFStructureList model, int index) { if (model.dISPLAYFLAG != "N") { + if (model.vALIDATIONTYPE == "N") { + if (model.fORMATTYPE == "C") { + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.eSERVICESDV?.pIDCOLUMNNAME ?? "", + isReadOnly: model.rEADONLY == "Y", + onChange: (text) { + model.fieldAnswer = text; + model.eSERVICESDV ??= ESERVICESDV(); + model.eSERVICESDV!.pIDCOLUMNNAME = text; + }, + ).paddingOnly(bottom: 12); + } else if (model.fORMATTYPE == "N") { + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.eSERVICESDV?.pIDCOLUMNNAME ?? "", + isReadOnly: model.rEADONLY == "Y", + isInputTypeNum: true, + onChange: (text) { + model.fieldAnswer = text; + model.eSERVICESDV ??= ESERVICESDV(); + model.eSERVICESDV!.pIDCOLUMNNAME = text; + }, + ).paddingOnly(bottom: 12); + } else if (model.fORMATTYPE == "X") { + 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)); + } + } + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + displayText, + suffixIconData: Icons.calendar_today, + isEnable: false, + onTap: () async { + if ((getEitDffStructureList![index].eSERVICESDV?.pVALUECOLUMNNAME != null)) { + if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { + selectedDate = DateFormat("yyyy/MM/dd").parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!.replaceAll('/"', '').replaceAll(" 00:00:00", "")); + } else { + selectedDate = DateTime.parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!); + } + } + DateTime date = await _selectDate(context); + 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), + 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)); + } else { + eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), + 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)); + } + getEitDffStructureList![index].eSERVICESDV = eservicesdv; + setState(() {}); + if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { + calGetValueSetValues(model); + } + if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + 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)); + } + } + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + displayText, + suffixIconData: Icons.calendar_today, + isEnable: false, + onTap: () async { + if ((getEitDffStructureList![index].eSERVICESDV?.pVALUECOLUMNNAME != null)) { + if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { + String tempDate = getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!; + if (tempDate.contains("00:00:00")) { + tempDate = tempDate.replaceAll("00:00:00", '').trim(); + } + 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); + // getEitDffStructureList![index].fieldAnswer = date.toString(); + ESERVICESDV eservicesdv; + if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { + eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: DateFormat('yyyy/MM/dd HH:MM:SS').format(date1), + 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)); + } else { + eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), + 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)); + } + + getEitDffStructureList![index].eSERVICESDV = eservicesdv; + setState(() {}); + if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { + calGetValueSetValues(model); + } + if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + getDefaultValues(model); + } + }, + ).paddingOnly(bottom: 12); + } + } else { + return PopupMenuButton( + child: DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.eSERVICESDV?.pVALUECOLUMNNAME ?? "", + isEnable: false, + isPopup: true, + isInputTypeNum: true, + 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), + ], + onSelected: (int popipIndex) { + ESERVICESDV eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: model.eSERVICESVS![popipIndex].iDCOLUMNNAME, + pRETURNMSG: "null", + pRETURNSTATUS: getEitDffStructureList![popipIndex].dEFAULTVALUE, + pVALUECOLUMNNAME: model.eSERVICESVS![popipIndex].vALUECOLUMNNAME); + getEitDffStructureList![index].eSERVICESDV = eservicesdv; + setState(() {}); + if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { + calGetValueSetValues(model); + } + if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + getDefaultValues(model); + } + }); + } } else { return const SizedBox(); } - - if (model.fORMATTYPE == "C") { + if (model.fORMATTYPE == "N") { if (model.eSERVICESVS?.isNotEmpty ?? false) { return PopupMenuButton( child: DynamicTextFieldWidget( (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), - model.eSERVICESDV?.pIDCOLUMNNAME ?? "", + model.eSERVICESDV?.pVALUECOLUMNNAME ?? "", isEnable: false, isPopup: true, + isInputTypeNum: true, + 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), ], - onSelected: (int index) { + onSelected: (int popipIndex) { ESERVICESDV eservicesdv = ESERVICESDV( - pIDCOLUMNNAME: model.eSERVICESVS![index].vALUECOLUMNNAME, + pIDCOLUMNNAME: model.eSERVICESVS![popipIndex].iDCOLUMNNAME, pRETURNMSG: "null", - pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, - pVALUECOLUMNNAME: model.eSERVICESVS![index].vALUECOLUMNNAME); - - print(model.eSERVICESVS![index].toJson()); + pRETURNSTATUS: getEitDffStructureList![popipIndex].dEFAULTVALUE, + pVALUECOLUMNNAME: model.eSERVICESVS![popipIndex].vALUECOLUMNNAME); + getEitDffStructureList![index].eSERVICESDV = eservicesdv; + setState(() {}); + if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { + calGetValueSetValues(model); + } + if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + getDefaultValues(model); + } }); } @@ -155,13 +408,29 @@ class _DynamicInputScreenState extends State { model.fieldAnswer = text; }, ).paddingOnly(bottom: 12); - } else if (model.fORMATTYPE == "X") { + } else if (model.fORMATTYPE == "X" || 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)); + } + } return DynamicTextFieldWidget( (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), - model.eSERVICESDV?.pIDCOLUMNNAME ?? (getEitDffStructureList![index].fieldAnswer ?? ""), + displayText, suffixIconData: Icons.calendar_today, isEnable: false, onTap: () async { + if ((getEitDffStructureList![index].eSERVICESDV?.pVALUECOLUMNNAME != null)) { + if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { + selectedDate = DateFormat("yyyy/MM/dd").parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!.replaceAll('/"', '').replaceAll(" 00:00:00", "")); + } else { + selectedDate = DateTime.parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!); + } + } DateTime date = await _selectDate(context); DateTime date1 = DateTime(date.year, date.month, date.day); getEitDffStructureList![index].fieldAnswer = date.toString(); @@ -169,12 +438,45 @@ class _DynamicInputScreenState extends State { pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), pRETURNMSG: "null", pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, - pVALUECOLUMNNAME: DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy-MM-dd hh:mm:ss').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); + if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { + calGetValueSetValues(model); + } if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + getDefaultValues(model); + } + }, + ).paddingOnly(bottom: 12); + } else if (model.fORMATTYPE == "I") { + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.eSERVICESDV?.pIDCOLUMNNAME ?? (getEitDffStructureList![index].fieldAnswer ?? ""), + suffixIconData: Icons.access_time_filled_rounded, + isEnable: false, + onTap: () async { + if ((getEitDffStructureList![index].eSERVICESDV?.pVALUECOLUMNNAME != null)) { + var timeString = getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!.split(":"); + selectedDate = DateTime(0, 0, 0, int.parse(timeString[0]), int.parse(timeString[1])); + + //DateTime.parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!); + } + TimeOfDay _time = await _selectTime(context); + DateTime tempTime = DateTime(0, 1, 1, _time.hour, _time.minute); + String time = DateFormat('HH:mm').format(tempTime).trim(); + + // DateTime date1 = DateTime(date.year, date.month, date.day); + // getEitDffStructureList![index].fieldAnswer = date.toString(); + ESERVICESDV eservicesdv = ESERVICESDV(pIDCOLUMNNAME: time, pRETURNMSG: "null", pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, pVALUECOLUMNNAME: time); + getEitDffStructureList![index].eSERVICESDV = eservicesdv; + setState(() {}); + if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { calGetValueSetValues(model); } + if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + getDefaultValues(model); + } }, ).paddingOnly(bottom: 12); } @@ -217,4 +519,45 @@ class _DynamicInputScreenState extends State { } return time; } + + Future _selectTime(BuildContext context) async { + TimeOfDay time = TimeOfDay(hour: selectedDate.hour, minute: selectedDate.minute); + if (!Platform.isIOS) { + await showCupertinoModalPopup( + context: context, + builder: (cxt) => Container( + height: 250, + color: Colors.white, + child: CupertinoDatePicker( + backgroundColor: Colors.white, + mode: CupertinoDatePickerMode.time, + use24hFormat: true, + onDateTimeChanged: (value) { + if (value != null && value != selectedDate) { + time = TimeOfDay(hour: value.hour, minute: value.minute); + } + }, + initialDateTime: selectedDate, + ), + ), + ); + } else { + final TimeOfDay? picked = await showTimePicker( + context: context, + initialTime: time, + builder: (cxt, child) { + return MediaQuery(data: MediaQuery.of(context).copyWith(alwaysUse24HourFormat: true), child: child ?? Container()); + }); + + if (picked != null && picked != time) { + time = picked; + } + // final DateTime? picked = + // await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101)); + // if (picked != null && picked != selectedDate) { + // time = picked; + // } + } + return time; + } } diff --git a/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart b/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart index 37ba465..54aee5c 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart @@ -1,13 +1,10 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; -import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; -import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; @@ -18,6 +15,7 @@ class DynamicListViewParams { String uRL; String requestID; String colsURL; + DynamicListViewParams(this.title, this.dynamicId, {this.uRL = 'GET_EIT_DFF_STRUCTURE', this.requestID = '', this.colsURL = ''}); } @@ -33,6 +31,7 @@ class DynamicListViewScreen extends StatefulWidget { class _DynamicListViewScreenState extends State { List? getEITTransactionList; DynamicListViewParams? dynamicParams; + @override void initState() { super.initState(); @@ -42,6 +41,11 @@ class _DynamicListViewScreenState extends State { try { Utils.showLoading(context); getEITTransactionList = await MyAttendanceApiClient().getEitTransaction(dynamicParams!.dynamicId); + getEITTransactionList?.forEach((element) { + element.collectionTransaction = element.collectionTransaction?.where((elemen) => elemen.dISPLAYFLAG == "Y").toList() ?? []; + }); + + getEITTransactionList = getEITTransactionList?.where((element) => element.collectionTransaction?.isNotEmpty ?? false).toList() ?? []; Utils.hideLoading(context); setState(() {}); } catch (ex) { @@ -64,27 +68,26 @@ class _DynamicListViewScreenState extends State { return Scaffold( backgroundColor: Colors.white, - appBar: AppBarWidget( - context, - title: dynamicParams!.title, - ), + appBar: AppBarWidget(context, title: dynamicParams!.title), body: getEITTransactionList == null ? const SizedBox() : (getEITTransactionList!.isEmpty - ? LocaleKeys.noDataAvailable.tr().toText16().center + ? Utils.getNoDataWidget(context) : ListView.separated( physics: const BouncingScrollPhysics(), - padding: EdgeInsets.all(21), - itemBuilder: (cxt, int parentIndex) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - for (int t = 0; t < (getEITTransactionList![parentIndex].collectionTransaction ?? []).length; t++) - if (getEITTransactionList![parentIndex].collectionTransaction![t].dISPLAYFLAG == "Y") - ItemDetailView( - getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTPROMPT!, getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTVALUEDSP ?? ""), - ], - ).objectContainerView(), + padding: const EdgeInsets.all(21), + itemBuilder: (cxt, int parentIndex) => getEITTransactionList![parentIndex].collectionTransaction!.isEmpty + ? const SizedBox() + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + for (int t = 0; t < (getEITTransactionList![parentIndex].collectionTransaction ?? []).length; t++) + if (getEITTransactionList![parentIndex].collectionTransaction![t].dISPLAYFLAG == "Y") + ItemDetailView( + getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTPROMPT!, getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTVALUEDSP ?? ""), + ], + ).objectContainerView(), separatorBuilder: (cxt, index) => 12.height, itemCount: getEITTransactionList!.length)), floatingActionButton: Container( diff --git a/lib/ui/my_attendance/my_attendance_screen.dart b/lib/ui/my_attendance/my_attendance_screen.dart index 2b74c98..276f2cc 100644 --- a/lib/ui/my_attendance/my_attendance_screen.dart +++ b/lib/ui/my_attendance/my_attendance_screen.dart @@ -2,19 +2,24 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; class MyAttendanceScreen extends StatelessWidget { - MyAttendanceScreen({Key? key}) : super(key: key); + List list; + + MyAttendanceScreen({Key? key, this.list = const []}) : super(key: key); @override Widget build(BuildContext context) { + list = ModalRoute.of(context)!.settings.arguments as List; return Scaffold( backgroundColor: Colors.white, appBar: AppBarWidget( @@ -24,29 +29,31 @@ class MyAttendanceScreen extends StatelessWidget { body: SizedBox( width: double.infinity, height: double.infinity, - child: ListView( - children: [ - 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, - itemView( - "assets/images/pdf.svg", - LocaleKeys.workFromHome.tr(), - ).onPress(() { - Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.workFromHome.tr(), "HMG_OTL_WFH_EIT_SS")); - }), - 12.height, - itemView( - "assets/images/pdf.svg", - LocaleKeys.workOnBreak.tr(), - ), - ], - ).paddingAll(21)), + child: list.isEmpty + ? Utils.getNoDataWidget(context) + : Column( + children: [ + itemView( + "assets/images/pdf.svg", + LocaleKeys.missingSwipes.tr(), + ).onPress(() { + Navigator.pushNamed(context, AppRoutes.monthlyAttendance); + }), + 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 + ], + )), ); } diff --git a/lib/ui/payslip/monthly_pay_slip_screen.dart b/lib/ui/payslip/monthly_pay_slip_screen.dart new file mode 100644 index 0000000..a277fcd --- /dev/null +++ b/lib/ui/payslip/monthly_pay_slip_screen.dart @@ -0,0 +1,290 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/monthly_pay_slip_api_client.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_deductions_List_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_earnings_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_pay_slip_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_payment_information_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_summary_of_payment_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 MonthlyPaySlipScreen extends StatefulWidget { + MonthlyPaySlipScreen({Key? key}) : super(key: key); + + @override + _MonthlyPaySlipScreenState createState() { + return _MonthlyPaySlipScreenState(); + } +} + +class _MonthlyPaySlipScreenState extends State { + List paySlipList = []; + List summaryOfPaymentList = []; + List paymentInformationList = []; + List deductionList = []; + List earningList = []; + int? selectedMonthIndex; + + @override + void initState() { + super.initState(); + getData(); + } + + void getData() async { + try { + Utils.showLoading(context); + paySlipList = await MonthlyPaySlipApiClient().getPaySlip(); + if (paySlipList.isNotEmpty) { + selectedMonthIndex = 0; + await getDataByActionContextID(paySlipList[selectedMonthIndex!].aCTIONCONTEXTID!); + } + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + Future getDataByActionContextID(int actionContextID, {bool showLoading = false}) async { + try { + if (showLoading) { + Utils.showLoading(context); + } + List results = await Future.wait([ + MonthlyPaySlipApiClient().getSummaryOfPayment(actionContextID), + MonthlyPaySlipApiClient().getPaymentInformation(actionContextID), + MonthlyPaySlipApiClient().getDeductions(actionContextID), + MonthlyPaySlipApiClient().getEarnings(actionContextID), + ]); + summaryOfPaymentList = results[0]; + paymentInformationList = results[1]; + deductionList = results[2]; + earningList = results[3]; + if (showLoading) { + Utils.hideLoading(context); + setState(() {}); + } + } catch (ex) { + if (showLoading) { + 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.monthlyPaySlip.tr(), + ), + body: Column( + children: [ + if (selectedMonthIndex != null) + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Container(alignment: Alignment.centerLeft, child: LocaleKeys.month.tr().toText17(isBold: true, color: MyColors.darkIconColor)), + Row( + children: [ + DateFormat("MMMM-yyyy").format(DateFormat("MM/dd/yyyy").parse(paySlipList[selectedMonthIndex!].pAYMENTDATE!)).toText16(color: MyColors.greyACColor), + const Icon(Icons.keyboard_arrow_down_rounded, color: MyColors.greyACColor), + ], + ).onPress(() async { + int tempIndex = selectedMonthIndex!; + showModalBottomSheet( + context: context, + builder: (cxt) { + return Container( + height: 200, + color: Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + LocaleKeys.ok.tr().toText16(color: MyColors.gradiantEndColor).paddingOnly(right: 21, top: 16).onPress(() { + if (selectedMonthIndex != tempIndex) { + selectedMonthIndex = tempIndex; + Navigator.pop(context); + getDataByActionContextID(paySlipList[selectedMonthIndex!].aCTIONCONTEXTID!, showLoading: true); + } + }), + CupertinoPicker( + itemExtent: 40, + onSelectedItemChanged: (index) { + tempIndex = index; + }, + children: [for (int i = 0; i < paySlipList.length; i++) paySlipList[i].pERIODNAME!.toText16().center]).expanded, + ], + ), + ); + }); + }) + ], + ).paddingOnly(left: 21, right: 21), + ListView( + padding: const EdgeInsets.all(21), + children: [ + if (summaryOfPaymentList.isNotEmpty) ...[paymentSummaryData(context)], + if (earningList.isNotEmpty) ...[18.height, earningData(context)], + if (deductionList.isNotEmpty) ...[18.height, deductionData(context)], + if (paymentInformationList.isNotEmpty) ...[12.height, paymentInformationData(context)] + ], + ).expanded, + ], + ), + ); + } + + Widget earningData(context) { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Utils.tableColumnTitle(LocaleKeys.particular.tr()), + Utils.tableColumnTitle(LocaleKeys.amount.tr(), alignCenter: true), + ], + ), + ); + for (int i = 0; i < earningList.length; i++) { + tableRow.add( + TableRow(children: [ + Utils.tableColumnValue('${earningList[i].eLEMENTNAME}'), + Utils.tableColumnValue('${earningList[i].aMOUNT}', alignCenter: true), + ]), + ); + } + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + LocaleKeys.earnings.tr().toSectionHeading(), + 12.height, + Table( + columnWidths: const {0: FlexColumnWidth(1.5), 1: FlexColumnWidth(1.0)}, + children: tableRow, + ).objectContainerView(), + ], + ); + } + + Widget deductionData(context) { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Utils.tableColumnTitle(LocaleKeys.particular.tr()), + Utils.tableColumnTitle(LocaleKeys.amount.tr(), alignCenter: true), + ], + ), + ); + for (int i = 0; i < deductionList.length; i++) { + tableRow.add( + TableRow(children: [ + Utils.tableColumnValue('${deductionList[i].eLEMENTNAME}'), + Utils.tableColumnValue('${deductionList[i].aMOUNT}', alignCenter: true), + ]), + ); + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + LocaleKeys.deductions.tr().toSectionHeading(), + 12.height, + Table( + columnWidths: const {0: FlexColumnWidth(1.5), 1: FlexColumnWidth(1.0)}, + children: tableRow, + ).objectContainerView(), + ], + ); + } + + Widget paymentSummaryData(context) { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Utils.tableColumnTitle(LocaleKeys.particular.tr()), + Utils.tableColumnTitle("%", alignCenter: true), + Utils.tableColumnTitle(LocaleKeys.amount.tr(), alignCenter: true), + ], + ), + ); + + tableRow.add( + TableRow(children: [ + Utils.tableColumnValue(LocaleKeys.deductions.tr()), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALDEDUCTIONSPERCENTAGE}', alignCenter: true), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALDEDUCTIONSAMOUNT}', alignCenter: true), + ]), + ); + tableRow.add( + TableRow(children: [ + Utils.tableColumnValue(LocaleKeys.earnings.tr()), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALEARNINGSPERCENTAGE}', alignCenter: true), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALEARNINGSAMOUNT}', alignCenter: true), + ]), + ); + tableRow.add( + TableRow(children: [ + Utils.tableColumnValue(LocaleKeys.totalPayAmount.tr()), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALPAYPERCENTAGE}', alignCenter: true), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALPAYAMOUNT}', alignCenter: true), + ]), + ); + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + LocaleKeys.summaryOfInformation.tr().toSectionHeading(), + 12.height, + Table( + columnWidths: const {0: FlexColumnWidth(2.0), 1: FlexColumnWidth(1.0), 2: FlexColumnWidth(1.0)}, + children: tableRow, + ).objectContainerView(), + ], + ); + } + + Widget paymentInformationData(context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + LocaleKeys.paymentInformation.tr().toSectionHeading(), + 12.height, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + ItemDetailView(LocaleKeys.paymentMethodName.tr(), paymentInformationList[0].pAYMENTMETHODNAME ?? ""), + ItemDetailView(LocaleKeys.bankName.tr(), paymentInformationList[0].bANKNAME ?? ""), + ItemDetailView(LocaleKeys.branchCode.tr(), paymentInformationList[0].bRANCHNAME ?? ""), + ItemDetailView(LocaleKeys.accountNo.tr(), paymentInformationList[0].aCCOUNTNUMBER ?? ""), + ItemDetailView(LocaleKeys.amount.tr(), paymentInformationList[0].aMOUNT ?? ""), + ], + ).objectContainerView(), + ], + ); + } +} diff --git a/lib/ui/profile/basic_details.dart b/lib/ui/profile/basic_details.dart index 8a316fd..d825c2b 100644 --- a/lib/ui/profile/basic_details.dart +++ b/lib/ui/profile/basic_details.dart @@ -41,8 +41,6 @@ class _BasicDetailsState extends State { getEmployeeBasicDetailsList = await ProfileApiClient().getEmployeeBasicDetails(); Utils.hideLoading(context); basicDetails(); - print("getEmployeeBasicDetailsList.length"); - print(getEmployeeBasicDetailsList.length); setState(() {}); } catch (ex) { Utils.hideLoading(context); @@ -50,7 +48,7 @@ class _BasicDetailsState extends State { } } - basicDetails() { + void basicDetails() { for (int i = 0; i < getEmployeeBasicDetailsList.length; i++) { if (getEmployeeBasicDetailsList[i].aPPLICATIONCOLUMNNAME == 'FULL_NAME') { fullName = getEmployeeBasicDetailsList[i].sEGMENTVALUEDSP; @@ -96,11 +94,7 @@ class _BasicDetailsState extends State { children: [ Container( width: double.infinity, - margin: EdgeInsets.only( - top: 28, - left: 26, - right: 26, - ), + margin: EdgeInsets.only(top: 20, left: 21, right: 21, bottom: 20), padding: EdgeInsets.only(left: 14, right: 14, top: 13, bottom: 5), height: 280, decoration: BoxDecoration( @@ -117,29 +111,29 @@ class _BasicDetailsState extends State { ), child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ LocaleKeys.fullName.tr().toText13(color: MyColors.lightGrayColor), - "${fullName}".toText16(isBold: true, color: MyColors.blackColor), + "$fullName".toText16(isBold: true, color: MyColors.blackColor), SizedBox( height: 20, ), LocaleKeys.maritalStatus.tr().toText13(color: MyColors.lightGrayColor), - "${maritalStatus}".toText16(isBold: true, color: MyColors.blackColor), + "$maritalStatus".toText16(isBold: true, color: MyColors.blackColor), SizedBox( height: 20, ), LocaleKeys.dateOfBirth.tr().toText13(color: MyColors.lightGrayColor), - "${birthDate}".toText16(isBold: true, color: MyColors.blackColor), + "$birthDate".toText16(isBold: true, color: MyColors.blackColor), SizedBox( height: 20, ), LocaleKeys.civilIdentityNumber.tr().toText13(color: MyColors.lightGrayColor), - "${civilIdentityNumber}".toText16(isBold: true, color: MyColors.blackColor), + "$civilIdentityNumber".toText16(isBold: true, color: MyColors.blackColor), ]), ), ], )); } - footer() { + Widget footer() { return Container( decoration: BoxDecoration( // borderRadius: BorderRadius.circular(10), @@ -154,7 +148,7 @@ class _BasicDetailsState extends State { ); } - showAlertDialog(BuildContext context) { + void showAlertDialog(BuildContext context) { dynamic changeOrNew = 1; Widget cancelButton = TextButton( child: Text("Cancel"), diff --git a/lib/ui/profile/contact_details.dart b/lib/ui/profile/contact_details.dart index ce00b1d..514d3cc 100644 --- a/lib/ui/profile/contact_details.dart +++ b/lib/ui/profile/contact_details.dart @@ -3,12 +3,9 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; -import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; -import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_employee_address_model.dart'; -import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_phones_model.dart'; import 'package:mohem_flutter_app/ui/profile/phone_numbers.dart'; import 'package:mohem_flutter_app/ui/profile/profile.dart'; @@ -141,7 +138,7 @@ class _ContactDetailsState extends State { right: 26, ), padding: EdgeInsets.only(left: 14, right: 14, top: 5, bottom: 20), - // height: 400, + height: 400, decoration: BoxDecoration( boxShadow: [ BoxShadow( @@ -212,7 +209,7 @@ class _ContactDetailsState extends State { ]))); } - footer() { + Widget footer() { return Container( decoration: BoxDecoration( // borderRadius: BorderRadius.circular(10), @@ -228,7 +225,7 @@ class _ContactDetailsState extends State { ); } - updatePhone() { + void updatePhone() { Navigator.push( context, MaterialPageRoute(builder: (context) => PhoneNumbers(getEmployeePhonesList: this.getEmployeePhonesList)), diff --git a/lib/ui/profile/delete_familyMember.dart b/lib/ui/profile/delete_familyMember.dart new file mode 100644 index 0000000..a988881 --- /dev/null +++ b/lib/ui/profile/delete_familyMember.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; + +class DeleteFamilyMember extends StatefulWidget { + const DeleteFamilyMember({Key? key}) : super(key: key); + + @override + _DeleteFamilyMemberState createState() => _DeleteFamilyMemberState(); +} + +class _DeleteFamilyMemberState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBarWidget( + context, + title: "Dependents And Beneficiaries", + ), + backgroundColor: MyColors.backgroundColor, + bottomSheet: footer(), + body: Column( + children: [], + )); + } + + Widget footer() { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + color: MyColors.gradiantEndColor, + // margin: EdgeInsets.only(left: 50,right: 20), + padding: EdgeInsets.only(left: 50, right: 50), + child: TextButton( + style: TextButton.styleFrom( + primary: MyColors.white, + onSurface: MyColors.white, + backgroundColor: MyColors.gradiantEndColor, + ), + onPressed: () {}, + child: Text( + 'Next', + 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 new file mode 100644 index 0000000..0fa6845 --- /dev/null +++ b/lib/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart @@ -0,0 +1,83 @@ + +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; + //String dynamicId; + // String uRL; + // String requestID; + // String colsURL; + List? getEmployeeContactsList; + + DynamicFamilyMembersParams(this.title, + {this.getEmployeeContactsList = const []}); +} + +class DynamicFamilyMembersScreen extends StatefulWidget { + DynamicFamilyMembersScreen({Key? key}) : super(key: key); + + @override + _DynamicFamilyMembersScreenState createState() { + return _DynamicFamilyMembersScreenState(); + } +} + +class _DynamicFamilyMembersScreenState extends State { + // GenericResponseModel? genericResponseModel; + DynamicFamilyMembersParams? dynamicFamilyParams; + + @override + void initState() { + super.initState(); + } + + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + if(dynamicFamilyParams == null) { + dynamicFamilyParams = ModalRoute.of(context)!.settings.arguments as DynamicFamilyMembersParams; + } + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: dynamicFamilyParams!.title, + ), + body: Column( + children: [ + + ], + ), + ); + } + + +} diff --git a/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart index 6e054c9..6fe8046 100644 --- a/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart +++ b/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart @@ -1,6 +1,5 @@ import 'dart:io'; - import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -15,6 +14,7 @@ import 'package:mohem_flutter_app/models/dyanmic_forms/get_set_values_request_mo 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'; @@ -123,7 +123,7 @@ class _DynamicInputScreenState extends State { (getBasicDetDffStructureList == null && getBasicDetColsStructureList == null ? const SizedBox() : (getBasicDetDffStructureList!.isEmpty && getBasicDetColsStructureList!.isEmpty - ? LocaleKeys.noDataAvailable.tr().toText16().center + ? Utils.getNoDataWidget(context) : ListView( physics: const BouncingScrollPhysics(), padding: const EdgeInsets.all(21), @@ -181,7 +181,7 @@ class _DynamicInputScreenState extends State { for (int i = 0; i < model.eSERVICESVS!.length; i++) PopupMenuItem(child: Text(model.eSERVICESVS![i].vALUECOLUMNNAME!), value: i), ], onSelected: (int popupIndex) { - getBasicDetDffStructureList![index].userBasicDetail!.sEGMENTVALUEDSP = model.eSERVICESVS![popupIndex].vALUECOLUMNNAME!; + getBasicDetDffStructureList![index].userBasicDetail!.sEGMENTVALUEDSP = model.eSERVICESVS![popupIndex].vALUECOLUMNNAME; setState(() {}); }); } @@ -192,7 +192,6 @@ class _DynamicInputScreenState extends State { isReadOnly: model.rEADONLY == "Y", onChange: (text) { getBasicDetDffStructureList![index].userBasicDetail!.sEGMENTVALUEDSP = text; - }, ).paddingOnly(bottom: 12); } else if (model.fORMATTYPE == "X") { @@ -247,7 +246,7 @@ class _DynamicInputScreenState extends State { onSelected: (int popupIndex) { ESERVICESDV eservicesdv = ESERVICESDV(pIDCOLUMNNAME: model.objectValuesList![index].dESCRIPTION, pRETURNMSG: "null", pRETURNSTATUS: model.oBJECTNAME, pVALUECOLUMNNAME: model.aPPLICATIONCOLUMNNAME); - getBasicDetDffStructureList![index].userBasicDetail!.sEGMENTVALUEDSP = model.objectValuesList![popupIndex].dESCRIPTION!; + getBasicDetDffStructureList![index].userBasicDetail!.sEGMENTVALUEDSP = model.objectValuesList![popupIndex].dESCRIPTION; setState(() {}); }); } diff --git a/lib/ui/profile/dynamic_screens/dynamic_listview_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_listview_screen.dart index 5ba4109..ed35527 100644 --- a/lib/ui/profile/dynamic_screens/dynamic_listview_screen.dart +++ b/lib/ui/profile/dynamic_screens/dynamic_listview_screen.dart @@ -70,7 +70,7 @@ class _DynamicListViewScreenState extends State { body: getEITTransactionList == null ? const SizedBox() : (getEITTransactionList!.isEmpty - ? LocaleKeys.noDataAvailable.tr().toText16().center + ? Utils.getNoDataWidget(context) : ListView.separated( physics: const BouncingScrollPhysics(), padding: EdgeInsets.all(21), diff --git a/lib/ui/profile/family_members.dart b/lib/ui/profile/family_members.dart index d62f101..bf65fed 100644 --- a/lib/ui/profile/family_members.dart +++ b/lib/ui/profile/family_members.dart @@ -1,20 +1,13 @@ - - - - - import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; -import 'package:mohem_flutter_app/dialogs/otp_dialog.dart'; -import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; -import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; -import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; +import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart'; import 'package:mohem_flutter_app/ui/profile/profile.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; @@ -27,15 +20,14 @@ class FamilyMembers extends StatefulWidget { } class _FamilyMembersState extends State { - List getEmployeeContactsList = []; + int? relationId; @override void initState() { super.initState(); getEmployeeContacts(); - } void getEmployeeContacts() async { @@ -50,7 +42,6 @@ class _FamilyMembersState extends State { } } - Widget build(BuildContext context) { return Scaffold( appBar: AppBarWidget( @@ -58,154 +49,156 @@ class _FamilyMembersState extends State { title: LocaleKeys.profile_familyDetails.tr(), ), backgroundColor: MyColors.backgroundColor, - bottomSheet:footer(), - body: Column( - children: [ - SizedBox(height: 20,), - getEmployeeContactsList.length != 0 - ? SingleChildScrollView( - child: Column( - children: [ - ListView.builder( - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: ScrollPhysics(), - itemCount: getEmployeeContactsList.length, - itemBuilder: (context, index) { - return Container( - child: Column( - children: [ - Container( - width: double.infinity, - margin: EdgeInsets.only(top: 10, left: 26, right: 26,), - padding: EdgeInsets.only(left: 14, right: 14,top: 13, ), - height: 110, - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 5, - blurRadius: 26, - offset: Offset(0, 3), - ), - ], - color: Colors.white, - borderRadius: BorderRadius.circular(10.0), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "${getEmployeeContactsList[index].cONTACTNAME}".toText16(color: MyColors.blackColor), - "${getEmployeeContactsList[index].rELATIONSHIP}".toText11(isBold: true, color: MyColors.textMixColor), - SizedBox(height: 5,), - Divider( - color: MyColors.lightGreyEFColor, - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ + bottomSheet: footer(), + body: Container( + width: MediaQuery.of(context).size.width, + child: getEmployeeContactsList.length != 0 + ? SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + children: [ + ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + itemCount: getEmployeeContactsList.length, + itemBuilder: (context, index) { + return Container( + child: Column( + children: [ Container( - child: InkWell( - onTap: () { - - }, - child: RichText( - text: TextSpan( - children: [ - WidgetSpan( - child: Icon( - Icons.edit, - size: 15, - color: MyColors.grey67Color, - ), - ), - TextSpan( - text: LocaleKeys.update.tr(), - style: TextStyle( - color: MyColors.grey67Color, - fontSize: 12, - fontWeight: FontWeight.bold, - ), - ), - ], - ), + width: double.infinity, + margin: EdgeInsets.only( + top: 20, + left: 21, + right: 21, + ), + padding: EdgeInsets.only( + left: 14, + right: 14, + top: 13, + ), + height: 110, + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 5, + blurRadius: 26, + offset: Offset(0, 3), ), - ) - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: SizedBox( - child: Container( - width: 3, + ], + color: Colors.white, + borderRadius: BorderRadius.circular(10.0), + ), + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + "${getEmployeeContactsList[index].cONTACTNAME}".toText16(color: MyColors.blackColor), + "${getEmployeeContactsList[index].rELATIONSHIP}".toText11(isBold: true, color: MyColors.textMixColor), + SizedBox( + height: 5, + ), + Divider( color: MyColors.lightGreyEFColor, + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, ), - ), - ), - Container( - child: InkWell( - onTap: () { - showAlertDialog(context); - }, - child: RichText( - text: TextSpan( - children: [ - WidgetSpan( - child: Icon( - Icons.delete, - size: 15, - color: Color(0x99FF0000), - ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Container( + child: InkWell( + onTap: () { + showUpdateAlertDialog(context); + }, + child: RichText( + text: TextSpan( + children: [ + WidgetSpan( + child: Icon( + Icons.edit, + size: 15, + color: MyColors.grey67Color, + ), + ), + TextSpan( + text: LocaleKeys.update.tr(), + style: TextStyle( + color: MyColors.grey67Color, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + ], ), - TextSpan( - text:LocaleKeys.remove.tr(), - style: TextStyle( - color: MyColors.DarkRedColor, - fontSize: 12, - fontWeight: FontWeight.bold, - ), + ), + )), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: SizedBox( + child: Container( + width: 3, + color: MyColors.lightGreyEFColor, ), - ], + ), ), - ), - ) + Container( + child: InkWell( + onTap: () { + showRemoveAlertDialog(context, getEmployeeContactsList[index]!.cONTACTRELATIONSHIPID!.toInt()); + }, + child: RichText( + text: TextSpan( + children: [ + WidgetSpan( + child: Icon( + Icons.delete, + size: 15, + color: Color(0x99FF0000), + ), + ), + TextSpan( + text: LocaleKeys.remove.tr(), + style: TextStyle( + color: MyColors.DarkRedColor, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + )), + // 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: (){}, + // ), + ], + ), + ]), ), - // 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: (){}, - // ), ], - ), - ] - ), - ), - ], + )); + }) + ], + ), ) - ); - }) - ], - ), - ):Container(), - ], - ) - - - ); + : Container(), + // SizedBox(height: 20), + )); } - footer(){ + Widget footer() { return Container( decoration: BoxDecoration( // borderRadius: BorderRadius.circular(10), @@ -214,26 +207,70 @@ class _FamilyMembersState extends State { BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), ], ), - child: DefaultButton(LocaleKeys.update.tr(), () async { + child: DefaultButton("Add New Family Member", () async { // context.setLocale(const Locale("en", "US")); // to change Loacle Profile(); }).insideContainer, ); } - showAlertDialog(BuildContext context) { + void showUpdateAlertDialog(BuildContext context) { Widget cancelButton = TextButton( - child: Text("CANCEL"), - onPressed: () { + child: Text( + LocaleKeys.cancel.tr(), + ), + onPressed: () { Navigator.pop(context); }, ); Widget continueButton = TextButton( - child: Text("OK"), - onPressed: () {}, + child: Text( + LocaleKeys.ok.tr(), + ), + onPressed: () { + continueDynamicForms(); + }, ); AlertDialog alert = AlertDialog( - title: Text("Confirm"), + title: Text( + LocaleKeys.confirm.tr(), + ), + content: Text("Are You Sure You Want to Update this Member?"), + actions: [ + cancelButton, + continueButton, + ], + ); + showDialog( + context: context, + builder: (BuildContext context) { + return alert; + }, + ); + } + + void showRemoveAlertDialog(BuildContext context, int relationId) { + Widget cancelButton = TextButton( + child: Text( + LocaleKeys.cancel.tr(), + ), + onPressed: () { + Navigator.pop(context); + }, + ); + Widget continueButton = TextButton( + child: Text( + LocaleKeys.ok.tr(), + ), + onPressed: () { + Navigator.pushNamed(context, AppRoutes.deleteFamilyMember); + // continueDynamicForms(); + }, + ); + AlertDialog alert = AlertDialog( + title: Text( + LocaleKeys.confirm.tr(), + ), content: Text("Are You Sure You Want to Remove this Member?"), actions: [ cancelButton, @@ -248,4 +285,7 @@ class _FamilyMembersState extends State { ); } + void continueDynamicForms() { + Navigator.pushNamed(context, AppRoutes.addDynamicInputProfile, arguments: DynamicFamilyMembersParams(LocaleKeys.profile_familyDetails.tr(), getEmployeeContactsList: getEmployeeContactsList)); + } } diff --git a/lib/ui/profile/personal_info.dart b/lib/ui/profile/personal_info.dart index 0ad9e2f..7a44004 100644 --- a/lib/ui/profile/personal_info.dart +++ b/lib/ui/profile/personal_info.dart @@ -6,7 +6,6 @@ import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart'; - import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; @@ -98,7 +97,7 @@ class _PesonalInfoState extends State { )); } - footer() { + Widget footer() { return Container( decoration: BoxDecoration( // borderRadius: BorderRadius.circular(10), diff --git a/lib/ui/profile/phone_numbers.dart b/lib/ui/profile/phone_numbers.dart index cba17d5..0d19d07 100644 --- a/lib/ui/profile/phone_numbers.dart +++ b/lib/ui/profile/phone_numbers.dart @@ -3,15 +3,10 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; -import 'package:mohem_flutter_app/extensions/int_extensions.dart'; -import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; -import 'package:mohem_flutter_app/models/get_employee_address_model.dart'; -import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_phones_model.dart'; import 'package:mohem_flutter_app/models/profile/phone_number_types_modek.dart'; -import 'package:mohem_flutter_app/ui/profile/profile.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; @@ -27,6 +22,7 @@ class PhoneNumbers extends StatefulWidget { class _PhoneNumbersState extends State { List getPhoneNumberTypesList = []; + @override void initState() { super.initState(); @@ -42,117 +38,121 @@ class _PhoneNumbersState extends State { Widget build(BuildContext context) { return Scaffold( - appBar: AppBarWidget( - context, - title: LocaleKeys.profile_contactDetails.tr(), - ), - backgroundColor: MyColors.backgroundColor, - bottomSheet: footer(), - body: SingleChildScrollView( - child: Column(children: [ - Container( - width: double.infinity, - margin: EdgeInsets.only(left: 25, right: 25, top: 25), - padding: EdgeInsets.all(20), - // height: 400, - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(10.0), border: Border.all(color: Color.fromARGB(255, 209, 207, 207))), - child: InkWell( - child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon( - Icons.add, - color: Color(0xff259CB8), - ), - Text( - 'Add new row', - style: TextStyle(color: Color(0xff259CB8), fontWeight: FontWeight.bold), - ) - ]), - onTap: () { - addNewRow(); - }, + appBar: AppBarWidget( + context, + title: LocaleKeys.profile_contactDetails.tr(), + ), + backgroundColor: MyColors.backgroundColor, + bottomSheet: footer(), + body: SingleChildScrollView( + child: Column( + children: [ + Container( + width: double.infinity, + margin: EdgeInsets.only(left: 25, right: 25, top: 25), + padding: EdgeInsets.all(20), + // height: 400, + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(10.0), border: Border.all(color: Color.fromARGB(255, 209, 207, 207))), + child: InkWell( + child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + Icon( + Icons.add, + color: Color(0xff259CB8), + ), + Text( + 'Add new row', + style: TextStyle(color: Color(0xff259CB8), fontWeight: FontWeight.bold), + ) + ]), + onTap: () { + addNewRow(); + }, + ), ), - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: widget.getEmployeePhonesList - .map((e) => e.aCTION != 'DELETE_ROW' - ? Container( - width: double.infinity, - margin: EdgeInsets.only( - top: 20, - left: 26, - right: 26, - ), - padding: EdgeInsets.only(left: 14, right: 14, top: 15, bottom: 15), - // height: 400, - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 5, - blurRadius: 26, - offset: Offset(0, 3), - ), - ], - color: Colors.white, - borderRadius: BorderRadius.circular(10.0), - ), - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - PopupMenuButton( - child: DynamicTextFieldWidget( - "Please Select *", - e.pHONETYPEMEANING ?? "", - isEnable: false, - isPopup: true, - ).paddingOnly(bottom: 12), - itemBuilder: (_) => >[ - for (int i = 0; i < getPhoneNumberTypesList.length; i++) PopupMenuItem(child: Text(getPhoneNumberTypesList![i].mEANING!), value: i), - ], - onSelected: (int index) { - e.pHONETYPEMEANING = getPhoneNumberTypesList[index].mEANING; - e.pHONETYPE = getPhoneNumberTypesList[index].cODE; - setState(() {}); - }), - DynamicTextFieldWidget( - "", - e.pHONENUMBER ?? "", - isReadOnly: false, - onChange: (text) { - e.pHONENUMBER = text; - }, - ).paddingOnly(bottom: 12), - InkWell( - child: Row(mainAxisAlignment: MainAxisAlignment.end, children: [ - Icon( - Icons.delete, - color: Colors.red, - size: 18, - ), - Text( - 'Delete', - style: TextStyle(color: Colors.red, fontWeight: FontWeight.bold), - ) - ]), - onTap: () { - // widget.getEmployeePhonesList.removeWhere((item) => item.pHONEID == e.pHONEID); - setState(() { - deleteRow(e); - }); - }, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: widget.getEmployeePhonesList + .map((e) => e.aCTION != 'DELETE_ROW' + ? Container( + width: double.infinity, + margin: EdgeInsets.only( + top: 20, + left: 26, + right: 26, ), - SizedBox( - height: 10, + padding: EdgeInsets.only(left: 14, right: 14, top: 15, bottom: 15), + // height: 400, + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 5, + blurRadius: 26, + offset: Offset(0, 3), + ), + ], + color: Colors.white, + borderRadius: BorderRadius.circular(10.0), ), - ])) - : Container()) - .toList()), - SizedBox( - height: 80, - ) - ]))); + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + PopupMenuButton( + child: DynamicTextFieldWidget( + "Please Select *", + e.pHONETYPEMEANING ?? "", + isEnable: false, + isPopup: true, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < getPhoneNumberTypesList.length; i++) PopupMenuItem(child: Text(getPhoneNumberTypesList![i].mEANING!), value: i), + ], + onSelected: (int index) { + e.pHONETYPEMEANING = getPhoneNumberTypesList[index].mEANING; + e.pHONETYPE = getPhoneNumberTypesList[index].cODE; + setState(() {}); + }), + DynamicTextFieldWidget( + "", + e.pHONENUMBER ?? "", + isReadOnly: false, + onChange: (text) { + e.pHONENUMBER = text; + }, + ).paddingOnly(bottom: 12), + InkWell( + child: Row(mainAxisAlignment: MainAxisAlignment.end, children: [ + Icon( + Icons.delete, + color: Colors.red, + size: 18, + ), + Text( + 'Delete', + style: TextStyle(color: Colors.red, fontWeight: FontWeight.bold), + ) + ]), + onTap: () { + // widget.getEmployeePhonesList.removeWhere((item) => item.pHONEID == e.pHONEID); + setState(() { + deleteRow(e); + }); + }, + ), + SizedBox( + height: 10, + ), + ])) + : Container()) + .toList()), + SizedBox( + height: 80, + ) + ], + ), + ), + ); } - footer() { + Widget footer() { return Container( decoration: BoxDecoration( // borderRadius: BorderRadius.circular(10), diff --git a/lib/ui/profile/profile.dart b/lib/ui/profile/profile.dart index 6cbf953..22d062b 100644 --- a/lib/ui/profile/profile.dart +++ b/lib/ui/profile/profile.dart @@ -1,13 +1,10 @@ -import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; -import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; -import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; class Profile extends StatefulWidget { const Profile({Key? key}) : super(key: key); @@ -16,6 +13,7 @@ class Profile extends StatefulWidget { _ProfileState createState() => _ProfileState(); } +// todo '@fatima' use extension methods for widgets,7 dont use hard code strings, make it localize class _ProfileState extends State { String? fullName = ""; String? maritalStatus = ""; @@ -39,8 +37,6 @@ class _ProfileState extends State { getEmployeeBasicDetailsList = await ProfileApiClient().getEmployeeBasicDetails(); Utils.hideLoading(context); basicDetails(); - print("getEmployeeBasicDetailsList.length"); - print(getEmployeeBasicDetailsList.length); setState(() {}); } catch (ex) { Utils.hideLoading(context); @@ -48,7 +44,7 @@ class _ProfileState extends State { } } - basicDetails() { + void basicDetails() { for (int i = 0; i < getEmployeeBasicDetailsList.length; i++) { if (getEmployeeBasicDetailsList[i].aPPLICATIONCOLUMNNAME == 'FULL_NAME') { fullName = getEmployeeBasicDetailsList[i].sEGMENTVALUEDSP; @@ -116,8 +112,7 @@ class _ProfileState extends State { ], ), ), - ) - ), + )), ), Container( width: double.infinity, @@ -129,9 +124,9 @@ class _ProfileState extends State { ), child: Column( children: [ - "${fullName}".toText20(isBold: true, color: MyColors.blackColor), - "${employeeNo}".toText12(isBold: false, color: MyColors.lightGrayColor), - "${emailAddress}".toText12(isBold: false, color: MyColors.black), + "$fullName".toText20(isBold: true, color: MyColors.blackColor), + "$employeeNo".toText12(isBold: false, color: MyColors.lightGrayColor), + "$emailAddress".toText12(isBold: false, color: MyColors.black), SizedBox( height: 5, ), @@ -142,19 +137,15 @@ class _ProfileState extends State { indent: 0, endIndent: 0, ), - Container( padding: EdgeInsets.only(left: 10.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ InkWell( - onTap: () { - - }, + onTap: () {}, child: Row( children: [ - SizedBox( width: 15, ), @@ -166,12 +157,9 @@ class _ProfileState extends State { height: 5, ), InkWell( - onTap: () { - - }, + onTap: () {}, child: Row( children: [ - SizedBox( width: 15, ), @@ -183,12 +171,9 @@ class _ProfileState extends State { height: 5, ), InkWell( - onTap: () { - - }, + onTap: () {}, child: Row( children: [ - SizedBox( width: 20, ), @@ -200,12 +185,9 @@ class _ProfileState extends State { height: 5, ), InkWell( - onTap: () { - - }, + onTap: () {}, child: Row( children: [ - SizedBox( width: 20, ), @@ -220,7 +202,7 @@ class _ProfileState extends State { ), ), ], - ).paddingOnly( top: 35, bottom: 36), + ).paddingOnly(top: 35, bottom: 36), ), Align( alignment: Alignment.topCenter, diff --git a/lib/ui/screens/announcements/announcement_details.dart b/lib/ui/screens/announcements/announcement_details.dart new file mode 100644 index 0000000..6909be5 --- /dev/null +++ b/lib/ui/screens/announcements/announcement_details.dart @@ -0,0 +1,106 @@ +import 'dart:convert'; + +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/models/get_announcement_details.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; + +class AnnouncementDetails extends StatefulWidget { + const AnnouncementDetails({Key? key}) : super(key: key); + + @override + _AnnouncementDetailsState createState() => _AnnouncementDetailsState(); +} + +class _AnnouncementDetailsState extends State { + String jsonResponse = ""; + int currentPageNo = 0; + int rowID = 0; + + GetAnnouncementDetails? getAnnouncementDetailsObj; + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + getRequestID(); + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Announcements", + ), + body: SingleChildScrollView( + child: Container( + width: double.infinity, + padding: const EdgeInsets.all(10.0), + margin: const EdgeInsets.all(12.0), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + width: double.infinity, + height: 150.0, + child: ClipRRect( + borderRadius: BorderRadius.circular(10), + child: Image.memory( + base64Decode(Utils.getBase64FromJpeg(getAnnouncementDetailsObj?.bannerImage)), + fit: BoxFit.cover, + ), + ), + ), + Container( + margin: const EdgeInsets.only(top: 12.0), + child: Html( + data: getAnnouncementDetailsObj?.bodyEN, + ), + ), + ], + ), + ), + ), + ); + } + + void getRequestID() { + if (currentPageNo == 0) { + final arguments = (ModalRoute.of(context)?.settings.arguments ?? {}) as Map; + currentPageNo = arguments["currentPageNo"]; + rowID = arguments["rowID"]; + getAnnouncementDetails(0, rowID); + } + } + + void getAnnouncementDetails(int itgAwarenessID, int itgRowID) async { + try { + Utils.showLoading(context); + jsonResponse = await PendingTransactionsApiClient().getAnnouncements(itgAwarenessID, currentPageNo, itgRowID); + // todo '@haroon' move below post processing code to above method and get exact model which you need, + + var jsonDecodedData = jsonDecode(jsonDecode(jsonResponse)['result']['data']); + getAnnouncementDetailsObj = GetAnnouncementDetails.fromJson(jsonDecodedData[0]); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } +} diff --git a/lib/ui/screens/announcements/announcements.dart b/lib/ui/screens/announcements/announcements.dart new file mode 100644 index 0000000..cad3a9a --- /dev/null +++ b/lib/ui/screens/announcements/announcements.dart @@ -0,0 +1,168 @@ +import 'dart:convert'; + +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'; +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/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'; + +class Announcements extends StatefulWidget { + const Announcements({Key? key}) : super(key: key); + + @override + _AnnouncementsState createState() => _AnnouncementsState(); +} + +class _AnnouncementsState extends State { + String jsonResponse = ""; + int currentPageNo = 1; + int currentOpenIndex = -1; + + List getAnnouncementsObject = []; + List _foundAnnouncements = []; + TextEditingController searchController = TextEditingController(); + + @override + void initState() { + getAnnouncements(0, 0); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Announcements", + ), + body: getAnnouncementsObject.isNotEmpty + ? Container( + margin: const EdgeInsets.only(top: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + 12.height, + Container( + margin: const EdgeInsets.fromLTRB(12.0, 0.0, 12.0, 0.0), + child: DynamicTextFieldWidget( + "Search", + "Search Announcements", + isEnable: true, + suffixIconData: Icons.search, + isPopup: false, + lines: 1, + isInputTypeNum: false, + isReadOnly: false, + onChange: (String value) { + _runFilter(value); + }, + ), + ), + 12.height, + Expanded( + child: ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return InkWell( + onTap: () { + openAnnouncementsDetails(int.parse(_foundAnnouncements[index].rowID!)); + }, + child: Container( + width: double.infinity, + padding: const EdgeInsets.all(10.0), + margin: const EdgeInsets.only(left: 12, right: 12, top: 10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + width: 80.0, + height: 80.0, + child: ClipRRect( + borderRadius: BorderRadius.circular(10), + child: Image.memory( + base64Decode(Utils.getBase64FromJpeg(_foundAnnouncements[index].bannerImage)), + fit: BoxFit.cover, + ), + ), + ), + 12.width, + SizedBox( + height: 80.0, + width: 200.0, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppState().isArabic(context) ? _foundAnnouncements[index].titleAR!.toText13() : getAnnouncementsObject[index].titleEN!.toText13(), + 8.height, + _foundAnnouncements[index].created!.toText10(color: MyColors.grey98Color) + ], + ), + ), + ], + ), + ), + ); + }, + separatorBuilder: (BuildContext context, int index) => 1.height, + itemCount: _foundAnnouncements.length ?? 0)) + ], + ), + ) + : Utils.getNoDataWidget(context), + ); + } + + void _runFilter(String enteredKeyword) { + List results = []; + if (enteredKeyword.isEmpty) { + results = getAnnouncementsObject; + } else { + results = getAnnouncementsObject.where((user) => user.titleEN!.toLowerCase().contains(enteredKeyword.toLowerCase())).toList(); + } + setState(() { + _foundAnnouncements = results; + }); + } + + void getAnnouncements(int itgAwarenessID, int itgRowID) async { + try { + Utils.showLoading(context); + jsonResponse = await PendingTransactionsApiClient().getAnnouncements(itgAwarenessID, currentPageNo, itgRowID); + var jsonDecodedData = jsonDecode(jsonDecode(jsonResponse)['result']['data']); + for (int i = 0; i < jsonDecodedData.length; i++) { + getAnnouncementsObject.add(GetAnnouncementsObject.fromJson(jsonDecodedData[i])); + } + _foundAnnouncements = getAnnouncementsObject; + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void openAnnouncementsDetails(int rowID) async { + await Navigator.pushNamed(context, AppRoutes.announcementsDetails, arguments: {"currentPageNo": currentPageNo, "rowID": rowID}); + } +} diff --git a/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart b/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart new file mode 100644 index 0000000..f3ae4f8 --- /dev/null +++ b/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart @@ -0,0 +1,144 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.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/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/mowadhafhi/get_tickets_list.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; + +class MowadhafhiHome extends StatefulWidget { + const MowadhafhiHome({Key? key}) : super(key: key); + + @override + _MowadhafhiHomeState createState() => _MowadhafhiHomeState(); +} + +class _MowadhafhiHomeState extends State { + List getTicketsByEmployeeList = []; + + @override + void initState() { + getOpenTickets(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Mowadhafhi Request", + ), + body: Container( + margin: const EdgeInsets.only(top: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Expanded( + child: ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return InkWell( + onTap: () { + openRequestDetails(getTicketsByEmployeeList[index].ticketId!); + }, + child: Container( + width: double.infinity, + // height: 100.0, + padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + margin: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + getTicketsByEmployeeList[index].ticketTypeName!.toText14(color: MyColors.grey57Color), + getTicketsByEmployeeList[index].created!.split(" ")[0].toText12(color: MyColors.grey70Color), + ], + ), + Container( + padding: const EdgeInsets.only(top: 10.0), + child: getTicketsByEmployeeList[index].description!.toText12(color: MyColors.grey57Color), + ), + Container( + padding: const EdgeInsets.only(top: 10.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + getTicketsByEmployeeList[index].ticketStatusInternalName!.toText14(color: MyColors.gradiantEndColor), + SvgPicture.asset( + "assets/images/arrow_next.svg", + color: MyColors.darkIconColor, + ) + ], + ), + ), + ], + ), + ), + ); + }, + separatorBuilder: (BuildContext context, int index) => 12.height, + itemCount: getTicketsByEmployeeList.length ?? 0)), + 80.height + ], + ), + ), + bottomSheet: Container( + decoration: const BoxDecoration( + color: MyColors.white, + boxShadow: [ + BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), + ], + ), + child: DefaultButton(LocaleKeys.createRequest.tr(), () async { + openHRRequest(); + }).insideContainer, + )); + } + + void openRequestDetails(String itgTicketID) async { + await Navigator.pushNamed(context, AppRoutes.mowadhafhiDetails, arguments: itgTicketID); + } + + void openHRRequest() async { + await Navigator.pushNamed(context, AppRoutes.mowadhafhiHRRequest).then((value) { + getOpenTickets(); + }); + } + + void getOpenTickets() async { + try { + Utils.showLoading(context); + getTicketsByEmployeeList.clear(); + getTicketsByEmployeeList = await MowadhafhiApiClient().getTicketsByEmployee(); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } +} diff --git a/lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart b/lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart new file mode 100644 index 0000000..4ee819d --- /dev/null +++ b/lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart @@ -0,0 +1,386 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:file_picker/file_picker.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/extensions/widget_extensions.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'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_section_topics.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_types.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/mowadhafhi_attachement_request.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/button/simple_button.dart'; +import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; +import 'package:mohem_flutter_app/widgets/radio/show_radio.dart'; + +class MowadhafhiHRRequest extends StatefulWidget { + const MowadhafhiHRRequest({Key? key}) : super(key: key); + + @override + _MowadhafhiHRRequestState createState() => _MowadhafhiHRRequestState(); +} + +class _MowadhafhiHRRequestState extends State { + List getTicketTypesList = []; + List getMowadhafhiProjectsList = []; + List getProjectDepartmentsList = []; + List getDepartmentSectionsList = []; + List getSectionTopicsList = []; + + GetProjectDepartments? selectedDepartment; + GetDepartmentSections? selectedSection; + GetSectionTopics? selectedTopic; + List attachmentFiles = []; + + String selectedServiceType = ""; + String description = ""; + int? projectID; + + @override + void initState() { + getTicketTypes(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Mowadhafhi Request", + ), + body: SingleChildScrollView( + child: getTicketTypesList.isNotEmpty + ? Container( + width: double.infinity, + padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + margin: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Service Type: ".toText16(), + 12.height, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + height: 40, + child: ListView.separated( + itemBuilder: (context, index) { + return Container( + padding: const EdgeInsets.only(right: 6, top: 8, bottom: 8), + child: ShowRadio( + title: getTicketTypesList[index].typeName!, + value: getTicketTypesList[index].ticketTypeId!.toString(), + groupValue: selectedServiceType, + selectedColor: MyColors.gradiantStartColor), + ).onPress(() { + selectedServiceType = getTicketTypesList[index].ticketTypeId!.toString(); + setState(() {}); + }); + }, + separatorBuilder: (context, index) => 1.width, + shrinkWrap: true, + itemCount: getTicketTypesList.length ?? 0, + scrollDirection: Axis.horizontal, + ), + ), + ], + ), + 12.height, + "Department Name: ".toText16(), + 12.height, + PopupMenuButton( + child: DynamicTextFieldWidget( + "Select Department", + selectedDepartment?.departmentName ?? "", + isEnable: false, + isPopup: true, + isInputTypeNum: true, + isReadOnly: false, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < getProjectDepartmentsList!.length; i++) PopupMenuItem(child: Text(getProjectDepartmentsList![i].departmentName!), value: i), + ], + onSelected: (int popupIndex) { + selectedDepartment = getProjectDepartmentsList![popupIndex]; + getDepartmentSections(selectedDepartment?.projectDepartmentId); + setState(() {}); + }), + 12.height, + "Related Section: ".toText16(), + 12.height, + PopupMenuButton( + child: DynamicTextFieldWidget( + "Select Section", + selectedSection?.sectionName ?? "", + isEnable: false, + isPopup: true, + isInputTypeNum: true, + isReadOnly: false, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < getDepartmentSectionsList!.length; i++) PopupMenuItem(child: Text(getDepartmentSectionsList![i].sectionName!), value: i), + ], + onSelected: (int popupIndex) { + selectedSection = getDepartmentSectionsList![popupIndex]; + getSectionTopics(selectedSection?.departmentSectionId); + setState(() {}); + }), + 12.height, + "Related Topic: ".toText16(), + 12.height, + PopupMenuButton( + child: DynamicTextFieldWidget( + "Select Topic", + selectedTopic?.topicName ?? "", + isEnable: false, + isPopup: true, + isInputTypeNum: true, + isReadOnly: false, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < getSectionTopicsList!.length; i++) PopupMenuItem(child: Text(getSectionTopicsList![i].topicName!), value: i), + ], + onSelected: (int popupIndex) { + selectedTopic = getSectionTopicsList![popupIndex]; + // getDepartmentSections(selectedSection?.departmentSectionId); + setState(() {}); + }), + 12.height, + "Supporting Document: ".toText16(), + 12.height, + attachmentView("Attachments"), + 12.height, + "Description: ".toText16(), + 12.height, + DynamicTextFieldWidget( + "", + "", + isEnable: true, + isPopup: false, + lines: 4, + isInputTypeNum: false, + isReadOnly: false, + onChange: (String value) { + debugPrint(value); + description = value; + }, + ), + 50.height + ], + ), + ) + : Container(), + ), + bottomSheet: Container( + padding: const EdgeInsets.only(top: 8.0, bottom: 8.0), + decoration: const BoxDecoration( + color: MyColors.white, + ), + child: Row( + children: [ + 12.width, + Expanded( + child: DefaultButton( + "Submit", + !checkValidation() + ? null + : () { + submitHRRequest(); + }, + color: const Color(0xFFD02127), + ), + ), + 12.width, + ], + ), + ), + ); + } + + bool checkValidation() { + if (selectedServiceType == "" || selectedDepartment == null || selectedSection == null || selectedTopic == null) { + return false; + } else { + return true; + } + } + + Widget attachmentView(String title) { + return Container( + padding: const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + title.toText16().expanded, + 6.width, + SimpleButton("Add", () async { + FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true); + if (result != null) { + attachmentFiles = attachmentFiles + result.paths.map((path) => File(path!)).toList(); + attachmentFiles = attachmentFiles.toSet().toList(); + setState(() {}); + } + }, fontSize: 14), + ], + ), + if (attachmentFiles.isNotEmpty) 12.height, + if (attachmentFiles.isNotEmpty) + ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (cxt, index) { + String fileName = attachmentFiles[index].path.split('/').last; + + return Row( + children: [ + fileName.toText13().expanded, + 6.width, + IconButton( + padding: EdgeInsets.zero, + iconSize: 20, + icon: const Icon(Icons.cancel_rounded), + color: MyColors.redColor, + constraints: const BoxConstraints(), + onPressed: () async { + attachmentFiles.removeAt(index); + setState(() {}); + }, + ) + ], + ); + }, + separatorBuilder: (cxt, index) => 6.height, + itemCount: attachmentFiles.length), + ], + ), + ); + } + + void getTicketTypes() async { + try { + Utils.showLoading(context); + getTicketTypesList = await MowadhafhiApiClient().getTicketTypes(); + Utils.hideLoading(context); + getMowadhafhiProjects(); + // setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void getMowadhafhiProjects() async { + try { + Utils.showLoading(context); + getMowadhafhiProjectsList = await MowadhafhiApiClient().getProjects(); + Utils.hideLoading(context); + getProjectDepartments(getMowadhafhiProjectsList[0].projectId!); + projectID = getMowadhafhiProjectsList[0].projectId; + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void getProjectDepartments(int projectID) async { + try { + Utils.showLoading(context); + getProjectDepartmentsList = await MowadhafhiApiClient().getProjectDepartments(projectID); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void getDepartmentSections(int? projectDepartmentID) async { + try { + Utils.showLoading(context); + getDepartmentSectionsList = await MowadhafhiApiClient().getDepartmentSections(projectDepartmentID); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void getSectionTopics(int? departmentSectionID) async { + try { + Utils.showLoading(context); + getSectionTopicsList = await MowadhafhiApiClient().getSectionTopics(departmentSectionID); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void submitHRRequest() async { + try { + Utils.showLoading(context); + List> list = []; + if (attachmentFiles.isNotEmpty) { + for (int i = 0; i < attachmentFiles.length; i++) { + String type = attachmentFiles[i].path.split('.').last; + String name = attachmentFiles[i].path.split('/').last; + List fileContent = await attachmentFiles[i].readAsBytes(); + String encodedFile = base64Encode(fileContent); + list.add(MowadhafhiRequestAttachment( + contentType: "image/" + type, + fileName: name, + base64Data: encodedFile, + ).toJson()); + } + } + int? messageStatus = await MowadhafhiApiClient().submitRequest(selectedDepartment?.projectDepartmentId, description, projectID, selectedSection?.departmentSectionId.toString(), + selectedTopic?.sectionTopicId.toString(), int.parse(selectedServiceType), list); + Utils.showToast("Request created successfully"); + Utils.hideLoading(context); + Navigator.pop(context); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } +} diff --git a/lib/ui/screens/mowadhafhi/request_details.dart b/lib/ui/screens/mowadhafhi/request_details.dart new file mode 100644 index 0000000..9426929 --- /dev/null +++ b/lib/ui/screens/mowadhafhi/request_details.dart @@ -0,0 +1,213 @@ +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/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'; + +class MowadhafhiRequestDetails extends StatefulWidget { + const MowadhafhiRequestDetails({Key? key}) : super(key: key); + + @override + _RequestDetailsState createState() => _RequestDetailsState(); +} + +class _RequestDetailsState extends State { + String? itgTicketID; + List getTicketsByEmployeeList = []; + List getTicketTransactionsList = []; + + @override + void initState() { + // TODO: implement initState + super.initState(); + } + + void getRequestID() { + if (itgTicketID == null) { + itgTicketID = ModalRoute.of(context)?.settings.arguments as String; + debugPrint(itgTicketID); + getTicketDetails(); + } + } + + @override + Widget build(BuildContext context) { + getRequestID(); + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Mowadhafhi Request", + ), + body: SingleChildScrollView( + child: getTicketsByEmployeeList.length != 0 + ? Column( + children: [ + Container( + width: double.infinity, + padding: const EdgeInsets.only(left: 12, right: 12, top: 12, bottom: 12), + margin: const EdgeInsets.only(left: 12, right: 12, top: 12, bottom: 12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + getTicketsByEmployeeList![0].ticketStatusName!.toText14(color: MyColors.gradiantEndColor), + getTicketsByEmployeeList![0].created!.split(" ")[0].toText12(color: MyColors.grey70Color), + ], + ), + 8.height, + "Ticket Reference: ".toText12(color: MyColors.grey98Color), + getTicketsByEmployeeList![0].ticketReferenceNo!.toText14(color: MyColors.grey57Color), + 8.height, + "Section: ".toText12(color: MyColors.grey98Color), + getTicketsByEmployeeList![0].sectionName!.toText14(color: MyColors.grey57Color), + 8.height, + "Topic: ".toText12(color: MyColors.grey98Color), + getTicketsByEmployeeList![0].topicName!.toText14(color: MyColors.grey57Color), + 8.height, + "Description: ".toText12(color: MyColors.grey98Color), + getTicketsByEmployeeList![0].description!.toText14(color: MyColors.grey57Color), + ], + ), + ), + Container( + width: double.infinity, + padding: const EdgeInsets.only(left: 12, right: 12, top: 12, bottom: 12), + margin: const EdgeInsets.only(left: 12, right: 12, top: 12, bottom: 12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ListView.builder( + shrinkWrap: true, + physics: const ScrollPhysics(), + itemBuilder: (BuildContext context, int index) { + return Stack( + children: [ + Padding( + padding: const EdgeInsets.only(left: 50.0), + child: Card( + elevation: 0.0, + margin: const EdgeInsets.fromLTRB(0.0, 20.0, 20.0, 10.0), + child: Container( + padding: const EdgeInsets.all(12.0), + width: double.infinity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + "Action By: ".toText14(color: MyColors.grey57Color), + getTicketTransactionsList![index].actionBy!.toText14(color: MyColors.grey57Color), + ], + ), + getTicketTransactionsList![index].comments!.toText14(color: MyColors.grey98Color), + 12.height, + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + getTicketTransactionsList![0].actionDate!.split(" ")[0].toText12(color: MyColors.grey70Color), + ], + ), + ], + ), + ), + ), + ), + Positioned( + top: 0.0, + bottom: 0.0, + left: 28.0, + child: Container( + height: double.infinity, + width: 3.0, + color: MyColors.lightTextColor.withOpacity(0.5), + ), + ), + Positioned( + top: 0.0, + left: 15.0, + child: Container( + height: 30.0, + width: 30.0, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors.white, + ), + child: Container( + margin: const EdgeInsets.all(5.0), + height: 30.0, + width: 30.0, + decoration: const BoxDecoration(shape: BoxShape.circle, color: MyColors.gradiantEndColor), + ), + ), + ) + ], + ); + }, + itemCount: getTicketTransactionsList.length ?? 0, + ) + ], + ), + ), + ], + ) + : Container(), + ), + ); + } + + void getTicketDetails() async { + try { + Utils.showLoading(context); + getTicketsByEmployeeList = await MowadhafhiApiClient().getTicketDetailsByEmployee(itgTicketID); + Utils.hideLoading(context); + setState(() {}); + getTicketTransactions(); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void getTicketTransactions() async { + try { + Utils.showLoading(context); + getTicketTransactionsList = await MowadhafhiApiClient().getTicketTransactions(itgTicketID); + debugPrint(getTicketTransactionsList![0].actionDate); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } +} diff --git a/lib/ui/screens/pending_transactions/pending_transactions.dart b/lib/ui/screens/pending_transactions/pending_transactions.dart new file mode 100644 index 0000000..98d7fe3 --- /dev/null +++ b/lib/ui/screens/pending_transactions/pending_transactions.dart @@ -0,0 +1,182 @@ +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/pending_transactions_api_client.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/date_uitl.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/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/pending_transactions/get_req_functions.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 PendingTransactions extends StatefulWidget { + const PendingTransactions({Key? key}) : super(key: key); + + @override + _PendingTransactionsState createState() => _PendingTransactionsState(); +} + +class _PendingTransactionsState extends State { + List getPendingTransactionsFunctions = []; + GetPendingTransactionsFunctions? selectedFunction; + + DateTime selectedDateFrom = DateTime.now(); + DateTime selectedDateTo = DateTime.now(); + + @override + void initState() { + getRequestTypes(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Pending Transactions", + ), + body: SingleChildScrollView( + child: Container( + width: double.infinity, + padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + margin: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + children: [ + 12.height, + PopupMenuButton( + child: DynamicTextFieldWidget( + "Please select request type", + selectedFunction?.fUNCTIONPROMPT ?? "", + isEnable: false, + isPopup: true, + isInputTypeNum: true, + isReadOnly: false, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < getPendingTransactionsFunctions!.length; i++) PopupMenuItem(child: Text(getPendingTransactionsFunctions![i].fUNCTIONPROMPT!), value: i), + ], + onSelected: (int popupIndex) { + selectedFunction = getPendingTransactionsFunctions[popupIndex]; + setState(() {}); + }), + 12.height, + DynamicTextFieldWidget( + "Date From: ", + selectedDateFrom.toString().split(" ")[0], + suffixIconData: Icons.calendar_today, + isEnable: false, + onTap: () async { + selectedDateFrom = await _selectDate(context, DateTime.now()); + setState(() {}); + }, + ).paddingOnly(bottom: 12), + 12.height, + DynamicTextFieldWidget( + "Date To: ", + selectedDateTo.toString().split(" ")[0], + suffixIconData: Icons.calendar_today, + isEnable: false, + onTap: () async { + selectedDateTo = await _selectDate(context, DateTime.now()); + setState(() {}); + }, + ).paddingOnly(bottom: 12), + ], + ), + ), + ), + bottomSheet: Container( + decoration: const BoxDecoration( + color: MyColors.white, + boxShadow: [ + BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), + ], + ), + child: DefaultButton( + LocaleKeys.submit.tr(), + selectedFunction == null + ? null + : () async { + openRequestDetails(); + }) + .insideContainer, + )); + } + + Future _selectDate(BuildContext context, DateTime selectedDate) async { + DateTime time = selectedDate; + if (!Platform.isIOS) { + await showCupertinoModalPopup( + context: context, + builder: (cxt) => Container( + height: 250, + color: Colors.white, + child: CupertinoDatePicker( + backgroundColor: Colors.white, + mode: CupertinoDatePickerMode.date, + onDateTimeChanged: (value) { + if (value != null && value != selectedDate) { + time = value; + } + }, + initialDateTime: selectedDate, + ), + ), + ); + } else { + final DateTime? picked = + await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101)); + if (picked != null && picked != selectedDate) { + time = picked; + } + } + return time; + } + + void getRequestTypes() async { + try { + Utils.showLoading(context); + getPendingTransactionsFunctions = await PendingTransactionsApiClient().getPendingReqFunctions(); + Utils.hideLoading(context); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void openRequestDetails() async { + await Navigator.pushNamed(context, AppRoutes.pendingTransactionsDetails, + arguments: {"selectedFunctionID": selectedFunction?.fUNCTIONID, "dateFrom": DateUtil.convertDateToString(selectedDateFrom), "dateTo": DateUtil.convertDateToString(selectedDateTo)}); + } + + void getPendingReqDetails() async { + try { + Utils.showLoading(context); + getPendingTransactionsFunctions = await PendingTransactionsApiClient().getPendingReqFunctions(); + Utils.hideLoading(context); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } +} diff --git a/lib/ui/screens/pending_transactions/pending_transactions_details.dart b/lib/ui/screens/pending_transactions/pending_transactions_details.dart new file mode 100644 index 0000000..1877c5b --- /dev/null +++ b/lib/ui/screens/pending_transactions/pending_transactions_details.dart @@ -0,0 +1,137 @@ +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/models/pending_transactions/get_pending_transactions_details.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; + +class PendingTransactionsDetails extends StatefulWidget { + const PendingTransactionsDetails({Key? key}) : super(key: key); + + @override + _PendingTransactionsDetailsState createState() => _PendingTransactionsDetailsState(); +} + +class _PendingTransactionsDetailsState extends State { + String functionID = ""; + String dateFrom = ""; + String dateTo = ""; + + List getPendingTransactionsDetails = []; + + @override + void initState() { + super.initState(); + } + + void getFunctionID() { + if (functionID == "") { + final arguments = (ModalRoute.of(context)?.settings.arguments ?? {}) as Map; + functionID = arguments["selectedFunctionID"].toString(); + dateFrom = arguments["dateFrom"]; + dateTo = arguments["dateTo"]; + getTicketTransactions(); + } + } + + @override + Widget build(BuildContext context) { + getFunctionID(); + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Pending Transactions", + ), + body: getPendingTransactionsDetails.isNotEmpty + ? Container( + margin: const EdgeInsets.only(top: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Expanded( + child: ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return Container( + width: double.infinity, + padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + margin: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + "Created For ".toText14(color: MyColors.grey57Color), + getPendingTransactionsDetails[index].tRANSACTIONCREATEDFOR!.toText14(color: MyColors.grey57Color), + ], + ), + Column( + children: [ + getPendingTransactionsDetails[index].cREATIONDATE!.split(" ")[0].toText12(color: MyColors.grey70Color), + getPendingTransactionsDetails[index].cREATIONDATE!.split(" ")[1].toText12(color: MyColors.grey70Color), + ], + ), + ], + ), + Container( + child: Row( + children: [ + "Request Name: ".toText14(color: MyColors.grey57Color), + getPendingTransactionsDetails[index].uSERFUNCTIONNAME!.toText12(color: MyColors.grey57Color), + ], + ), + ), + Container( + padding: const EdgeInsets.only(top: 0.0), + child: Row( + children: [ + "Request Type: ".toText14(color: MyColors.grey57Color), + getPendingTransactionsDetails[index].rEQUESTTYPE!.toText14(color: MyColors.redColor), + ], + ), + ), + ], + ), + ); + }, + separatorBuilder: (BuildContext context, int index) => 12.height, + itemCount: getPendingTransactionsDetails.length ?? 0)) + ], + ), + ) + : Utils.getNoDataWidget(context), + ); + } + + void getTicketTransactions() async { + try { + Utils.showLoading(context); + getPendingTransactionsDetails = await PendingTransactionsApiClient().getPendingTransactionsDetails(functionID, dateFrom, dateTo); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } +} diff --git a/lib/ui/screens/profile/profile_screen.dart b/lib/ui/screens/profile/profile_screen.dart index bf16fc6..b421923 100644 --- a/lib/ui/screens/profile/profile_screen.dart +++ b/lib/ui/screens/profile/profile_screen.dart @@ -1,5 +1,6 @@ -import 'dart:ui'; import 'dart:convert'; +import 'dart:ui'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; @@ -12,6 +13,7 @@ import 'package:mohem_flutter_app/ui/screens/profile/widgets/header.dart'; import 'package:mohem_flutter_app/ui/screens/profile/widgets/profile_panel.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; +// todo '@sultan' kindly follow structure of code written. use extension methods for widgets and dont hard code strings, use localizations class ProfileScreen extends StatefulWidget { const ProfileScreen({Key? key}) : super(key: key); @@ -99,7 +101,7 @@ class _ProfileScreenState extends State { ])); } - startImageSheet() { + void startImageSheet() { showMyBottomSheet(context, child: Column( children: [ diff --git a/lib/ui/screens/profile/widgets/profile_info.dart b/lib/ui/screens/profile/widgets/profile_info.dart index 4cb338b..0bef6e9 100644 --- a/lib/ui/screens/profile/widgets/profile_info.dart +++ b/lib/ui/screens/profile/widgets/profile_info.dart @@ -9,6 +9,8 @@ import 'package:mohem_flutter_app/models/profile_menu.model.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; +// todo '@sultan' kindly follow structure of code written. use extension methods for widgets, also format code + class ProfileInFo extends StatelessWidget { ProfileInFo(this.memberInfo); diff --git a/lib/ui/screens/tangheem_detail_screen.dart b/lib/ui/screens/tangheem_detail_screen.dart deleted file mode 100644 index 0f4ea7b..0000000 --- a/lib/ui/screens/tangheem_detail_screen.dart +++ /dev/null @@ -1,819 +0,0 @@ -// import 'package:flutter/cupertino.dart'; -// import 'package:flutter/material.dart'; -// import 'package:flutter_html/flutter_html.dart'; -// import 'package:flutter_svg/flutter_svg.dart'; -// import 'package:shared_preferences/shared_preferences.dart'; -// import 'package:tangheem/api/admin_configuration_api_client.dart'; -// import 'package:tangheem/api/tangheem_user_api_client.dart'; -// import 'package:tangheem/app_state/app_state.dart'; -// import 'package:tangheem/classes/colors.dart'; -// import 'package:tangheem/classes/consts.dart'; -// import 'package:tangheem/classes/utils.dart'; -// import 'package:tangheem/extensions/string_extensions.dart'; -// import 'package:tangheem/models/aya_tangheem_type_mapped.dart'; -// import 'package:tangheem/models/discussion_model.dart'; -// import 'package:tangheem/ui/dialogs/discussion_input_dialog.dart'; -// import 'package:tangheem/widgets/aya_player_widget.dart'; -// import 'package:tangheem/widgets/aya_record_widget.dart'; -// import 'package:tangheem/widgets/text_highlight_widget.dart'; -// -// import 'login_screen.dart'; -// -// class TangheemDetailParams { -// final String selectedTangheemTypeId; -// final List ayatTangheemTypeMappedDataList; -// -// TangheemDetailParams({@required this.selectedTangheemTypeId, @required this.ayatTangheemTypeMappedDataList}); -// } -// -// class TangheemDetailScreen extends StatefulWidget { -// static const String routeName = "/tangheem_detail"; -// final TangheemDetailParams tangheemDetailParams; -// -// TangheemDetailScreen({Key key, this.tangheemDetailParams}) : super(key: key); -// -// @override -// _TangheemDetailScreenState createState() { -// return _TangheemDetailScreenState(); -// } -// } -// -// class _TangheemDetailScreenState extends State { -// GlobalKey _globalKey = GlobalKey(); -// -// List voiceNoteList = []; -// -// List ayatTangheemTypeMappedDataList = []; -// -// List _dataList = []; -// -// int _discussionPage = -1; -// AyatTangheemTypeMappedData _ayatTangheemTypeMappedFirstData; -// DiscussionModel _discussionModel; -// -// bool showAyaPlayer = false; -// -// @override -// void initState() { -// super.initState(); -// ayatTangheemTypeMappedDataList = widget.tangheemDetailParams.ayatTangheemTypeMappedDataList; -// _ayatTangheemTypeMappedFirstData = ayatTangheemTypeMappedDataList.first; -// filterVoiceListData(); -// getPrefs(); -// getTangheemDiscussionAndRelatedData(); -// } -// -// double fontSize = 18; -// -// SharedPreferences prefs; -// -// void getPrefs() async { -// prefs = await SharedPreferences.getInstance(); -// fontSize = (prefs.getInt(GlobalConsts.fontZoomSize) ?? 18) + 0.0; -// setState(() {}); -// } -// -// String getArabicIndexWord(int index) { -// if (index == 0) { -// return 'الأولى'; -// } else if (index == 1) { -// return 'الثانية'; -// } else if (index == 2) { -// return 'الثالثة'; -// } else if (index == 3) { -// return 'الرابعة'; -// } else if (index == 4) { -// return 'الخامسة'; -// } -// return ""; -// } -// -// void getTangheemDiscussionAndRelatedData() async { -// Utils.showLoading(context); -// try { -// _discussionModel = await TangheemUserApiClient().getDiscussionByTangheemID(_discussionPage, widget.tangheemDetailParams.selectedTangheemTypeId); -// if (!_ayatTangheemTypeMappedFirstData.ayatNumberInSurahs.contains(",")) { -// _dataList = await getTangheemRelatedData(); -// } -// Utils.hideLoading(context); -// setState(() {}); -// } catch (ex) { -// print(ex); -// Utils.handleException(ex, context, null); -// Utils.hideLoading(context); -// } -// } -// -// Future> getTangheemRelatedData() async { -// _dataList = []; -// AyatTangheemTypeMapped _ayatTangheemTypeMapped = -// await TangheemUserApiClient().getAyaTangheemTypeMappedRelated(_ayatTangheemTypeMappedFirstData.surahNo, _ayatTangheemTypeMappedFirstData.ayatNumberInSurahs); -// _dataList = _ayatTangheemTypeMapped?.data ?? []; -// if (_dataList.isNotEmpty) { -// _dataList = _dataList.where((element) => element.tangheemTypeId != _ayatTangheemTypeMappedFirstData.tangheemTypeId)?.toList() ?? []; -// var _tempList = _dataList.map((e) => e.tangheemTypeId).toList().toSet().toList(); -// var _dataTempList = []; -// _tempList.forEach((_tempElement) { -// _dataTempList.add(_dataList.firstWhere((element) { -// return !element.ayatNumberInSurahs.contains(",") && (element.tangheemTypeId == _tempElement); -// }, orElse: null)); -// }); -// _dataList = _dataTempList; -// } -// -// return _dataList; -// } -// -// void sendComment(String discussionText) async { -// Utils.showLoading(context); -// try { -// await AdminConfigurationApiClient().addDiscussion(discussionText, _ayatTangheemTypeMappedFirstData.ayaTangheemTypeId); -// Utils.showToast("تم إرسال التعليق ، سيكون مرئيًا بمجرد موافقة المسؤول عليه"); -// Utils.hideLoading(context); -// Navigator.pop(context); -// } catch (ex) { -// Utils.handleException(ex, context, null); -// Utils.hideLoading(context); -// } -// } -// -// void filterVoiceListData() { -// ayatTangheemTypeMappedDataList.forEach((element) { -// voiceNoteList.addAll(element.voiceNote); -// }); -// } -// -// @override -// void dispose() { -// super.dispose(); -// } -// -// @override -// Widget build(BuildContext context) { -// return Container( -// padding: EdgeInsets.fromLTRB(16, 0, 16, 0), -// width: double.infinity, -// child: _ayatTangheemTypeMappedFirstData == null -// ? SizedBox() -// : Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// children: [ -// Expanded( -// child: ListView( -// physics: BouncingScrollPhysics(), -// padding: EdgeInsets.only(bottom: 16, top: 16), -// children: [ -// Text( -// _ayatTangheemTypeMappedFirstData.tangheemTypeName ?? "", -// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20, color: ColorConsts.primaryBlue, height: 1.5), -// ), -// SizedBox(height: 8), -// Text( -// _ayatTangheemTypeMappedFirstData.tangheemTypeDescription ?? "", -// style: TextStyle(fontSize: 14, color: ColorConsts.textGrey, height: 1), -// ), -// SizedBox(height: 8), -// Container( -// margin: EdgeInsets.only(top: 4, bottom: 4), -// padding: EdgeInsets.only(top: 8, bottom: 8, right: 4, left: 4), -// decoration: BoxDecoration( -// color: Colors.white, -// borderRadius: BorderRadius.circular(8), -// ), -// child: SingleChildScrollView( -// physics: NeverScrollableScrollPhysics(), -// child: RepaintBoundary( -// key: _globalKey, -// child: Material( -// color: Colors.white, -// child: ListView.builder( -// physics: NeverScrollableScrollPhysics(), -// shrinkWrap: true, -// itemCount: ayatTangheemTypeMappedDataList.length > 5 ? 5 : ayatTangheemTypeMappedDataList.length, -// itemBuilder: (context, index) { -// var _ayatTangheemTypeMappedData = ayatTangheemTypeMappedDataList[index]; -// List _tangheemInsideTableList = []; -// List _tangheemAboveTableList = []; -// List _tangheemBelowTableList = []; -// List _tangheemWords = []; -// -// List _tempPropertyList = List() + _ayatTangheemTypeMappedData?.property ?? []; -// int firstIndex = _tempPropertyList.indexWhere((element) => element.isInsideTable); -// if (firstIndex >= 0) { -// var _tempPropertyListTop = _tempPropertyList.take(firstIndex); -// _tempPropertyListTop = _tempPropertyListTop.where((element) => (element.propertyValue ?? "").isNotEmpty)?.toList() ?? []; -// _tangheemAboveTableList = _tempPropertyListTop; -// _tempPropertyListTop.forEach((element) { -// _tempPropertyList.remove(element); -// }); -// var _tempPropertyListInside = _tempPropertyList?.where((element) => (element.isInsideTable))?.toList() ?? []; -// _tempPropertyListInside.forEach((element) { -// _tempPropertyList.remove(element); -// }); -// _tempPropertyListInside = _tempPropertyListInside.where((element) => (element.propertyValue ?? "").isNotEmpty)?.toList() ?? []; -// _tangheemInsideTableList = _tempPropertyListInside; -// var _tempPropertyListBelow = _tempPropertyList; -// _tempPropertyListBelow = _tempPropertyListBelow.where((element) => (element.propertyValue ?? "").isNotEmpty)?.toList() ?? []; -// _tangheemBelowTableList = _tempPropertyListBelow; -// } -// -// _tangheemWords.add(_ayatTangheemTypeMappedData.highlightText ?? ""); -// // _tangheemInsideTableList = -// // _ayatTangheemTypeMappedData?.property?.where((element) => (element.isInsideTable) && (element.propertyValue ?? "").isNotEmpty)?.toList() ?? []; -// // _tangheemAboveTableList = -// // _ayatTangheemTypeMappedData?.property?.where((element) => (!element.isInsideTable) && (element.propertyValue ?? "").isNotEmpty)?.toList() ?? []; -// // -// // -// -// var _tempTangheemIndexWord = ""; -// if (ayatTangheemTypeMappedDataList.length == 1) { -// _tempTangheemIndexWord = ""; -// } else { -// _tempTangheemIndexWord = getArabicIndexWord(index) + " "; -// } -// -// return ListView( -// physics: NeverScrollableScrollPhysics(), -// shrinkWrap: true, -// padding: EdgeInsets.all(4), -// children: [ -// Row( -// children: [ -// Text( -// " جملة ${_ayatTangheemTypeMappedData.tangheemTypeName} $_tempTangheemIndexWord", -// style: TextStyle(fontWeight: FontWeight.bold, color: Colors.white, backgroundColor: ColorConsts.primaryBlue), -// ), -// Expanded( -// child: Container(height: 2, color: ColorConsts.primaryBlue), -// ), -// ], -// ), -// SizedBox(height: 8), -// TextHighLightWidget( -// text: _ayatTangheemTypeMappedData.reverseAyatNumber() ?? "", -// valueColor: ColorConsts.primaryBlue, -// highlights: _tangheemWords, -// highLightFontSize: fontSize, -// style: TextStyle( -// fontFamily: "UthmanicHafs", -// fontSize: fontSize, -// fontWeight: FontWeight.bold, -// ), -// ), -// SizedBox(height: 16), -// ListView.separated( -// itemCount: _tangheemAboveTableList.length, -// physics: NeverScrollableScrollPhysics(), -// shrinkWrap: true, -// separatorBuilder: (context, index) { -// return Divider( -// color: Colors.white, -// height: 4, -// thickness: 0, -// ); -// }, -// itemBuilder: (context, index) { -// return Row( -// children: [ -// Expanded( -// child: Container( -// height: 40, -// padding: EdgeInsets.only(left: 4, right: 8), -// alignment: Alignment.centerRight, -// child: Text( -// _tangheemAboveTableList[index].propertyText, -// maxLines: 1, -// style: TextStyle(fontWeight: FontWeight.bold, color: ColorConsts.secondaryOrange), -// ), -// color: ColorConsts.secondaryWhite, -// ), -// ), -// SizedBox(width: 4), -// Expanded( -// child: Container( -// color: ColorConsts.secondaryWhite, -// padding: EdgeInsets.all(4), -// child: Container( -// color: Colors.white, -// padding: EdgeInsets.only(left: 4, right: 8), -// // alignment: Alignment.centerRight, -// child: Html( -// data: _tangheemAboveTableList[index]?.propertyValue ?? "", -// style: { -// 'html': Style(textAlign: TextAlign.left), -// }, -// ), -// -// // Text( -// // _tangheemAboveTableList[index].propertyValue, -// // maxLines: 1, -// // style: TextStyle( -// // color: Color( -// // Utils.stringToHex(_tangheemAboveTableList[index].textColor), -// // ), -// // ), -// // ), -// ), -// ), -// ) -// ], -// ); -// }), -// if (_tangheemInsideTableList.isNotEmpty) -// Container( -// color: ColorConsts.primaryBlue, -// margin: EdgeInsets.only(top: 8, bottom: 8), -// padding: EdgeInsets.all(8), -// child: Column( -// children: [ -// Text( -// "خط النبر و التنغيم ل${_ayatTangheemTypeMappedData.tangheemTypeName ?? ""}", -// style: TextStyle(fontWeight: FontWeight.bold, color: Colors.white), -// ), -// SizedBox(height: 8), -// tangheemInsideTablePropertyView(_tangheemInsideTableList) -// ], -// ), -// ), -// tangheemOutSideTablePropertyView(_tangheemBelowTableList) -// ], -// ); -// }), -// ), -// ), -// ), -// ), -// SizedBox(height: 8), -// discussionView(_discussionModel?.data ?? []), -// if (_dataList.isNotEmpty) -// Container( -// margin: EdgeInsets.only(top: 8), -// padding: EdgeInsets.only(bottom: 20), -// width: double.infinity, -// decoration: BoxDecoration( -// color: Colors.white, -// borderRadius: BorderRadius.circular(8), -// ), -// child: Column( -// children: [ -// Container( -// height: 60, -// width: double.infinity, -// margin: EdgeInsets.only(bottom: 8), -// alignment: Alignment.center, -// decoration: BoxDecoration( -// color: ColorConsts.primaryBlue, -// borderRadius: BorderRadius.only( -// topLeft: Radius.circular(8), -// topRight: Radius.circular(8), -// ), -// ), -// child: Text( -// "قائمة الأساليب اللغوية في هذه الآية", -// style: TextStyle(fontSize: 16, color: Colors.white), -// ), -// ), -// ListView.separated( -// padding: EdgeInsets.fromLTRB(4, 8, 4, 4), -// shrinkWrap: true, -// physics: NeverScrollableScrollPhysics(), -// itemCount: _dataList.length, -// separatorBuilder: (context, index) => SizedBox(height: 16), -// itemBuilder: (context, index) { -// return InkWell( -// onTap: () { -// List list = _dataList; -// var removedData = list[index]; -// list.remove(removedData); -// list.insert(0, removedData); -// TangheemDetailParams tangheem = TangheemDetailParams(selectedTangheemTypeId: _dataList[index].ayaTangheemTypeId, ayatTangheemTypeMappedDataList: list); -// Navigator.pushNamed(context, TangheemDetailScreen.routeName, arguments: tangheem); -// }, -// child: Text( -// _dataList[index].tangheemTypeName, -// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16, color: ColorConsts.secondaryOrange, height: 1.5), -// ), -// ); -// }, -// ), -// ], -// ), -// ), -// SizedBox(height: 16), -// AyaRecordWidget() -// ], -// ), -// ), -// if (MediaQuery.of(context).orientation == Orientation.portrait) -// AyaPlayerWidget( -// surahName: _ayatTangheemTypeMappedFirstData?.surahNameAr ?? "", -// ayaTangheemTypeId: _ayatTangheemTypeMappedFirstData?.ayaTangheemTypeId ?? "", -// globalKey: _globalKey, -// ayaNo: _ayatTangheemTypeMappedFirstData?.ayahNo, -// surahNo: _ayatTangheemTypeMappedFirstData?.surahNo, -// voiceNoteList: voiceNoteList), -// if (MediaQuery.of(context).orientation == Orientation.landscape) -// Column( -// mainAxisSize: MainAxisSize.min, -// crossAxisAlignment: CrossAxisAlignment.start, -// children: [ -// Container( -// height: 24, -// margin: EdgeInsets.only(bottom: 8, top: 8), -// // color: Colors.transparent, -// child: TextButton( -// onPressed: () { -// setState(() { -// showAyaPlayer = !showAyaPlayer; -// }); -// }, -// child: Text( -// showAyaPlayer ? "إخفاء التسجيلات" : "إظهار التسجيلات", -// style: TextStyle(color: Colors.black87, fontSize: 12), -// ), -// style: TextButton.styleFrom( -// backgroundColor: ColorConsts.gradientOrange, -// primary: ColorConsts.primaryBlue, -// padding: EdgeInsets.only(top: 4, bottom: 4, right: 8, left: 8), -// textStyle: TextStyle(color: Colors.white, fontSize: 12), -// ), -// ), -// ), -// if (showAyaPlayer) -// AyaPlayerWidget( -// surahName: _ayatTangheemTypeMappedFirstData?.surahNameAr ?? "", -// ayaTangheemTypeId: _ayatTangheemTypeMappedFirstData?.ayaTangheemTypeId ?? "", -// ayaNo: _ayatTangheemTypeMappedFirstData?.ayahNo, -// surahNo: _ayatTangheemTypeMappedFirstData?.surahNo, -// globalKey: _globalKey, -// voiceNoteList: voiceNoteList), -// ], -// ) -// ], -// ), -// ); -// } -// -// Widget nextOptionButton(String icon, String text, VoidCallback onPressed) { -// return InkWell( -// onTap: onPressed, -// child: onPressed == null -// ? SizedBox() -// : Row( -// crossAxisAlignment: CrossAxisAlignment.center, -// mainAxisSize: MainAxisSize.min, -// children: [ -// SvgPicture.asset(icon, height: 12, width: 12), -// SizedBox(width: 4), -// Text( -// text, -// style: TextStyle(color: ColorConsts.textGrey), -// ), -// ], -// ), -// ); -// } -// -// Widget previousOptionButton(String icon, String text, VoidCallback onPressed) { -// return InkWell( -// onTap: onPressed, -// child: onPressed == null -// ? SizedBox() -// : Row( -// crossAxisAlignment: CrossAxisAlignment.center, -// mainAxisSize: MainAxisSize.min, -// children: [ -// Text( -// text, -// style: TextStyle(color: ColorConsts.textGrey), -// ), -// SizedBox(width: 4), -// SvgPicture.asset(icon, height: 12, width: 12), -// ], -// ), -// ); -// } -// -// Widget tangheemOutSideTablePropertyView(List tangheemPropertyList) { -// return ListView.separated( -// itemCount: tangheemPropertyList.length, -// physics: NeverScrollableScrollPhysics(), -// shrinkWrap: true, -// separatorBuilder: (context, index) { -// return Divider( -// color: Colors.white, -// height: 4, -// thickness: 0, -// ); -// }, -// itemBuilder: (context, index) { -// return Row( -// children: [ -// Expanded( -// child: Container( -// height: 40, -// padding: EdgeInsets.only(left: 4, right: 8), -// alignment: Alignment.centerRight, -// child: Text( -// tangheemPropertyList[index].propertyText, -// maxLines: 1, -// style: TextStyle(fontWeight: FontWeight.bold, color: ColorConsts.secondaryOrange), -// ), -// color: ColorConsts.secondaryWhite, -// ), -// ), -// SizedBox(width: 4), -// Expanded( -// child: Container( -// color: ColorConsts.secondaryWhite, -// padding: EdgeInsets.all(4), -// child: Container( -// color: Colors.white, -// padding: EdgeInsets.only(left: 4, right: 8), -// // alignment: Alignment.centerRight, -// child: Html( -// data: tangheemPropertyList[index]?.propertyValue ?? "", -// style: { -// 'html': Style(textAlign: TextAlign.left), -// }, -// ), -// // Text( -// // tangheemPropertyList[index].propertyValue, -// // maxLines: 1, -// // style: TextStyle( -// // color: Color( -// // Utils.stringToHex(tangheemPropertyList[index].textColor), -// // ), -// // ), -// // ), -// ), -// ), -// ) -// ], -// ); -// }); -// } -// -// Widget tangheemInsideTablePropertyView(List tangheemPropertyList) { -// return Container( -// color: Colors.white, -// padding: EdgeInsets.all(2), -// child: Row( -// children: [ -// for (var property in tangheemPropertyList) -// Expanded( -// child: Container( -// // color: ColorConsts.secondaryWhite, -// // padding: EdgeInsets.all(8), -// margin: EdgeInsets.only(left: 2, right: 2), -// child: Column( -// mainAxisSize: MainAxisSize.min, -// crossAxisAlignment: CrossAxisAlignment.start, -// mainAxisAlignment: MainAxisAlignment.center, -// children: [ -// Container( -// color: ColorConsts.secondaryWhite, -// //height: 30, -// alignment: Alignment.center, -// padding: EdgeInsets.only(left: 2, right: 4), -// width: double.infinity, -// child: Text( -// property.propertyText ?? "", -// // maxLines: 1, -// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 12, color: ColorConsts.secondaryOrange), -// ), -// ), -// Container(width: double.infinity, height: 4, color: Colors.white), -// Container( -// color: ColorConsts.secondaryWhite, -// padding: EdgeInsets.all(4), -// child: Container( -// color: Colors.white, -// padding: EdgeInsets.only(left: 2, right: 4), -// width: double.infinity, -// child: Html( -// data: property.propertyValue ?? "", -// style: { -// 'html': Style(textAlign: TextAlign.left), -// }, -// ), -// -// // Text( -// // property.propertyValue ?? "", -// // maxLines: 1, -// // style: TextStyle( -// // fontSize: 12, -// // color: Color( -// // Utils.stringToHex(property.textColor), -// // ), -// // ), -// // ), -// ), -// ), -// ], -// ), -// ), -// ) -// ], -// ) -// -// //@todo sikander :commented these line for later discussion -// // ListView.separated( -// // itemCount: tangheemPropertyList.length, -// // physics: NeverScrollableScrollPhysics(), -// // padding: EdgeInsets.zero, -// // shrinkWrap: true, -// // separatorBuilder: (context, index) { -// // return Divider( -// // color: Colors.white, -// // height: 1, -// // thickness: 0, -// // ); -// // }, -// // itemBuilder: (context, index) { -// // return Container( -// // color: ColorConsts.secondaryWhite, -// // padding: EdgeInsets.all(8), -// // child: Column( -// // mainAxisSize: MainAxisSize.min, -// // crossAxisAlignment: CrossAxisAlignment.start, -// // mainAxisAlignment: MainAxisAlignment.center, -// // children: [ -// // Text( -// // tangheemPropertyList[index].propertyText ?? "", -// // style: TextStyle(fontWeight: FontWeight.bold, fontSize: 12, color: ColorConsts.secondaryOrange), -// // ), -// // SizedBox(height: 4), -// // Text( -// // tangheemPropertyList[index].propertyValue ?? "", -// // style: TextStyle( -// // fontSize: 12, -// // color: Color( -// // Utils.stringToHex(tangheemPropertyList[index].textColor), -// // ), -// // ), -// // ), -// // ], -// // ), -// // ); -// // }, -// // ), -// ); -// } -// -// Widget discussionView(List _discussionList) { -// _discussionList = _discussionList.where((element) => element.status.toLowerCase() == "Accept".toLowerCase()).toList(); -// return Stack( -// alignment: Alignment.bottomCenter, -// children: [ -// Container( -// margin: EdgeInsets.only(top: 4, bottom: 25), -// padding: EdgeInsets.all(8), -// width: double.infinity, -// decoration: BoxDecoration( -// color: Colors.white, -// borderRadius: BorderRadius.circular(8), -// ), -// child: _discussionList.length > 0 -// ? ListView.separated( -// padding: EdgeInsets.only(top: 4, bottom: 24), -// shrinkWrap: true, -// physics: NeverScrollableScrollPhysics(), -// itemCount: _discussionList.length, -// separatorBuilder: (context, index) => SizedBox(height: 16), -// itemBuilder: (context, index) { -// return Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// mainAxisSize: MainAxisSize.min, -// children: [ -// Row( -// children: [ -// SvgPicture.asset( -// "assets/icons/chat_user.svg", -// width: 60, -// height: 60, -// ), -// SizedBox(width: 8), -// Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// mainAxisAlignment: MainAxisAlignment.center, -// children: [ -// Text( -// "تعليق على الآية ${_ayatTangheemTypeMappedFirstData.ayatNumberInSurahs}", -// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16, color: ColorConsts.primaryBlue, height: 1.5), -// ), -// SizedBox(height: 4), -// Directionality( -// textDirection: TextDirection.ltr, -// child: Text( -// _discussionList[index].date.toFormattedDate(), -// style: TextStyle(fontSize: 12, color: ColorConsts.textGrey, height: 1), -// ), -// ), -// ], -// ) -// ], -// ), -// SizedBox(height: 4), -// Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// children: [ -// Text( -// "تعليق من: " + _discussionList[index].userName, -// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14, color: ColorConsts.primaryBlue, height: 1.5), -// ), -// Text( -// _discussionList[index].discussionText, -// style: TextStyle(fontSize: 14, color: ColorConsts.textGrey, height: 1.4), -// ), -// if ((_discussionList[index]?.adminResponse ?? "").isNotEmpty) SizedBox(height: 4), -// if ((_discussionList[index]?.adminResponse ?? "").isNotEmpty) -// Text( -// "رد من المسؤول: " + _discussionList[index].adminResponse, -// style: TextStyle(fontSize: 14, color: ColorConsts.textGrey, height: 1.4), -// ), -// ], -// ) -// ], -// ); -// }, -// ) -// : Text( -// "لا يوجد تعليقات", -// style: TextStyle(fontSize: 12, color: ColorConsts.primaryBlue, height: 1.5), -// ), -// ), -// Positioned( -// bottom: 0, -// child: InkWell( -// borderRadius: BorderRadius.circular(30), -// onTap: () async { -// if (!AppState().isUserLogin) { -// Widget cancelButton = FlatButton( -// child: Text("أرغب بالتسجيل"), -// onPressed: () async { -// Navigator.pop(context); -// await Navigator.pushNamed(context, LoginScreen.routeName); -// if (!AppState().isUserLogin) { -// return; -// } -// }, -// ); -// Widget continueButton = FlatButton( -// child: Text("استمرار كضيف"), -// onPressed: () { -// Navigator.pop(context); -// return; -// }, -// ); -// -// AlertDialog alert = AlertDialog( -// content: Text("هذه الخاصية متاحه فقط للأعضاء المسجلين"), -// actions: [ -// cancelButton, -// continueButton, -// ], -// ); -// -// showDialog( -// context: context, -// builder: (BuildContext context) { -// return alert; -// }, -// ); -// -// return; -// } -// showDialog( -// context: context, -// barrierColor: ColorConsts.secondaryWhite.withOpacity(0.8), -// builder: (BuildContext context) => DiscussionInputDialog(onCommentPress: (comment) { -// sendComment(comment); -// }), -// ); -// }, -// child: Container( -// height: 40, -// padding: EdgeInsets.only(left: 24, right: 24), -// alignment: Alignment.centerRight, -// decoration: BoxDecoration( -// borderRadius: BorderRadius.circular(30), -// color: ColorConsts.gradientPink, -// gradient: LinearGradient( -// stops: [0.0, 0.5], -// begin: Alignment.topCenter, -// end: Alignment.bottomCenter, -// colors: [ColorConsts.gradientPink, ColorConsts.gradientOrange], -// ), -// ), -// child: Text( -// "إضافة تعليق", -// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14, color: Colors.white, height: 1.5), -// ), -// ), -// ), -// ), -// ], -// ); -// } -// } diff --git a/lib/ui/work_list/itg_fragments/approval_level_fragment.dart b/lib/ui/work_list/itg_fragments/approval_level_fragment.dart index c09b62e..027d8ca 100644 --- a/lib/ui/work_list/itg_fragments/approval_level_fragment.dart +++ b/lib/ui/work_list/itg_fragments/approval_level_fragment.dart @@ -6,7 +6,6 @@ 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/itg_forms_models/wf_history_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'; diff --git a/lib/ui/work_list/sheets/delegate_sheet.dart b/lib/ui/work_list/sheets/delegate_sheet.dart index 4ce032c..1923c27 100644 --- a/lib/ui/work_list/sheets/delegate_sheet.dart +++ b/lib/ui/work_list/sheets/delegate_sheet.dart @@ -5,8 +5,12 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/worklist/worklist_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; -import 'package:mohem_flutter_app/extensions/string_extensions.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/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/get_action_history_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart'; import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; import 'package:mohem_flutter_app/ui/work_list/sheets/search_options_sheet.dart'; import 'package:mohem_flutter_app/ui/work_list/sheets/selected_item_sheet.dart'; @@ -14,19 +18,13 @@ import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; import 'package:mohem_flutter_app/widgets/input_widget.dart'; -import 'package:mohem_flutter_app/widgets/radio/show_radio.dart'; -import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; - -import '../../../models/generic_response_model.dart'; -import '../../../models/get_action_history_list_model.dart'; -import '../../../models/worklist/get_favorite_replacements_model.dart'; class DelegateSheet extends StatefulWidget { int? notificationID; - String title,apiMode; + String title, apiMode; List? actionHistoryList; - DelegateSheet({required this.title,required this.apiMode,this.notificationID, this.actionHistoryList}); + DelegateSheet({required this.title, required this.apiMode, this.notificationID, this.actionHistoryList}); @override State createState() => _DelegateSheetState(); @@ -69,7 +67,7 @@ class _DelegateSheetState extends State { return null; } - fetchChangeFav({required String email, required String employeName, required String image, required String userName, bool isFav = false, bool isNeedToRefresh = false}) async { + void fetchChangeFav({required String email, required String employeName, required String image, required String userName, bool isFav = false, bool isNeedToRefresh = false}) async { Utils.showLoading(context); favLetters = null; selectedFavLetter = null; diff --git a/lib/ui/work_list/sheets/search_options_sheet.dart b/lib/ui/work_list/sheets/search_options_sheet.dart index d773d62..9b794bb 100644 --- a/lib/ui/work_list/sheets/search_options_sheet.dart +++ b/lib/ui/work_list/sheets/search_options_sheet.dart @@ -1,10 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/classes/colors.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 '../../../classes/colors.dart'; -import '../../../widgets/radio/show_radio.dart'; +import 'package:mohem_flutter_app/widgets/radio/show_radio.dart'; class SearchOptionsSheet extends StatelessWidget { String selectedType; diff --git a/lib/ui/work_list/sheets/selected_item_sheet.dart b/lib/ui/work_list/sheets/selected_item_sheet.dart index 3c9af9b..aadec34 100644 --- a/lib/ui/work_list/sheets/selected_item_sheet.dart +++ b/lib/ui/work_list/sheets/selected_item_sheet.dart @@ -1,19 +1,15 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/worklist/worklist_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; -import 'package:mohem_flutter_app/extensions/string_extensions.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/models/get_action_history_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart'; +import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; import 'package:mohem_flutter_app/widgets/input_widget.dart'; -import 'package:mohem_flutter_app/widgets/radio/show_radio.dart'; -import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; - -import '../../../app_state/app_state.dart'; -import '../../../classes/utils.dart'; -import '../../../models/get_action_history_list_model.dart'; -import '../../../models/worklist/get_favorite_replacements_model.dart'; -import '../../../models/worklist/replacement_list_model.dart'; class SelectedItemSheet extends StatelessWidget { String title, apiMode; @@ -115,13 +111,13 @@ class SelectedItemSheet extends StatelessWidget { Future performNetworkCall(BuildContext context, {String? email, String? userId}) async { Utils.showLoading(context); - try{ + try { await WorkListApiClient().submitComment(comment: comment, email: email, userId: userId, notificationId: notificationID, apiMode: apiMode); Utils.hideLoading(context); Navigator.pop(context); Navigator.pop(context); Navigator.pop(context, "delegate_reload"); - }catch (ex) { + } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); } diff --git a/lib/ui/work_list/worklist_detail_screen.dart b/lib/ui/work_list/worklist_detail_screen.dart index 176cb41..6ad0a79 100644 --- a/lib/ui/work_list/worklist_detail_screen.dart +++ b/lib/ui/work_list/worklist_detail_screen.dart @@ -23,6 +23,10 @@ import 'package:mohem_flutter_app/models/get_stamp_ms_notification_body_list_mod import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_contact_notification_body_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_phones_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; import 'package:mohem_flutter_app/ui/work_list/sheets/delegate_sheet.dart'; import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/actions_fragment.dart'; @@ -31,15 +35,10 @@ import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/detail_fragmen import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/info_fragments.dart'; import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/request_fragment.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/dialogs/accept_reject_input_dialog.dart'; - -import '../../models/worklist/hr/eit_otification_body_model.dart'; -import '../../models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; -import '../../models/worklist/hr/get_contact_notification_body_list_model.dart'; -import '../../models/worklist/hr/get_phones_notification_body_list_model.dart'; -import '../../widgets/bottom_sheet.dart'; -import '../../widgets/dialogs/confirm_dialog.dart'; +import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart'; class WorkListDetailScreen extends StatefulWidget { WorkListDetailScreen({Key? key}) : super(key: key); @@ -486,7 +485,7 @@ class _WorkListDetailScreenState extends State { "P_APPROVER_INDEX": null, "P_COMMENTS": "", "P_FORWARD_TO_USER_NAME": "", - "P_NOTIFICATION_ID": workListData!.nOTIFICATIONID!, + "P_NOTIFICATION_ID": workListData!.nOTIFICATIONID, "RespondAttributeList": [ if (notificationNoteInput != null) {notificationNoteInput!.attributeName: note} ], diff --git a/lib/ui/work_list/worklist_fragments/detail_fragment.dart b/lib/ui/work_list/worklist_fragments/detail_fragment.dart index a8e6282..7e2567e 100644 --- a/lib/ui/work_list/worklist_fragments/detail_fragment.dart +++ b/lib/ui/work_list/worklist_fragments/detail_fragment.dart @@ -1,9 +1,7 @@ import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; -import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/extensions/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/member_information_list_model.dart'; @@ -45,8 +43,7 @@ class _DetailFragmentState extends State { mainAxisSize: MainAxisSize.min, children: [ ItemDetailView(LocaleKeys.employeeNumber.tr(), widget.memberInformationListModel!.eMPLOYEENUMBER ?? ""), - ItemDetailView(LocaleKeys.employeeName.tr(), - (AppState().isArabic(context) ? widget.memberInformationListModel!.eMPLOYEENAMEAr : widget.memberInformationListModel!.eMPLOYEENAMEEn) ?? ""), + ItemDetailView(LocaleKeys.employeeName.tr(), (AppState().isArabic(context) ? widget.memberInformationListModel!.eMPLOYEENAMEAr : widget.memberInformationListModel!.eMPLOYEENAMEEn) ?? ""), ItemDetailView(LocaleKeys.jobTitle.tr(), makePositionName(widget.memberInformationListModel!.pOSITIONNAME ?? "")), ItemDetailView(LocaleKeys.grade.tr(), widget.memberInformationListModel!.gRADENAME ?? ""), ItemDetailView(LocaleKeys.jobCategory.tr(), makePositionName(widget.memberInformationListModel!.pOSITIONNAME ?? "")), @@ -68,5 +65,4 @@ class _DetailFragmentState extends State { } return jobName; } - } diff --git a/lib/ui/work_list/worklist_fragments/info_fragments.dart b/lib/ui/work_list/worklist_fragments/info_fragments.dart index 5156a33..bc47989 100644 --- a/lib/ui/work_list/worklist_fragments/info_fragments.dart +++ b/lib/ui/work_list/worklist_fragments/info_fragments.dart @@ -1,6 +1,5 @@ import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; -import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/date_uitl.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; @@ -11,14 +10,13 @@ import 'package:mohem_flutter_app/models/get_item_creation_ntf_body_list_model.d import 'package:mohem_flutter_app/models/get_po_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_stamp_ms_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_contact_notification_body_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_phones_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; -import '../../../models/worklist/hr/eit_otification_body_model.dart'; -import '../../../models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; -import '../../../models/worklist/hr/get_contact_notification_body_list_model.dart'; -import '../../../models/worklist/hr/get_phones_notification_body_list_model.dart'; - class InfoFragment extends StatelessWidget { WorkListResponseModel? workListData; List poHeaderList; diff --git a/lib/widgets/Updater.dart b/lib/widgets/Updater.dart index 154173d..82cc172 100644 --- a/lib/widgets/Updater.dart +++ b/lib/widgets/Updater.dart @@ -28,7 +28,7 @@ class Updater extends StatelessWidget{ }); } - pushData(T? data) { + void pushData(T? data) { _history.add(data); sink?.sink.add(data); } diff --git a/lib/widgets/bottom_sheet.dart b/lib/widgets/bottom_sheet.dart index f0bf3f8..d151afc 100644 --- a/lib/widgets/bottom_sheet.dart +++ b/lib/widgets/bottom_sheet.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; -showMyBottomSheet(BuildContext context, {required Widget child}) { +void showMyBottomSheet(BuildContext context, {required Widget child}) { showModalBottomSheet( context: context, isScrollControlled: true, diff --git a/lib/widgets/button/default_button.dart b/lib/widgets/button/default_button.dart index 77d1c61..d572d0c 100644 --- a/lib/widgets/button/default_button.dart +++ b/lib/widgets/button/default_button.dart @@ -3,10 +3,7 @@ import 'package:flutter_svg/svg.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; extension WithContainer on Widget { - Widget get insideContainer => Container( - color: Colors.white, - padding: const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21), - child: this); + Widget get insideContainer => Container(color: Colors.white, padding: const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21), child: this); } class DefaultButton extends StatelessWidget { @@ -23,15 +20,7 @@ class DefaultButton extends StatelessWidget { final List? colors; DefaultButton(this.text, this.onPress, - {this.color, - this.isTextExpanded = true, - this.svgIcon, - this.disabledColor, - this.count = 0, - this.textColor = Colors.white, - this.iconData, - this.fontSize, - this.colors}); + {this.color, this.isTextExpanded = true, this.svgIcon, this.disabledColor, this.count = 0, this.textColor = Colors.white, this.iconData, this.fontSize, this.colors}); @override Widget build(BuildContext context) { @@ -42,8 +31,7 @@ class DefaultButton extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(6.0), gradient: onPress == null - ? const LinearGradient( - colors: [Color(0xffEAEAEA), Color(0xffEAEAEA)]) + ? const LinearGradient(colors: [Color(0xffEAEAEA), Color(0xffEAEAEA)]) : LinearGradient( transform: GradientRotation(.83), begin: Alignment.topRight, @@ -58,20 +46,14 @@ class DefaultButton extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ if (iconData != null) Icon(iconData, color: textColor), - if (svgIcon != null) - SvgPicture.asset(svgIcon ?? "", color: textColor), + if (svgIcon != null) SvgPicture.asset(svgIcon ?? "", color: textColor), if (!isTextExpanded) Padding( - padding: EdgeInsets.only( - left: (iconData ?? svgIcon) != null ? 6 : 0), + padding: EdgeInsets.only(left: (iconData ?? svgIcon) != null ? 6 : 0), child: Text( text, textAlign: TextAlign.center, - style: TextStyle( - fontSize: fontSize ?? 16, - fontWeight: FontWeight.w600, - color: textColor, - letterSpacing: -0.48), + style: TextStyle(fontSize: fontSize ?? 16, fontWeight: FontWeight.w600, color: textColor, letterSpacing: -0.48), ), ), if (isTextExpanded) @@ -79,11 +61,7 @@ class DefaultButton extends StatelessWidget { child: Text( text, textAlign: TextAlign.center, - style: TextStyle( - fontSize: fontSize ?? 16, - fontWeight: FontWeight.w600, - color: textColor, - letterSpacing: -0.48), + style: TextStyle(fontSize: fontSize ?? 16, fontWeight: FontWeight.w600, color: textColor, letterSpacing: -0.48), ), ), if (count > 0) @@ -94,17 +72,11 @@ class DefaultButton extends StatelessWidget { padding: const EdgeInsets.only(left: 5, right: 5), alignment: Alignment.center, height: 16, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.0), - color: Colors.white), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(10.0), color: Colors.white), child: Text( "$count", textAlign: TextAlign.center, - style: const TextStyle( - fontSize: 12, - fontWeight: FontWeight.w700, - color: Color(0xffD02127), - letterSpacing: -0.6), + style: const TextStyle(fontSize: 12, fontWeight: FontWeight.w700, color: Color(0xffD02127), letterSpacing: -0.6), ), ), ) diff --git a/lib/widgets/button/simple_button.dart b/lib/widgets/button/simple_button.dart new file mode 100644 index 0000000..eecce21 --- /dev/null +++ b/lib/widgets/button/simple_button.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; + +class SimpleButton extends StatelessWidget { + final String text; + final VoidCallback? onPress; + final Color textColor; + final Color? color; + final double? fontSize; + final List? colors; + + SimpleButton(this.text, this.onPress, {this.color, this.textColor = Colors.white, this.fontSize, this.colors}); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onPress, + child: Container( + alignment: Alignment.center, + padding: const EdgeInsets.only(left: 12, right: 12, top: 4, bottom: 4), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6.0), + gradient: onPress == null + ? const LinearGradient(colors: [Color(0xffEAEAEA), Color(0xffEAEAEA)]) + : LinearGradient( + transform: const GradientRotation(.83), + begin: Alignment.topRight, + end: Alignment.bottomLeft, + colors: colors ?? + [ + MyColors.gradiantEndColor, + MyColors.gradiantStartColor, + ]), + ), + child: Text( + text, + style: TextStyle(fontSize: fontSize ?? 16, fontWeight: FontWeight.w600, color: textColor, letterSpacing: -0.48), + ), + ), + ); + } +} diff --git a/lib/widgets/circular_step_progress_bar.dart b/lib/widgets/circular_step_progress_bar.dart index 75724c8..6789aed 100644 --- a/lib/widgets/circular_step_progress_bar.dart +++ b/lib/widgets/circular_step_progress_bar.dart @@ -502,7 +502,7 @@ class _CircularIndicatorPainter implements CustomPainter { void removeListener(listener) {} @override - get semanticsBuilder => null; + Null get semanticsBuilder => null; @override bool shouldRebuildSemantics(CustomPainter oldDelegate) => false; diff --git a/lib/widgets/dynamic_forms/dynamic_textfield_widget.dart b/lib/widgets/dynamic_forms/dynamic_textfield_widget.dart index 23404ca..c44be0d 100644 --- a/lib/widgets/dynamic_forms/dynamic_textfield_widget.dart +++ b/lib/widgets/dynamic_forms/dynamic_textfield_widget.dart @@ -98,8 +98,8 @@ class DynamicTextFieldWidget extends StatelessWidget { ], ), ), - if (isPopup) const Icon(Icons.keyboard_arrow_down_outlined, color: MyColors.darkTextColor), - if (onTap != null) Icon(suffixIconData ?? Icons.keyboard_arrow_down_outlined, color: MyColors.darkTextColor), + if (isPopup) const Icon(Icons.keyboard_arrow_down_outlined, color: MyColors.darkIconColor), + if (onTap != null) Icon(suffixIconData ?? Icons.keyboard_arrow_down_outlined, color: MyColors.darkIconColor,size: 20), ], ), ), diff --git a/lib/widgets/location/Location.dart b/lib/widgets/location/Location.dart index bd39e2e..8456fd2 100644 --- a/lib/widgets/location/Location.dart +++ b/lib/widgets/location/Location.dart @@ -1,23 +1,22 @@ import 'dart:async'; import 'dart:math'; import 'dart:ui'; + import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:geolocator/geolocator.dart'; import 'package:google_directions_api/google_directions_api.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:mohem_flutter_app/classes/app_permissions.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/theme/colors.dart'; // import 'package:geodesy/geodesy.dart' as geodesy; -import '../../classes/app_permissions.dart'; -import '../../theme/colors.dart'; - - //Created By Mr.Zohaib class Location { static _Map map = _Map(); - static havePermission(Function(bool) callback) { + static void havePermission(Function(bool) callback) { Geolocator.checkPermission().then((value) async { if (value == LocationPermission.denied) { value = await Geolocator.requestPermission(); @@ -28,13 +27,13 @@ class Location { }); } - static isEnabled(Function(bool) callback) { + static void isEnabled(Function(bool) callback) { Geolocator.isLocationServiceEnabled().then((value) => callback(value)); } static bool _listeningSettingChange = true; - static listenGPS({bool change = true, Function(bool)? onChange}) async { + static void listenGPS({bool change = true, Function(bool)? onChange}) async { _listeningSettingChange = change; if (change == false) return; @@ -46,8 +45,8 @@ class Location { }); } - static getCurrentLocation(Function(LatLng?) callback) { - done(Position position) { + static void getCurrentLocation(Function(LatLng?) callback) { + void done(Position position) { //AppStorage.sp.saveLocation(position); LatLng? myCurrentLocation = LatLng(position.latitude, position.longitude); @@ -55,8 +54,7 @@ class Location { } AppPermissions.location((granted) { - - if (granted) + if (granted) { Geolocator.getLastKnownPosition(forceAndroidLocationManager: true).then((value) { if (value == null) { Geolocator.getCurrentPosition().then((value) { @@ -66,6 +64,7 @@ class Location { done(value); } }); + } }); } @@ -125,20 +124,20 @@ class _Map { return camera; } - moveCamera(CameraPosition camera, @required Completer mapController, bool animation) { + void moveCamera(CameraPosition camera, @required Completer mapController, bool animation) { mapController.future.then((controller) { animation ? controller.animateCamera(CameraUpdate.newCameraPosition(camera)) : controller.moveCamera(CameraUpdate.newCameraPosition(camera)); }); } - scrollBy({double x = 0, double y = 0, required Completer mapController, bool animation = true}) { + void scrollBy({double x = 0, double y = 0, required Completer mapController, bool animation = true}) { var camera = CameraUpdate.scrollBy(x, y); mapController.future.then((controller) { animation ? controller.animateCamera(camera) : controller.moveCamera(camera); }); } - goToCurrentLocation({Completer? mapController, double? direction = 0.0, bool? animation}) { + void goToCurrentLocation({Completer? mapController, double? direction = 0.0, bool? animation}) { Location.getCurrentLocation((location) { moveTo(location!, zoom: 17, mapController: mapController!, animation: animation, direction: direction!); }); @@ -146,7 +145,7 @@ class _Map { var routes = Map(); - setRoutePolylines(LatLng? source, LatLng? destination, Set polylines, Completer mapController, Function(DirectionsRoute?) completion) { + void setRoutePolylines(LatLng? source, LatLng? destination, Set polylines, Completer mapController, Function(DirectionsRoute?) completion) { if (source == null || destination == null) { completion(null); return; @@ -156,7 +155,7 @@ class _Map { var destin = '${destination.latitude},${destination.longitude}'; var routeId = '$origin->$destination'; - createPolyline(DirectionsRoute results) { + void createPolyline(DirectionsRoute results) { List polylineCoordinates = results.overviewPath!.map((e) => LatLng(e.latitude, e.longitude)).toList(); PolylineId id = PolylineId("route"); Polyline polyline = Polyline( @@ -221,7 +220,7 @@ class _Map { return LatLngBounds(northeast: LatLng(x1!, y1!), southwest: LatLng(x0!, y0!)); } - focusCameraToLatLngBounds({LatLngBounds? bound, Completer? mapController, double? padding}) async { + void focusCameraToLatLngBounds({LatLngBounds? bound, Completer? mapController, double? padding}) async { if (bound == null) return; CameraUpdate camera = CameraUpdate.newLatLngBounds(bound, padding!); @@ -229,7 +228,7 @@ class _Map { controller.animateCamera(camera); } - focusCameraTo2Points({LatLng? point1, LatLng? point2, Completer? mapController, double? padding}) async { + void focusCameraTo2Points({LatLng? point1, LatLng? point2, Completer? mapController, double? padding}) async { var source = point1; var destination = point2; if (source != null && destination != null) { diff --git a/lib/widgets/otp_widget.dart b/lib/widgets/otp_widget.dart index a489e61..e90308d 100644 --- a/lib/widgets/otp_widget.dart +++ b/lib/widgets/otp_widget.dart @@ -108,7 +108,7 @@ class OTPWidgetState extends State with SingleTickerProviderStateMixi } } - _calculateStrList() { + void calculateStrList() { if (strList.length > widget.maxLength) { strList.length = widget.maxLength; } @@ -123,7 +123,7 @@ class OTPWidgetState extends State with SingleTickerProviderStateMixi focusNode = widget.focusNode ?? FocusNode(); _initTextController(); - _calculateStrList(); + calculateStrList(); widget.controller?.addListener(_controllerListener); focusNode?.addListener(_focusListener); } @@ -291,7 +291,7 @@ class OTPWidgetState extends State with SingleTickerProviderStateMixi } Widget _pinBoxRow(BuildContext context) { - _calculateStrList(); + calculateStrList(); List pinCodes = List.generate(widget.maxLength, (int i) { return _buildPinCode(i, context); }); diff --git a/pubspec.yaml b/pubspec.yaml index 9f1a7af..1f7f410 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -55,6 +55,7 @@ dependencies: nfc_manager: ^3.1.1 uuid: ^3.0.6 image_picker: ^0.8.5+3 + file_picker: ^4.6.1 # maps google_maps_flutter: ^2.0.2 google_maps_utils: ^1.4.0+1 @@ -62,8 +63,11 @@ dependencies: geolocator: any # flutter_compass: ^0.6.1 google_maps_flutter_web: ^0.3.2 + month_year_picker: ^0.2.0+1 + month_picker_dialog: ^0.4.0 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