Merge branch 'master' into Fatima

# Conflicts:
#	lib/config/routes.dart
#	lib/models/generic_response_model.dart
#	lib/models/profile_menu.model.dart
merge-requests/1/merge
Fatimah Alshammari 3 years ago
commit dc880df35a

@ -31,6 +31,7 @@
"viewAllServices": "عرض جميع الخدمات", "viewAllServices": "عرض جميع الخدمات",
"monthlyAttendance": "الحضور الشهري", "monthlyAttendance": "الحضور الشهري",
"vacationRule": "حكم اجازة", "vacationRule": "حكم اجازة",
"vacationType": "نوع الاجازة",
"startDateT": "تاريخ البدء", "startDateT": "تاريخ البدء",
"endDateT": "تاريخ الانتهاء", "endDateT": "تاريخ الانتهاء",
"workFromHome": "العمل من المنزل", "workFromHome": "العمل من المنزل",
@ -310,11 +311,34 @@
"requestType": "نوع الطلب", "requestType": "نوع الطلب",
"employeeDigitalID": "هويةالموظف الرقمية", "employeeDigitalID": "هويةالموظف الرقمية",
"businessCard": "بطاقة العمل", "businessCard": "بطاقة العمل",
"checkOut":"وقت الخروج", "checkOut": "وقت الخروج",
"regular":"منتظم", "regular": "منتظم",
"mark" : "علامة", "mark": "علامة",
"selectMethodOfAttendance":"اختر طريقة تسجيل الحضور", "selectMethodOfAttendance": "اختر طريقة تسجيل الحضور",
"comeNearHMGWifi": "HMG wifi من فضلك اقترب من", "comeNearHMGWifi": "HMG wifi من فضلك اقترب من",
"deliverNotificationToMeRegardless": "تسليم الإخطارات إلي بغض النظر عن أي قواعد عامة",
"close": "أغلق",
"respond": "يرد",
"vacationRuleAdded": "تمت إضافة قاعدة الإجازة",
"selectTypeT": "اختر صنف",
"notification": "تنبيه",
"selectNotification": "حدد إعلام",
"ifAllSelectedYouWillSkip": "* إذا تم تحديد الكل ، فستنتقل إلى الخطوة 3",
"applyForVacationRule": "التقدم بطلب للحصول على قانون الإجازة",
"step1": "الخطوة 1",
"step2": "الخطوة 2",
"step3": "الخطوه 3",
"message": "رسالة",
"writeAMessage": "اكتب رسالة",
"notificationReassign": "إعادة تعيين الإخطار",
"selectEmployee": "حدد الموظف",
"searchEmployeeForReplacement": "ابحث عن موظف بديل",
"searchForEmployee": "ابحث عن موظف",
"pleaseSpecifyEndTime": "الرجاء تحديد وقت الانتهاء",
"pleaseSelectNotificationReassign": "يرجى تحديد إعادة تعيين الإخطار",
"pleaseSelectEmployeeForReplacement": "الرجاء تحديد موظف للاستبدال",
"pleaseSelectAction": "الرجاء تحديد الإجراء",
"pleaseSelectDate": "الرجاء تحديد التاريخ",
"profile": { "profile": {
"reset_password": { "reset_password": {
"label": "Reset Password", "label": "Reset Password",

@ -31,6 +31,7 @@
"viewAllServices": "View All Services", "viewAllServices": "View All Services",
"monthlyAttendance": "Monthly Attendance", "monthlyAttendance": "Monthly Attendance",
"vacationRule": "Vacation Rule", "vacationRule": "Vacation Rule",
"vacationType": "Vacation Type",
"startDateT": "Start Date", "startDateT": "Start Date",
"endDateT": "End Date", "endDateT": "End Date",
"workFromHome": "Work From Home", "workFromHome": "Work From Home",
@ -310,11 +311,34 @@
"wantToReject": "Are you sure want to reject?", "wantToReject": "Are you sure want to reject?",
"employeeDigitalID": "Employee Digital ID", "employeeDigitalID": "Employee Digital ID",
"businessCard": "Business Card", "businessCard": "Business Card",
"checkOut":"Check Out", "checkOut": "Check Out",
"regular":"Regular", "regular": "Regular",
"mark" : "Mark", "mark": "Mark",
"selectMethodOfAttendance":"Select the method to mark the attendance", "selectMethodOfAttendance": "Select the method to mark the attendance",
"comeNearHMGWifi": "Please come near to HMG wifi", "comeNearHMGWifi": "Please come near to HMG wifi",
"deliverNotificationToMeRegardless": "Deliver notifications to me regardless of any general rules",
"close": "Close",
"respond": "Respond",
"vacationRuleAdded": "Vacation rule added",
"selectTypeT": "Select Type",
"notification": "Notification",
"selectNotification": "Select Notification",
"ifAllSelectedYouWillSkip": "*If All is selected, you will skip to step 3",
"applyForVacationRule": "Apply for Vacation Rule",
"step1": "Step 1",
"step2": "Step 2",
"step3": "Step 3",
"message": "Message",
"writeAMessage": "Write a message",
"notificationReassign": "Notification Reassign",
"selectEmployee": "Select Employee",
"searchEmployeeForReplacement": "Search employee for replacement",
"searchForEmployee": "Search for Employee",
"pleaseSpecifyEndTime": "Please specify End Time",
"pleaseSelectNotificationReassign": "Please select notification reassign",
"pleaseSelectEmployeeForReplacement": "Please select employee for replacement",
"pleaseSelectAction": "Please select action",
"pleaseSelectDate": "Please select date",
"profile": { "profile": {
"reset_password": { "reset_password": {
"label": "Reset Password", "label": "Reset Password",

@ -3,7 +3,7 @@
archiveVersion = 1; archiveVersion = 1;
classes = { classes = {
}; };
objectVersion = 46; objectVersion = 50;
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
@ -140,6 +140,7 @@
9705A1C41CF9048500538489 /* Embed Frameworks */, 9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
AAF25E5FC427CABFCDCC628C /* [CP] Embed Pods Frameworks */, AAF25E5FC427CABFCDCC628C /* [CP] Embed Pods Frameworks */,
8E1FBB2EA6B3AEDD9488054A /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
@ -156,7 +157,7 @@
97C146E61CF9000F007C117D /* Project object */ = { 97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastUpgradeCheck = 1020; LastUpgradeCheck = 1300;
ORGANIZATIONNAME = ""; ORGANIZATIONNAME = "";
TargetAttributes = { TargetAttributes = {
97C146ED1CF9000F007C117D = { 97C146ED1CF9000F007C117D = {
@ -234,6 +235,23 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
8E1FBB2EA6B3AEDD9488054A /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0;
};
9740EEB61CF901F6004384FC /* Run Script */ = { 9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@ -358,7 +376,10 @@
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.mohemFlutterApp; PRODUCT_BUNDLE_IDENTIFIER = com.mohemFlutterApp;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@ -482,7 +503,10 @@
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.mohemFlutterApp; PRODUCT_BUNDLE_IDENTIFIER = com.mohemFlutterApp;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@ -501,7 +525,10 @@
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.mohemFlutterApp; PRODUCT_BUNDLE_IDENTIFIER = com.mohemFlutterApp;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1020" LastUpgradeVersion = "1300"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

@ -41,5 +41,7 @@
</array> </array>
<key>UIViewControllerBasedStatusBarAppearance</key> <key>UIViewControllerBasedStatusBarAppearance</key>
<false/> <false/>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
</dict> </dict>
</plist> </plist>

@ -2,10 +2,10 @@ import 'package:mohem_flutter_app/api/api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/consts.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/generic_response_model.dart';
import 'package:mohem_flutter_app/models/vacation_rule/create_vacation_rule_list_model.dart';
import 'package:mohem_flutter_app/models/vacation_rule/get_item_type_notifications_list_model.dart'; import 'package:mohem_flutter_app/models/vacation_rule/get_item_type_notifications_list_model.dart';
import 'package:mohem_flutter_app/models/vacation_rule/get_notification_reassign_mode_list_model.dart'; import 'package:mohem_flutter_app/models/vacation_rule/get_notification_reassign_mode_list_model.dart';
import 'package:mohem_flutter_app/models/vacation_rule/get_vacation_rules_list_model.dart'; import 'package:mohem_flutter_app/models/vacation_rule/get_vacation_rules_list_model.dart';
import 'package:mohem_flutter_app/models/vacation_rule/respond_attributes_list_model.dart';
import 'package:mohem_flutter_app/models/vacation_rule/vr_item_types_list_model.dart'; import 'package:mohem_flutter_app/models/vacation_rule/vr_item_types_list_model.dart';
import 'package:mohem_flutter_app/models/vacation_rule/wf_look_up_list_model.dart'; import 'package:mohem_flutter_app/models/vacation_rule/wf_look_up_list_model.dart';
@ -56,13 +56,33 @@ class VacationRuleApiClient {
}, url, postParams); }, url, postParams);
} }
Future<List<RespondAttributesList>> getRespondAttributes(String pItemType, String pNotificationName) async { Future<GenericResponseModel> getRespondAttributes(String pItemType, String pNotificationName) async {
String url = "${ApiConsts.erpRest}GET_RESPOND_ATTRIBUTES"; String url = "${ApiConsts.erpRest}GET_RESPOND_ATTRIBUTES";
Map<String, dynamic> postParams = {"P_ITEM_TYPE": pItemType, "P_NOTIFICATION_NAME": pNotificationName}; Map<String, dynamic> postParams = {"P_ITEM_TYPE": pItemType, "P_NOTIFICATION_NAME": pNotificationName};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json); GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData.respondAttributesList ?? []; return responseData;
}, url, postParams);
}
Future<CreateVacationRuleList?> createVacationRule(String pBeginDate, String pEndDate, String pItemType, String pNotificationName, String pMessage, String pAction, String pReplacementUserName,
List<Map<String, dynamic>> respondAttributeList) async {
String url = "${ApiConsts.erpRest}CREATE_VACATION_RULE";
Map<String, dynamic> postParams = {
"P_ITEM_TYPE": pItemType,
"P_NOTIFICATION_NAME": pNotificationName,
"P_BEGIN_DATE": pBeginDate,
"P_END_DATE": pEndDate,
"P_MESSAGE": pMessage,
"P_REPLACEMENT_USER_NAME": pReplacementUserName,
"P_ACTION": pAction,
"RespondAttributeList": respondAttributeList,
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData.createVacationRuleList;
}, url, postParams); }, url, postParams);
} }

@ -12,6 +12,7 @@ class MyColors {
static const Color grey57Color = Color(0xff575757); static const Color grey57Color = Color(0xff575757);
static const Color grey67Color = Color(0xff676767); static const Color grey67Color = Color(0xff676767);
static const Color grey77Color = Color(0xff777777); static const Color grey77Color = Color(0xff777777);
static const Color grey80Color = Color(0xff808080);
static const Color grey70Color = Color(0xff707070); static const Color grey70Color = Color(0xff707070);
static const Color greyACColor = Color(0xffACACAC); static const Color greyACColor = Color(0xffACACAC);
static const Color grey98Color = Color(0xff989898); static const Color grey98Color = Color(0xff989898);
@ -22,11 +23,14 @@ class MyColors {
static const Color darkWhiteColor = Color(0xffE0E0E0); static const Color darkWhiteColor = Color(0xffE0E0E0);
static const Color redColor = Color(0xffD02127); static const Color redColor = Color(0xffD02127);
static const Color yellowColor = Color(0xffF4E31C); static const Color yellowColor = Color(0xffF4E31C);
static const Color yellowFavColor = Color(0xffEAC321);
static const Color backgroundBlackColor = Color(0xff202529); static const Color backgroundBlackColor = Color(0xff202529);
static const Color black = Color(0xff000000); static const Color black = Color(0xff000000);
static const Color white = Color(0xffffffff); static const Color white = Color(0xffffffff);
static const Color green = Color(0xffffffff); static const Color green = Color(0xffffffff);
static const Color borderColor = Color(0xffE8E8E8); static const Color borderColor = Color(0xffE8E8E8);
static const Color borderE3Color = Color(0xffE3E3E3);
static const Color borderCEColor = Color(0xffCECECE);
//static const Color grey67Color = Color(0xff676767); //static const Color grey67Color = Color(0xff676767);
static const Color whiteColor = Color(0xFFEEEEEE); static const Color whiteColor = Color(0xFFEEEEEE);
static const Color greenColor = Color(0xff1FA269); static const Color greenColor = Color(0xff1FA269);

@ -13,6 +13,7 @@ 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/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_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/dynamic_screens/dynamic_listview_screen.dart';
import 'package:mohem_flutter_app/ui/my_attendance/services_menu_list_screen.dart';
import 'package:mohem_flutter_app/ui/my_attendance/my_attendance_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/my_attendance_screen.dart';
import 'package:mohem_flutter_app/ui/my_team/create_request.dart'; import 'package:mohem_flutter_app/ui/my_team/create_request.dart';
import 'package:mohem_flutter_app/ui/my_team/employee_details.dart'; import 'package:mohem_flutter_app/ui/my_team/employee_details.dart';
@ -38,7 +39,7 @@ import 'package:mohem_flutter_app/ui/screens/mowadhafhi/mowadhafhi_hr_request.da
import 'package:mohem_flutter_app/ui/screens/mowadhafhi/request_details.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.dart';
import 'package:mohem_flutter_app/ui/screens/pending_transactions/pending_transactions_details.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/profile/profile_screen.dart';
import 'package:mohem_flutter_app/ui/screens/submenu_screen.dart'; import 'package:mohem_flutter_app/ui/screens/submenu_screen.dart';
import 'package:mohem_flutter_app/ui/work_list/item_history_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/itg_detail_screen.dart';
@ -71,7 +72,7 @@ class AppRoutes {
static const String itemHistory = "/itemHistory"; static const String itemHistory = "/itemHistory";
static const String worklistSettings = "/worklistSettings"; static const String worklistSettings = "/worklistSettings";
static const String myAttendance = "/myAttendance"; static const String servicesMenuListScreen = "/servicesMenuListScreen";
static const String dynamicScreen = "/dynamicScreen"; static const String dynamicScreen = "/dynamicScreen";
static const String addDynamicInput = "/addDynamicInput"; static const String addDynamicInput = "/addDynamicInput";
static const String requestSubmitScreen = "/requestSubmitScreen"; static const String requestSubmitScreen = "/requestSubmitScreen";
@ -144,7 +145,7 @@ class AppRoutes {
itemHistory: (context) => ItemHistoryScreen(), itemHistory: (context) => ItemHistoryScreen(),
worklistSettings: (context) => WorklistSettings(), worklistSettings: (context) => WorklistSettings(),
myAttendance: (context) => MyAttendanceScreen(), servicesMenuListScreen: (context) => ServicesMenuListScreen(),
// workFromHome: (context) => WorkFromHomeScreen(), // workFromHome: (context) => WorkFromHomeScreen(),
// addWorkFromHome: (context) => AddWorkFromHomeScreen(), // addWorkFromHome: (context) => AddWorkFromHomeScreen(),
profile: (context) => ProfileScreen(), profile: (context) => ProfileScreen(),
@ -159,7 +160,7 @@ class AppRoutes {
//Profile //Profile
//profile: (context) => Profile(), //profile: (context) => Profile(),
//profile: (context) => Profile(), //profile: (context) => Profile(),
personalInfo: (context) => PesonalInfo(), personalInfo: (context) => PersonalInfo(),
basicDetails: (context) => BasicDetails(), basicDetails: (context) => BasicDetails(),
contactDetails: (context) => ContactDetails(), contactDetails: (context) => ContactDetails(),
familyMembers: (context) => FamilyMembers(), familyMembers: (context) => FamilyMembers(),

@ -54,10 +54,16 @@ extension EmailValidator on String {
style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 14, letterSpacing: -0.48, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), 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 isUnderLine = false, bool isBold = false, int? maxlines}) => Text(
this, this,
maxLines: maxlines, maxLines: maxlines,
style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 16, letterSpacing: -0.64, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), style: TextStyle(
color: color ?? MyColors.darkTextColor,
fontSize: 16,
letterSpacing: -0.64,
fontWeight: isBold ? FontWeight.bold : FontWeight.w600,
decoration: isUnderLine ? TextDecoration.underline : null,
),
); );
Widget toText17({Color? color, bool isBold = false}) => Text( Widget toText17({Color? color, bool isBold = false}) => Text(

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/extensions/int_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/string_extensions.dart';
import 'package:shimmer/shimmer.dart'; import 'package:shimmer/shimmer.dart';
@ -41,7 +42,7 @@ extension WidgetExtensions on Widget {
child: this, child: this,
); );
Widget objectContainerView({String title = ""}) { Widget objectContainerView({String title = "", String note = ""}) {
return Container( return Container(
padding: const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14), padding: const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14),
decoration: BoxDecoration( decoration: BoxDecoration(
@ -62,6 +63,31 @@ extension WidgetExtensions on Widget {
if (title.isNotEmpty) title.toText16(), if (title.isNotEmpty) title.toText16(),
if (title.isNotEmpty) 12.height, if (title.isNotEmpty) 12.height,
this, this,
if (note.isNotEmpty) note.toText11(),
],
),
);
}
Widget objectContainerBorderView({String title = "", String note = ""}) {
return Container(
padding: const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
border: Border.all(
color: MyColors.lightGreyEFColor,
width: 1,
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
if (title.isNotEmpty) title.toText16(),
if (title.isNotEmpty) 12.height,
this,
if (note.isNotEmpty) note.toText11(),
], ],
), ),
); );

@ -47,6 +47,9 @@ class CodegenLoader extends AssetLoader{
"viewAllServices": "عرض جميع الخدمات", "viewAllServices": "عرض جميع الخدمات",
"monthlyAttendance": "الحضور الشهري", "monthlyAttendance": "الحضور الشهري",
"vacationRule": "حكم اجازة", "vacationRule": "حكم اجازة",
"vacationType": "نوع الاجازة",
"startDateT": "تاريخ البدء",
"endDateT": "تاريخ الانتهاء",
"workFromHome": "العمل من المنزل", "workFromHome": "العمل من المنزل",
"ticketRequest": "طلب تذكرة", "ticketRequest": "طلب تذكرة",
"viewAllOffers": "مشاهدة جميع العروض", "viewAllOffers": "مشاهدة جميع العروض",
@ -248,6 +251,7 @@ class CodegenLoader extends AssetLoader{
"myAttendance": "حضوري", "myAttendance": "حضوري",
"workOnBreak": "التعويض عن العمل اثناءالاستراحه", "workOnBreak": "التعويض عن العمل اثناءالاستراحه",
"next": "التالي", "next": "التالي",
"apply": "يتقدم",
"mobile": "التليفون المحمول", "mobile": "التليفون المحمول",
"completingYear": "نحن نقدر لك لاستكمال خدمة", "completingYear": "نحن نقدر لك لاستكمال خدمة",
"year": "سنة", "year": "سنة",
@ -328,6 +332,29 @@ class CodegenLoader extends AssetLoader{
"mark": "علامة", "mark": "علامة",
"selectMethodOfAttendance": "اختر طريقة تسجيل الحضور", "selectMethodOfAttendance": "اختر طريقة تسجيل الحضور",
"comeNearHMGWifi": "HMG wifi من فضلك اقترب من", "comeNearHMGWifi": "HMG wifi من فضلك اقترب من",
"deliverNotificationToMeRegardless": "تسليم الإخطارات إلي بغض النظر عن أي قواعد عامة",
"close": "أغلق",
"respond": "يرد",
"vacationRuleAdded": "تمت إضافة قاعدة الإجازة",
"selectTypeT": "اختر صنف",
"notification": "تنبيه",
"selectNotification": "حدد إعلام",
"ifAllSelectedYouWillSkip": "* إذا تم تحديد الكل ، فستنتقل إلى الخطوة 3",
"applyForVacationRule": "التقدم بطلب للحصول على قانون الإجازة",
"step1": "الخطوة 1",
"step2": "الخطوة 2",
"step3": "الخطوه 3",
"message": "رسالة",
"writeAMessage": "اكتب رسالة",
"notificationReassign": "إعادة تعيين الإخطار",
"selectEmployee": "حدد الموظف",
"searchEmployeeForReplacement": "ابحث عن موظف بديل",
"searchForEmployee": "ابحث عن موظف",
"pleaseSpecifyEndTime": "الرجاء تحديد وقت الانتهاء",
"pleaseSelectNotificationReassign": "يرجى تحديد إعادة تعيين الإخطار",
"pleaseSelectEmployeeForReplacement": "الرجاء تحديد موظف للاستبدال",
"pleaseSelectAction": "الرجاء تحديد الإجراء",
"pleaseSelectDate": "الرجاء تحديد التاريخ",
"profile": { "profile": {
"reset_password": { "reset_password": {
"label": "Reset Password", "label": "Reset Password",
@ -395,6 +422,9 @@ static const Map<String,dynamic> en_US = {
"viewAllServices": "View All Services", "viewAllServices": "View All Services",
"monthlyAttendance": "Monthly Attendance", "monthlyAttendance": "Monthly Attendance",
"vacationRule": "Vacation Rule", "vacationRule": "Vacation Rule",
"vacationType": "Vacation Type",
"startDateT": "Start Date",
"endDateT": "End Date",
"workFromHome": "Work From Home", "workFromHome": "Work From Home",
"ticketRequest": "Ticket Request", "ticketRequest": "Ticket Request",
"viewAllOffers": "View All Offers", "viewAllOffers": "View All Offers",
@ -596,6 +626,7 @@ static const Map<String,dynamic> en_US = {
"myAttendance": "My Attendance", "myAttendance": "My Attendance",
"workOnBreak": "Work On Break", "workOnBreak": "Work On Break",
"next": "Next", "next": "Next",
"apply": "Apply",
"mobile": "Mobile", "mobile": "Mobile",
"year": "Year", "year": "Year",
"month": "Month", "month": "Month",
@ -676,6 +707,29 @@ static const Map<String,dynamic> en_US = {
"mark": "Mark", "mark": "Mark",
"selectMethodOfAttendance": "Select the method to mark the attendance", "selectMethodOfAttendance": "Select the method to mark the attendance",
"comeNearHMGWifi": "Please come near to HMG wifi", "comeNearHMGWifi": "Please come near to HMG wifi",
"deliverNotificationToMeRegardless": "Deliver notifications to me regardless of any general rules",
"close": "Close",
"respond": "Respond",
"vacationRuleAdded": "Vacation rule added",
"selectTypeT": "Select Type",
"notification": "Notification",
"selectNotification": "Select Notification",
"ifAllSelectedYouWillSkip": "*If All is selected, you will skip to step 3",
"applyForVacationRule": "Apply for Vacation Rule",
"step1": "Step 1",
"step2": "Step 2",
"step3": "Step 3",
"message": "Message",
"writeAMessage": "Write a message",
"notificationReassign": "Notification Reassign",
"selectEmployee": "Select Employee",
"searchEmployeeForReplacement": "Search employee for replacement",
"searchForEmployee": "Search for Employee",
"pleaseSpecifyEndTime": "Please specify End Time",
"pleaseSelectNotificationReassign": "Please select notification reassign",
"pleaseSelectEmployeeForReplacement": "Please select employee for replacement",
"pleaseSelectAction": "Please select action",
"pleaseSelectDate": "Please select date",
"profile": { "profile": {
"reset_password": { "reset_password": {
"label": "Reset Password", "label": "Reset Password",

@ -32,6 +32,7 @@ abstract class LocaleKeys {
static const viewAllServices = 'viewAllServices'; static const viewAllServices = 'viewAllServices';
static const monthlyAttendance = 'monthlyAttendance'; static const monthlyAttendance = 'monthlyAttendance';
static const vacationRule = 'vacationRule'; static const vacationRule = 'vacationRule';
static const vacationType = 'vacationType';
static const startDateT = 'startDateT'; static const startDateT = 'startDateT';
static const endDateT = 'endDateT'; static const endDateT = 'endDateT';
static const workFromHome = 'workFromHome'; static const workFromHome = 'workFromHome';
@ -316,6 +317,29 @@ abstract class LocaleKeys {
static const mark = 'mark'; static const mark = 'mark';
static const selectMethodOfAttendance = 'selectMethodOfAttendance'; static const selectMethodOfAttendance = 'selectMethodOfAttendance';
static const comeNearHMGWifi = 'comeNearHMGWifi'; static const comeNearHMGWifi = 'comeNearHMGWifi';
static const deliverNotificationToMeRegardless = 'deliverNotificationToMeRegardless';
static const close = 'close';
static const respond = 'respond';
static const vacationRuleAdded = 'vacationRuleAdded';
static const selectTypeT = 'selectTypeT';
static const notification = 'notification';
static const selectNotification = 'selectNotification';
static const ifAllSelectedYouWillSkip = 'ifAllSelectedYouWillSkip';
static const applyForVacationRule = 'applyForVacationRule';
static const step1 = 'step1';
static const step2 = 'step2';
static const step3 = 'step3';
static const message = 'message';
static const writeAMessage = 'writeAMessage';
static const notificationReassign = 'notificationReassign';
static const selectEmployee = 'selectEmployee';
static const searchEmployeeForReplacement = 'searchEmployeeForReplacement';
static const searchForEmployee = 'searchForEmployee';
static const pleaseSpecifyEndTime = 'pleaseSpecifyEndTime';
static const pleaseSelectNotificationReassign = 'pleaseSelectNotificationReassign';
static const pleaseSelectEmployeeForReplacement = 'pleaseSelectEmployeeForReplacement';
static const pleaseSelectAction = 'pleaseSelectAction';
static const pleaseSelectDate = 'pleaseSelectDate';
static const profile_reset_password_label = 'profile.reset_password.label'; 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_username = 'profile.reset_password.username';
static const profile_reset_password_password = 'profile.reset_password.password'; static const profile_reset_password_password = 'profile.reset_password.password';

@ -1,7 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:logger/logger.dart'; import 'package:logger/logger.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
@ -24,7 +24,6 @@ var logger = Logger(
Future<void> main() async { Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
await EasyLocalization.ensureInitialized(); await EasyLocalization.ensureInitialized();
await Firebase.initializeApp();
AppState().setPostParamsModel( AppState().setPostParamsModel(
PostParamsModel(channel: 31, versionID: 5.0, mobileType: Platform.isAndroid ? "android" : "ios"), PostParamsModel(channel: 31, versionID: 5.0, mobileType: Platform.isAndroid ? "android" : "ios"),
); );

@ -57,18 +57,19 @@ 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_cols_structions.dart';
import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart';
import 'package:mohem_flutter_app/models/profile/get_address_dff_structure_list.dart'; import 'package:mohem_flutter_app/models/profile/get_address_dff_structure_list.dart';
import 'package:mohem_flutter_app/models/profile/get_contact_clos_structure_list.dart';
import 'package:mohem_flutter_app/models/profile/get_contact_details_list.dart';
import 'package:mohem_flutter_app/models/profile/get_countries_list_model.dart'; import 'package:mohem_flutter_app/models/profile/get_countries_list_model.dart';
import 'package:mohem_flutter_app/models/profile/phone_number_types_model.dart'; import 'package:mohem_flutter_app/models/profile/phone_number_types_model.dart';
import 'package:mohem_flutter_app/models/profile/start_address_approval_process_model.dart'; import 'package:mohem_flutter_app/models/profile/start_address_approval_process_model.dart';
import 'package:mohem_flutter_app/models/profile/submit_address_transaction.dart'; import 'package:mohem_flutter_app/models/profile/submit_address_transaction.dart';
import 'package:mohem_flutter_app/models/profile/get_contact_clos_structure_list.dart';
import 'package:mohem_flutter_app/models/profile/get_contact_details_list.dart';
import 'package:mohem_flutter_app/models/profile/submit_basic_details_transaction_model.dart'; import 'package:mohem_flutter_app/models/profile/submit_basic_details_transaction_model.dart';
import 'package:mohem_flutter_app/models/profile/submit_contact_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/profile/submit_contact_transaction_list_model.dart';
import 'package:mohem_flutter_app/models/start_eit_approval_process_model.dart'; import 'package:mohem_flutter_app/models/start_eit_approval_process_model.dart';
import 'package:mohem_flutter_app/models/start_phone_approval_process_model.dart'; import 'package:mohem_flutter_app/models/start_phone_approval_process_model.dart';
import 'package:mohem_flutter_app/models/submit_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/submit_eit_transaction_list_model.dart';
import 'package:mohem_flutter_app/models/subordinates_on_leaves_model.dart'; import 'package:mohem_flutter_app/models/subordinates_on_leaves_model.dart';
import 'package:mohem_flutter_app/models/vacation_rule/create_vacation_rule_list_model.dart';
import 'package:mohem_flutter_app/models/update_item_type_success_list.dart'; import 'package:mohem_flutter_app/models/update_item_type_success_list.dart';
import 'package:mohem_flutter_app/models/update_user_item_type_list.dart'; import 'package:mohem_flutter_app/models/update_user_item_type_list.dart';
import 'package:mohem_flutter_app/models/vacation_rule/get_item_type_notifications_list_model.dart'; import 'package:mohem_flutter_app/models/vacation_rule/get_item_type_notifications_list_model.dart';
@ -128,7 +129,7 @@ class GenericResponseModel {
String? companyImageURL; String? companyImageURL;
String? companyMainCompany; String? companyMainCompany;
List<GetCountriesListModel>? countryList; List<GetCountriesListModel>? countryList;
String? createVacationRuleList; CreateVacationRuleList? createVacationRuleList;
String? deleteAttachmentList; String? deleteAttachmentList;
String? deleteVacationRuleList; String? deleteVacationRuleList;
String? disableSessionList; String? disableSessionList;
@ -298,7 +299,7 @@ class GenericResponseModel {
String? registerUserNameList; String? registerUserNameList;
List<ReplacementList>? replacementList; List<ReplacementList>? replacementList;
List<RespondAttributesList>? respondAttributesList; List<RespondAttributesList>? respondAttributesList;
String? respondRolesList; List<String>? respondRolesList;
String? resubmitAbsenceTransactionList; String? resubmitAbsenceTransactionList;
String? resubmitEITTransactionList; String? resubmitEITTransactionList;
String? resubmitHrTransactionList; String? resubmitHrTransactionList;
@ -666,7 +667,8 @@ class GenericResponseModel {
countryList!.add(new GetCountriesListModel.fromJson(v)); countryList!.add(new GetCountriesListModel.fromJson(v));
}); });
} }
createVacationRuleList = json['CreateVacationRuleList'];
createVacationRuleList = json['CreateVacationRuleList'] != null ? new CreateVacationRuleList.fromJson(json['CreateVacationRuleList']) : null;
deleteAttachmentList = json['DeleteAttachmentList']; deleteAttachmentList = json['DeleteAttachmentList'];
deleteVacationRuleList = json['DeleteVacationRuleList']; deleteVacationRuleList = json['DeleteVacationRuleList'];
disableSessionList = json['DisableSessionList']; disableSessionList = json['DisableSessionList'];
@ -1178,7 +1180,12 @@ class GenericResponseModel {
respondAttributesList!.add(new RespondAttributesList.fromJson(v)); respondAttributesList!.add(new RespondAttributesList.fromJson(v));
}); });
} }
respondRolesList = json['RespondRolesList']; if (json['RespondRolesList'] != null) {
respondRolesList = <String>[];
json['RespondRolesList'].forEach((v) {
respondRolesList!.add(v);
});
}
resubmitAbsenceTransactionList = json['ResubmitAbsenceTransactionList']; resubmitAbsenceTransactionList = json['ResubmitAbsenceTransactionList'];
resubmitEITTransactionList = json['ResubmitEITTransactionList']; resubmitEITTransactionList = json['ResubmitEITTransactionList'];
resubmitHrTransactionList = json['ResubmitHrTransactionList']; resubmitHrTransactionList = json['ResubmitHrTransactionList'];
@ -1317,7 +1324,10 @@ class GenericResponseModel {
if (this.countryList != null) { if (this.countryList != null) {
data['CountryList'] = this.countryList!.map((v) => v.toJson()).toList(); data['CountryList'] = this.countryList!.map((v) => v.toJson()).toList();
} }
data['CreateVacationRuleList'] = this.createVacationRuleList;
if (this.createVacationRuleList != null) {
data['CreateVacationRuleList'] = this.createVacationRuleList!.toJson();
}
data['DeleteAttachmentList'] = this.deleteAttachmentList; data['DeleteAttachmentList'] = this.deleteAttachmentList;
data['DeleteVacationRuleList'] = this.deleteVacationRuleList; data['DeleteVacationRuleList'] = this.deleteVacationRuleList;
data['DisableSessionList'] = this.disableSessionList; data['DisableSessionList'] = this.disableSessionList;

@ -1,7 +1,3 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart';
class ProfileMenu { class ProfileMenu {
final String name; final String name;
final String icon; final String icon;

@ -0,0 +1,18 @@
class CreateVacationRuleList {
String? pRETURNMSG;
String? pRETURNSTATUS;
CreateVacationRuleList({this.pRETURNMSG, this.pRETURNSTATUS});
CreateVacationRuleList.fromJson(Map<String, dynamic> json) {
pRETURNMSG = json['P_RETURN_MSG'];
pRETURNSTATUS = json['P_RETURN_STATUS'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['P_RETURN_MSG'] = this.pRETURNMSG;
data['P_RETURN_STATUS'] = this.pRETURNSTATUS;
return data;
}
}

@ -1,16 +1,32 @@
import 'dart:io';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/vacation_rule_api_client.dart'; import 'package:mohem_flutter_app/api/vacation_rule_api_client.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/date_uitl.dart';
import 'package:mohem_flutter_app/classes/utils.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/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/vacation_rule/create_vacation_rule_list_model.dart';
import 'package:mohem_flutter_app/models/vacation_rule/get_item_type_notifications_list_model.dart'; import 'package:mohem_flutter_app/models/vacation_rule/get_item_type_notifications_list_model.dart';
import 'package:mohem_flutter_app/models/vacation_rule/get_notification_reassign_mode_list_model.dart'; import 'package:mohem_flutter_app/models/vacation_rule/get_notification_reassign_mode_list_model.dart';
import 'package:mohem_flutter_app/models/vacation_rule/respond_attributes_list_model.dart'; import 'package:mohem_flutter_app/models/vacation_rule/respond_attributes_list_model.dart';
import 'package:mohem_flutter_app/models/vacation_rule/vr_item_types_list_model.dart'; import 'package:mohem_flutter_app/models/vacation_rule/vr_item_types_list_model.dart';
import 'package:mohem_flutter_app/models/vacation_rule/wf_look_up_list_model.dart'; import 'package:mohem_flutter_app/models/vacation_rule/wf_look_up_list_model.dart';
import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.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/bottom_sheets/search_employee_bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart';
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart';
class AddVacationRuleScreen extends StatefulWidget { class AddVacationRuleScreen extends StatefulWidget {
AddVacationRuleScreen({Key? key}) : super(key: key); AddVacationRuleScreen({Key? key}) : super(key: key);
@ -23,13 +39,30 @@ class AddVacationRuleScreen extends StatefulWidget {
class _AddVacationRuleScreenState extends State<AddVacationRuleScreen> { class _AddVacationRuleScreenState extends State<AddVacationRuleScreen> {
List<VrItemTypesList>? vrItemTypesList; List<VrItemTypesList>? vrItemTypesList;
VrItemTypesList? selectedItemType;
List<GetItemTypeNotificationsList>? itemTypeNotificationsList; List<GetItemTypeNotificationsList>? itemTypeNotificationsList;
GetItemTypeNotificationsList? selectedItemTypeNotification;
List<GetNotificationReassignModeList>? notificationReassignModeList; List<GetNotificationReassignModeList>? notificationReassignModeList;
GetNotificationReassignModeList? notificationReassignMode;
List<RespondAttributesList>? respondAttributesList; List<RespondAttributesList>? respondAttributesList;
List<String>? roleList = [];
List<WFLookUpList>? wfLookupList; List<WFLookUpList>? wfLookupList;
ReplacementList? selectedReplacementEmployee;
String varcharInput = "";
String numInput = "";
DateTime? dateInput;
WFLookUpList? wfLook;
int currentStage = 0; int currentStage = 0;
String message = "";
DateTime startTime = DateTime.now();
DateTime? endTime;
@override @override
void initState() { void initState() {
@ -53,7 +86,8 @@ class _AddVacationRuleScreenState extends State<AddVacationRuleScreen> {
void getItemTypeNotificationsList() async { void getItemTypeNotificationsList() async {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
//itemTypeNotificationsList = await VacationRuleApiClient().getItemTypeNotifications(); itemTypeNotificationsList = await VacationRuleApiClient().getItemTypeNotifications(selectedItemType!.iTEMTYPE!);
itemTypeNotificationsList!.insert(0, GetItemTypeNotificationsList(nOTIFICATIONDISPLAYNAME: "All", nOTIFICATIONNAME: "*", fYIFLAG: "N"));
Utils.hideLoading(context); Utils.hideLoading(context);
currentStage = 2; currentStage = 2;
setState(() {}); setState(() {});
@ -67,13 +101,52 @@ class _AddVacationRuleScreenState extends State<AddVacationRuleScreen> {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
List results = await Future.wait([ List results = await Future.wait([
// VacationRuleApiClient().getNotificationReassignMode(), VacationRuleApiClient().getNotificationReassignMode(),
// VacationRuleApiClient().getRespondAttributes("", ""), VacationRuleApiClient().getRespondAttributes(selectedItemType!.iTEMTYPE!, selectedItemTypeNotification!.nOTIFICATIONNAME!),
// VacationRuleApiClient().getWfLookup(P_LOOKUP_TYPE),
]); ]);
notificationReassignModeList = results[0]; notificationReassignModeList = results[0];
respondAttributesList = results[1]; GenericResponseModel respondAttribute = results[1];
wfLookupList = results[2]; respondAttributesList = respondAttribute.respondAttributesList;
if (respondAttributesList?.isNotEmpty ?? false) {
int index = respondAttributesList!.indexWhere((element) => element.aTTRIBUTETYPE == "LOOKUP");
if (index > -1) {
wfLookupList = await VacationRuleApiClient().getWfLookup(respondAttributesList![index].aTTRIBUTEFORMAT!);
}
}
roleList = respondAttribute.respondRolesList;
if (selectedItemType!.iTEMTYPE != "*") {
notificationReassignModeList!.add(
GetNotificationReassignModeList(
rADIOBUTTONLABEL: LocaleKeys.deliverNotificationToMeRegardless.tr(),
rADIOBUTTONACTION: "DELIVER", // ionic: DELIVER
rADIOBUTTONSEQ: 1,
),
);
}
if (selectedItemTypeNotification!.fYIFLAG == "Y") {
notificationReassignModeList!.add(
GetNotificationReassignModeList(
rADIOBUTTONLABEL: LocaleKeys.close.tr(),
rADIOBUTTONACTION: "CLOSE", // ionic: CLOSE
rADIOBUTTONSEQ: 1,
),
);
}
if (respondAttributesList!.isNotEmpty && !(selectedItemTypeNotification!.fYIFLAG == "Y")) {
notificationReassignModeList!.add(
GetNotificationReassignModeList(
rADIOBUTTONLABEL: LocaleKeys.respond.tr(),
rADIOBUTTONACTION: "RESPOND", // ionic: RESPOND
rADIOBUTTONSEQ: 1,
),
);
}
if (notificationReassignModeList!.isNotEmpty) {
notificationReassignMode = notificationReassignModeList!.first;
}
Utils.hideLoading(context); Utils.hideLoading(context);
currentStage = 3; currentStage = 3;
setState(() {}); setState(() {});
@ -83,6 +156,111 @@ class _AddVacationRuleScreenState extends State<AddVacationRuleScreen> {
} }
} }
List<Widget> getDynamicWidgetList() {
List<Widget> respondAttributesWidgetList = [];
for (int i = 0; i < respondAttributesList!.length; i++) {
if (respondAttributesList![i].aTTRIBUTETYPE == "VARCHAR2") {
respondAttributesWidgetList.add(
DynamicTextFieldWidget(respondAttributesList![i].aTTRIBUTEDISPLAYNAME!, respondAttributesList![i].aTTRIBUTENAME!, onChange: (message) {
varcharInput = message;
}).paddingOnly(bottom: 12),
);
} else if (respondAttributesList![i].aTTRIBUTETYPE == "LOOKUP") {
respondAttributesWidgetList.add(
PopupMenuButton(
child: DynamicTextFieldWidget(
respondAttributesList![i].aTTRIBUTEDISPLAYNAME!,
wfLook?.lOOKUPMEANING ?? respondAttributesList![i].aTTRIBUTENAME!,
isEnable: false,
isPopup: true,
).paddingOnly(bottom: 12),
itemBuilder: (_) => <PopupMenuItem<int>>[
for (int i = 0; i < wfLookupList!.length; i++) PopupMenuItem<int>(value: i, child: Text(wfLookupList![i].lOOKUPMEANING!)),
],
onSelected: (int popupIndex) {
wfLook = wfLookupList![popupIndex];
setState(() {});
},
),
);
} else if (respondAttributesList![i].aTTRIBUTETYPE == "DATE") {
respondAttributesWidgetList.add(DynamicTextFieldWidget(
respondAttributesList![i].aTTRIBUTEDISPLAYNAME!,
dateInput?.toString() ?? respondAttributesList![i].aTTRIBUTENAME!,
suffixIconData: Icons.calendar_today,
isEnable: false,
onTap: () async {
dateInput = await _selectDate(context);
setState(() {});
},
).paddingOnly(bottom: 12));
} else if (respondAttributesList![i].aTTRIBUTETYPE == "NUMBER") {
respondAttributesWidgetList.add(
DynamicTextFieldWidget(
respondAttributesList![i].aTTRIBUTEDISPLAYNAME!,
respondAttributesList![i].aTTRIBUTENAME!,
isInputTypeNum: true,
onChange: (input) {
numInput = input;
},
),
);
}
}
return respondAttributesWidgetList;
}
void createVacationRule(List<Map<String, dynamic>> respondAttributeList) async {
try {
Utils.showLoading(context);
CreateVacationRuleList? createVacationRuleList = await VacationRuleApiClient().createVacationRule(DateUtil.convertDateToStringLocation(startTime), DateUtil.convertDateToStringLocation(endTime!),
selectedItemType!.iTEMTYPE!, selectedItemTypeNotification!.nOTIFICATIONNAME!, message, getPAction(), selectedReplacementEmployee!.userName!, respondAttributeList);
Utils.hideLoading(context);
Utils.showToast("Vacation rule added");
Navigator.popUntil(context, ModalRoute.withName(AppRoutes.dashboard));
} catch (ex) {
Utils.hideLoading(context);
Utils.handleException(ex, context, null);
}
}
String getPAction() {
String pAction = "";
switch (notificationReassignMode?.rADIOBUTTONACTION ?? "") {
case 'DELEGATE':
{
pAction = "FORWARD";
break;
}
case 'RESPOND':
{
pAction = "RESPOND";
break;
}
case 'CLOSE':
{
pAction = "RESPOND";
break;
}
case 'DELIVER':
{
pAction = "NOOP";
break;
}
case 'TRANSFER':
{
pAction = "TRANSFER";
break;
}
default:
{
pAction = "";
break;
}
}
return pAction;
}
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
@ -94,7 +272,7 @@ class _AddVacationRuleScreenState extends State<AddVacationRuleScreen> {
backgroundColor: Colors.white, backgroundColor: Colors.white,
appBar: AppBarWidget( appBar: AppBarWidget(
context, context,
title: LocaleKeys.vacationRule.tr(), title: LocaleKeys.vacationType.tr(),
), ),
body: vrItemTypesList == null body: vrItemTypesList == null
? const SizedBox() ? const SizedBox()
@ -105,20 +283,300 @@ class _AddVacationRuleScreenState extends State<AddVacationRuleScreen> {
ListView( ListView(
padding: const EdgeInsets.all(21), padding: const EdgeInsets.all(21),
physics: const BouncingScrollPhysics(), physics: const BouncingScrollPhysics(),
children: [], children: [
if (vrItemTypesList!.isNotEmpty)
PopupMenuButton(
child: DynamicTextFieldWidget(
LocaleKeys.itemType.tr(),
selectedItemType == null ? LocaleKeys.selectType.tr() : selectedItemType!.iTEMTYPEDISPLAYNAME!,
isEnable: false,
isPopup: true,
).paddingOnly(bottom: 12),
itemBuilder: (_) => <PopupMenuItem<int>>[
for (int i = 0; i < vrItemTypesList!.length; i++) PopupMenuItem<int>(value: i, child: Text(vrItemTypesList![i].iTEMTYPEDISPLAYNAME!)),
],
onSelected: (int popupIndex) {
if (selectedItemType == vrItemTypesList![popupIndex]) {
return;
}
selectedItemType = vrItemTypesList![popupIndex];
setState(() {});
if (selectedItemType!.iTEMTYPE == "*") {
selectedItemTypeNotification = GetItemTypeNotificationsList(nOTIFICATIONDISPLAYNAME: "All", nOTIFICATIONNAME: "*", fYIFLAG: "N");
itemTypeNotificationsList = null;
notificationReassignMode = null;
callCombineApis();
} else {
selectedItemTypeNotification = null;
notificationReassignMode = null;
getItemTypeNotificationsList();
}
}).objectContainerView(title: "${LocaleKeys.applyForVacationRule.tr()}\n${LocaleKeys.step1.tr()}", note: LocaleKeys.ifAllSelectedYouWillSkip.tr()),
if ((itemTypeNotificationsList ?? []).isNotEmpty) ...[
12.height,
PopupMenuButton(
child: DynamicTextFieldWidget(
"Notification",
selectedItemTypeNotification == null ? LocaleKeys.selectNotification.tr() : selectedItemTypeNotification!.nOTIFICATIONDISPLAYNAME!,
isEnable: false,
isPopup: true,
).paddingOnly(bottom: 12),
itemBuilder: (_) => <PopupMenuItem<int>>[
for (int i = 0; i < itemTypeNotificationsList!.length; i++) PopupMenuItem<int>(value: i, child: Text(itemTypeNotificationsList![i].nOTIFICATIONDISPLAYNAME!)),
],
onSelected: (int popupIndex) {
if (selectedItemTypeNotification == itemTypeNotificationsList![popupIndex]) {
return;
}
selectedItemTypeNotification = itemTypeNotificationsList![popupIndex];
notificationReassignMode = null;
setState(() {});
callCombineApis();
}).objectContainerView(title: LocaleKeys.step2.tr())
],
if (selectedItemType != null && selectedItemTypeNotification != null && currentStage == 3) ...[
12.height,
Column(
children: [
ItemDetailView(LocaleKeys.itemType.tr(), selectedItemType!.iTEMTYPEDISPLAYNAME!),
ItemDetailView(LocaleKeys.notification.tr(), selectedItemTypeNotification!.nOTIFICATIONDISPLAYNAME!),
12.height,
DynamicTextFieldWidget(
LocaleKeys.startDateT.tr(),
formattedDate(startTime),
suffixIconData: Icons.calendar_today,
isEnable: false,
onTap: () async {
var start = await _selectDateTime(context, startTime);
if (start != startTime) {
startTime = start;
setState(() {});
}
},
),
12.height,
DynamicTextFieldWidget(
LocaleKeys.endDateT.tr(),
formattedDate(endTime),
suffixIconData: Icons.calendar_today,
isEnable: false,
onTap: () async {
var end = await _selectDateTime(context, endTime ?? startTime);
if (end != endTime) {
endTime = end;
setState(() {});
}
},
),
12.height,
DynamicTextFieldWidget(
LocaleKeys.message.tr(),
LocaleKeys.writeAMessage.tr(),
lines: 2,
onChange: (message) {
this.message = message;
},
).paddingOnly(bottom: 12),
ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
padding: EdgeInsets.zero,
itemBuilder: (cxt, index) {
return Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
width: 20,
height: 20,
decoration: BoxDecoration(
color: Colors.transparent,
border: Border.all(color: MyColors.borderColor, width: 1),
borderRadius: const BorderRadius.all(Radius.circular(100)),
),
padding: const EdgeInsets.all(4),
child: Container(
width: double.infinity,
height: double.infinity,
decoration: BoxDecoration(
color: notificationReassignModeList![index] == notificationReassignMode ? MyColors.grey3AColor : Colors.transparent,
borderRadius: BorderRadius.all(const Radius.circular(100)),
),
),
),
9.width,
(notificationReassignModeList![index].rADIOBUTTONLABEL!).toText12(color: MyColors.grey57Color).expanded
],
).onPress(() {
if (notificationReassignMode == notificationReassignModeList![index]) {
return;
}
notificationReassignMode = notificationReassignModeList![index];
setState(() {});
});
},
separatorBuilder: (cxt, index) => 12.height,
itemCount: notificationReassignModeList!.length)
.objectContainerBorderView(title: LocaleKeys.notificationReassign.tr()),
12.height,
if (respondAttributesList?.isNotEmpty ?? false) ...getDynamicWidgetList(),
if (roleList!.isNotEmpty && notificationReassignMode?.rADIOBUTTONACTION == 'RESPOND' ||
// if (notificationReassignMode?.rADIOBUTTONACTION == 'RESPOND' ||
(notificationReassignMode?.rADIOBUTTONACTION == 'DELEGATE') ||
(notificationReassignMode?.rADIOBUTTONACTION == 'TRANSFER'))
DynamicTextFieldWidget(
LocaleKeys.selectEmployee.tr(),
selectedReplacementEmployee == null ? LocaleKeys.searchEmployeeForReplacement.tr() : selectedReplacementEmployee!.employeeDisplayName ?? "",
isEnable: false,
onTap: () {
showMyBottomSheet(
context,
child: SearchEmployeeBottomSheet(
title: LocaleKeys.searchForEmployee.tr(),
apiMode: LocaleKeys.delegate.tr(),
onSelectEmployee: (_selectedEmployee) {
// Navigator.pop(context);
selectedReplacementEmployee = _selectedEmployee;
setState(() {});
},
),
);
},
).paddingOnly(bottom: 12),
],
).objectContainerView(title: LocaleKeys.step3.tr())
]
],
).expanded, ).expanded,
DefaultButton( DefaultButton(
currentStage == 3 ? LocaleKeys.apply.tr() : LocaleKeys.next.tr(), LocaleKeys.apply.tr(),
() { currentStage != 3
if (currentStage == 1) { ? null
getItemTypeNotificationsList(); : () {
} else if (currentStage == 2) { if (endTime == null) {
callCombineApis(); Utils.showToast(LocaleKeys.pleaseSpecifyEndTime.tr());
} return;
}, } else if (notificationReassignMode == null) {
Utils.showToast(LocaleKeys.pleaseSelectNotificationReassign.tr());
return;
} else if (selectedReplacementEmployee == null) {
Utils.showToast(LocaleKeys.pleaseSelectEmployeeForReplacement.tr());
return;
}
List<Map<String, dynamic>> list = [];
if (respondAttributesList?.isNotEmpty ?? false) {
for (int i = 0; i < respondAttributesList!.length; i++) {
if (respondAttributesList![i].aTTRIBUTETYPE == "VARCHAR2") {
list.add({"ATTRIBUTE_NAME": respondAttributesList![i].aTTRIBUTENAME, "ATTRIBUTE_TEXT_VALUE": varcharInput});
}
if (respondAttributesList![i].aTTRIBUTETYPE == "LOOKUP") {
if (wfLook == null) {
Utils.showToast(LocaleKeys.pleaseSelectAction.tr());
break;
}
list.add({"ATTRIBUTE_NAME": respondAttributesList![i].aTTRIBUTENAME, "ATTRIBUTE_TEXT_VALUE": wfLook!.lOOKUPCODE});
}
if (respondAttributesList![i].aTTRIBUTETYPE == "DATE") {
if (dateInput == null) {
Utils.showToast(LocaleKeys.pleaseSelectDate.tr());
break;
}
list.add({"ATTRIBUTE_NAME": respondAttributesList![i].aTTRIBUTENAME, "ATTRIBUTE_TEXT_VALUE": DateUtil.convertDateToStringLocation(dateInput!)});
}
if (respondAttributesList![i].aTTRIBUTETYPE == "NUMBER") {
list.add({"ATTRIBUTE_NAME": respondAttributesList![i].aTTRIBUTENAME, "ATTRIBUTE_TEXT_VALUE": numInput});
}
}
}
showDialog(
context: context,
builder: (cxt) => ConfirmDialog(
message: LocaleKeys.areYouSureYouWantToSubmit.tr(),
onTap: () {
Navigator.pop(context);
createVacationRule(list);
},
),
);
},
).insideContainer, ).insideContainer,
], ],
)), )),
); );
} }
Future<DateTime> _selectDateTime(BuildContext context, DateTime _time) async {
DateTime time = _time;
if (Platform.isIOS) {
await showCupertinoModalPopup(
context: context,
builder: (cxt) => Container(
height: 250,
color: Colors.white,
child: CupertinoDatePicker(
backgroundColor: Colors.white,
mode: CupertinoDatePickerMode.dateAndTime,
onDateTimeChanged: (value) {
if (value != _time) {
time = value;
}
},
initialDateTime: _time,
),
),
);
} else {
final DateTime? picked = await showDatePicker(context: context, initialDate: _time, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101));
final TimeOfDay? timePicked = await showTimePicker(
context: context,
initialTime: TimeOfDay.fromDateTime(picked!),
);
if (picked != _time || timePicked != TimeOfDay.fromDateTime(picked)) {
time = picked;
time = time.add(
Duration(
hours: timePicked!.hour,
minutes: timePicked.minute,
),
);
}
}
return time;
}
String formattedDate(DateTime? _time) {
if (_time == null) return "Select date and time";
return DateFormat("MM/dd/yyyy hh:mm:ss a").format(_time);
}
Future<DateTime> _selectDate(BuildContext context) async {
DateTime time = dateInput ?? DateTime.now();
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 != dateInput) {
time = value;
}
},
initialDateTime: dateInput,
),
),
);
} else {
final DateTime? picked =
await showDatePicker(context: context, initialDate: dateInput ?? DateTime.now(), initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101));
if (picked != null && picked != dateInput) {
time = picked;
}
}
time = DateTime(time.year, time.month, time.day);
return time;
}
} }

@ -140,7 +140,7 @@ class _VacationRuleScreenState extends State<VacationRuleScreen> {
} }
String getParsedTime(String time) { String getParsedTime(String time) {
DateTime date = DateFormat("mm/dd/yyyy").parse(time); DateTime date = DateFormat("MM/dd/yyyy").parse(time);
return DateFormat("d MMM yyyy").format(date); return DateFormat("d MMM yyyy").format(date);
} }
} }

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:easy_localization/src/public_ext.dart'; import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -324,7 +326,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
child: AppDrawer(), child: AppDrawer(),
), ),
bottomNavigationBar: SizedBox( bottomNavigationBar: SizedBox(
height: 70, height: Platform.isAndroid ? 70 : 100,
child: BottomNavigationBar( child: BottomNavigationBar(
items: <BottomNavigationBarItem>[ items: <BottomNavigationBarItem>[
BottomNavigationBarItem( BottomNavigationBarItem(

@ -9,6 +9,7 @@ import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.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/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart';
import 'package:mohem_flutter_app/ui/my_attendance/services_menu_list_screen.dart';
import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart'; import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -126,7 +127,7 @@ class ServicesWidget extends StatelessWidget {
Navigator.pushNamed(context, AppRoutes.monthlyPaySlip); Navigator.pushNamed(context, AppRoutes.monthlyPaySlip);
} }
} else { } else {
Navigator.pushNamed(context, AppRoutes.myAttendance, arguments: menuList); Navigator.pushNamed(context, AppRoutes.servicesMenuListScreen, arguments: ServicesMenuListScreenParams(menuEntry.prompt!, menuList));
} }
return; return;
} }

@ -2,6 +2,7 @@ import 'dart:io';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:easy_localization/src/public_ext.dart'; import 'package:easy_localization/src/public_ext.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -23,7 +24,6 @@ import 'package:mohem_flutter_app/models/member_login_list_model.dart';
import 'package:mohem_flutter_app/models/privilege_list_model.dart'; import 'package:mohem_flutter_app/models/privilege_list_model.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/input_widget.dart'; import 'package:mohem_flutter_app/widgets/input_widget.dart';
import 'package:shared_preferences/shared_preferences.dart';
class LoginScreen extends StatefulWidget { class LoginScreen extends StatefulWidget {
LoginScreen({Key? key}) : super(key: key); LoginScreen({Key? key}) : super(key: key);
@ -41,7 +41,7 @@ class _LoginScreenState extends State<LoginScreen> {
CheckMobileAppVersionModel? _checkMobileAppVersion; CheckMobileAppVersionModel? _checkMobileAppVersion;
MemberLoginListModel? _memberLoginList; MemberLoginListModel? _memberLoginList;
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance; late final FirebaseMessaging _firebaseMessaging;
bool _autoLogin = false; bool _autoLogin = false;
@ -75,6 +75,8 @@ class _LoginScreenState extends State<LoginScreen> {
Future<void> checkFirebaseToken() async { Future<void> checkFirebaseToken() async {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
await Firebase.initializeApp();
_firebaseMessaging = FirebaseMessaging.instance;
firebaseToken = await _firebaseMessaging.getToken(); firebaseToken = await _firebaseMessaging.getToken();
loginInfo = await LoginApiClient().getMobileLoginInfoNEW(firebaseToken ?? "", Platform.isAndroid ? "android" : "ios"); loginInfo = await LoginApiClient().getMobileLoginInfoNEW(firebaseToken ?? "", Platform.isAndroid ? "android" : "ios");
if (loginInfo == null) { if (loginInfo == null) {
@ -88,7 +90,7 @@ class _LoginScreenState extends State<LoginScreen> {
} }
} catch (ex) { } catch (ex) {
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.handleException(ex, context, null); Utils.handleException(ex, context, (errorMsg){});
} }
} }

@ -176,7 +176,6 @@ class _DynamicInputScreenState extends State<DynamicInputScreen> {
List<Map<String, dynamic>> getDefaultValuesIonicLogic(GetEITDFFStructureList structureElement) { List<Map<String, dynamic>> getDefaultValuesIonicLogic(GetEITDFFStructureList structureElement) {
try { try {
Utils.showLoading(context);
List<PARENTSEGMENTSVSSplitedVS> parentValue = structureElement.pARENTSEGMENTSVSSplitedVS ?? []; List<PARENTSEGMENTSVSSplitedVS> parentValue = structureElement.pARENTSEGMENTSVSSplitedVS ?? [];
List<PARENTSEGMENTSDVSplited> parentsList = structureElement.pARENTSEGMENTSDVSplited ?? []; List<PARENTSEGMENTSDVSplited> parentsList = structureElement.pARENTSEGMENTSDVSplited ?? [];
@ -718,7 +717,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreen> {
Future<DateTime> _selectDate(BuildContext context) async { Future<DateTime> _selectDate(BuildContext context) async {
DateTime time = selectedDate; DateTime time = selectedDate;
if (!Platform.isIOS) { if (Platform.isIOS) {
await showCupertinoModalPopup( await showCupertinoModalPopup(
context: context, context: context,
builder: (cxt) => Container( builder: (cxt) => Container(
@ -749,7 +748,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreen> {
Future<TimeOfDay> _selectTime(BuildContext context) async { Future<TimeOfDay> _selectTime(BuildContext context) async {
TimeOfDay time = TimeOfDay(hour: selectedDate.hour, minute: selectedDate.minute); TimeOfDay time = TimeOfDay(hour: selectedDate.hour, minute: selectedDate.minute);
if (!Platform.isIOS) { if (Platform.isIOS) {
await showCupertinoModalPopup( await showCupertinoModalPopup(
context: context, context: context,
builder: (cxt) => Container( builder: (cxt) => Container(

@ -1,57 +0,0 @@
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 {
List<GetMenuEntriesList> list;
MyAttendanceScreen({Key? key, this.list = const <GetMenuEntriesList>[]}) : super(key: key);
@override
Widget build(BuildContext context) {
list = ModalRoute.of(context)!.settings.arguments as List<GetMenuEntriesList>;
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBarWidget(
context,
title: LocaleKeys.myAttendance.tr(),
),
body: SizedBox(
width: double.infinity,
height: double.infinity,
child: list.isEmpty
? Utils.getNoDataWidget(context)
: ListView.separated(
padding: const EdgeInsets.all(21),
itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", list[index].prompt!).onPress(() {
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(list[index].prompt!, list[index].functionName!));
}),
separatorBuilder: (cxt, index) => 12.height,
itemCount: list.length),
),
);
}
Widget itemView(String icon, String title) {
return Row(
children: [
(title).toText16().expanded,
12.width,
SvgPicture.asset(
"assets/images/arrow_next.svg",
color: MyColors.darkIconColor,
)
],
).objectContainerView();
}
}

@ -0,0 +1,76 @@
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/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 ServicesMenuListScreenParams {
final String title;
final List<GetMenuEntriesList> list;
ServicesMenuListScreenParams(this.title, this.list);
}
class ServicesMenuListScreen extends StatelessWidget {
late ServicesMenuListScreenParams servicesMenuData;
ServicesMenuListScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
servicesMenuData = ModalRoute.of(context)!.settings.arguments as ServicesMenuListScreenParams;
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBarWidget(
context,
title: servicesMenuData.title,
),
body: SizedBox(
width: double.infinity,
height: double.infinity,
child: servicesMenuData.list.isEmpty
? Utils.getNoDataWidget(context)
: ListView.separated(
padding: const EdgeInsets.all(21),
itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", servicesMenuData.list[index].prompt!).onPress(() {
if (servicesMenuData.list[index].parentMenuName == "MBL_PERINFO_SS") {
if (servicesMenuData.list[index].requestType == "BASIC_DETAILS") {
Navigator.pushNamed(context, AppRoutes.basicDetails);
} else if (servicesMenuData.list[index].requestType == "PHONE_NUMBERS") {
Navigator.pushNamed(context, AppRoutes.personalInfo);
} else if (servicesMenuData.list[index].requestType == "ADDRESS") {
Navigator.pushNamed(context, AppRoutes.contactDetails);
} else if (servicesMenuData.list[index].requestType == "CONTACT") {
Navigator.pushNamed(context, AppRoutes.familyMembers);
}
return;
}
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(servicesMenuData.list[index].prompt!, servicesMenuData.list[index].functionName!));
}),
separatorBuilder: (cxt, index) => 12.height,
itemCount: servicesMenuData.list.length),
),
);
}
Widget itemView(String icon, String title) {
return Row(
children: [
(title).toText16().expanded,
12.width,
SvgPicture.asset(
"assets/images/arrow_next.svg",
color: MyColors.darkIconColor,
)
],
).objectContainerView();
}
}

@ -13,7 +13,7 @@ import 'package:mohem_flutter_app/models/get_employee_phones_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_address_screen.dart'; import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_address_screen.dart';
import 'package:mohem_flutter_app/ui/profile/phone_numbers.dart'; import 'package:mohem_flutter_app/ui/profile/phone_numbers.dart';
import 'package:mohem_flutter_app/ui/screens/profile/profile_screen.dart'; import 'package:mohem_flutter_app/ui/profile/profile_screen.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.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/default_button.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';

@ -10,7 +10,7 @@ import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart';
import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart'; import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart';
import 'package:mohem_flutter_app/ui/screens/profile/profile_screen.dart'; import 'package:mohem_flutter_app/ui/profile/profile_screen.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.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/default_button.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';

@ -2,114 +2,48 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/app_state/app_state.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/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/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/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart';
import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
class PesonalInfo extends StatefulWidget { class PersonalInfo extends StatelessWidget {
const PesonalInfo({Key? key}) : super(key: key); PersonalInfo({Key? key}) : super(key: key);
@override MemberInformationListModel memberInformationList = AppState().memberInformationList!;
_PesonalInfoState createState() => _PesonalInfoState();
}
class _PesonalInfoState extends State<PesonalInfo> {
String? fullName = "";
String? maritalStatus = "";
String? birthDate = "";
String? civilIdentityNumber = "";
String? emailAddress = "";
String? employeeNo = "";
// List<GetEmployeeBasicDetailsList> getEmployeeBasicDetailsList = [];
// MemberInformationListModel? _memberInformationList;
late MemberInformationListModel memberInformationList;
List<GetEmployeeBasicDetailsList> getEmployeeBasicDetailsList = [];
@override
void initState() {
super.initState();
memberInformationList = AppState().memberInformationList!;
}
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBarWidget( appBar: AppBarWidget(
context, context,
title: LocaleKeys.profile_personalInformation.tr(), title: LocaleKeys.profile_personalInformation.tr(),
), ),
backgroundColor: MyColors.backgroundColor, backgroundColor: MyColors.backgroundColor,
// bottomSheet:footer(), body: SizedBox(
body: Column( width: MediaQuery.of(context).size.width,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [ children: [
Container( LocaleKeys.category.tr().toText13(color: MyColors.lightGrayColor),
width: double.infinity, (memberInformationList.eMPLOYMENTCATEGORYMEANING ?? "").toText16(),
margin: EdgeInsets.only( 20.height,
top: 28, LocaleKeys.address.tr().toText13(color: MyColors.lightGrayColor),
left: 26, (memberInformationList.lOCATIONNAME ?? "").toText16(),
right: 26, 20.height,
), LocaleKeys.phoneNumber.tr().toText13(color: MyColors.lightGrayColor),
padding: EdgeInsets.only(left: 14, right: 14, top: 13, bottom: 20), (memberInformationList.eMPLOYEEMOBILENUMBER ?? "").toText16(),
height: 350, 20.height,
decoration: BoxDecoration( LocaleKeys.businessGroup.tr().toText13(color: MyColors.lightGrayColor),
boxShadow: [ (memberInformationList.bUSINESSGROUPNAME ?? "").toText16(),
BoxShadow( 20.height,
color: Colors.grey.withOpacity(0.5), LocaleKeys.Payroll.tr().toText13(color: MyColors.lightGrayColor),
spreadRadius: 5, (memberInformationList.pAYROLLNAME ?? "").toText16(),
blurRadius: 26,
offset: Offset(0, 3),
),
],
color: Colors.white,
borderRadius: BorderRadius.circular(10.0),
),
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
LocaleKeys.category.tr().toText13(color: MyColors.lightGrayColor),
"${memberInformationList!.eMPLOYMENTCATEGORYMEANING}".toText16(isBold: true, color: MyColors.blackColor),
SizedBox(
height: 20,
),
LocaleKeys.address.tr().toText13(color: MyColors.lightGrayColor),
"${memberInformationList!.lOCATIONNAME}".toText16(isBold: true, color: MyColors.blackColor),
SizedBox(
height: 20,
),
LocaleKeys.phoneNumber.tr().toText13(color: MyColors.lightGrayColor),
"${memberInformationList!.eMPLOYEEMOBILENUMBER}".toText16(isBold: true, color: MyColors.blackColor),
SizedBox(
height: 20,
),
LocaleKeys.businessGroup.tr().toText13(color: MyColors.lightGrayColor),
"${memberInformationList!.bUSINESSGROUPNAME}".toText16(isBold: true, color: MyColors.blackColor),
SizedBox(
height: 20,
),
LocaleKeys.Payroll.tr().toText13(color: MyColors.lightGrayColor),
"${memberInformationList!.pAYROLLNAME}".toText16(isBold: true, color: MyColors.blackColor),
]),
),
], ],
)); ).objectContainerView().paddingAll(21),
}
Widget footer() {
return Container(
decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(10),
color: MyColors.white,
boxShadow: [
BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3),
],
), ),
child: DefaultButton(
LocaleKeys.update.tr(),
() async {},
).insideContainer,
); );
} }
} }

@ -1,19 +1,20 @@
import 'dart:ui';
import 'dart:convert'; import 'dart:convert';
import 'dart:ui'; import 'dart:ui';
import 'package:easy_localization/easy_localization.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:mohem_flutter_app/api/profile_api_client.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/utils.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/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_basic_details.model.dart';
import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart';
import 'package:mohem_flutter_app/ui/screens/profile/widgets/header.dart'; import 'package:mohem_flutter_app/ui/profile/widgets/profile_panel.dart';
import 'package:mohem_flutter_app/ui/screens/profile/widgets/profile_panel.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheet.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 // todo '@sultan' kindly follow structure of code written. use extension methods for widgets and dont hard code strings, use localizations
@ -40,17 +41,24 @@ class _ProfileScreenState extends State<ProfileScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
extendBody: true, extendBody: true,
backgroundColor: const Color(0xffefefef), backgroundColor: const Color(0xffefefef),
body: Stack(children: [ body: Stack(
children: [
Container( Container(
height: 300, height: 300,
margin: EdgeInsets.only(top: 50), margin: const EdgeInsets.only(top: 50),
decoration: BoxDecoration(image: DecorationImage(image: MemoryImage(Utils.getPostBytes(memberInformationList.eMPLOYEEIMAGE)), fit: BoxFit.cover)), decoration: BoxDecoration(
child: new BackdropFilter( image: DecorationImage(
filter: new ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), image: MemoryImage(
child: new Container( Utils.getPostBytes(memberInformationList.eMPLOYEEIMAGE),
decoration: new BoxDecoration(color: Colors.white.withOpacity(0.0)), ),
fit: BoxFit.cover),
),
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
child: Container(
color: Colors.white.withOpacity(0.0),
), ),
), ),
), ),
@ -59,50 +67,46 @@ class _ProfileScreenState extends State<ProfileScreen> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
SizedBox( Row(
height: 80, mainAxisAlignment: MainAxisAlignment.spaceBetween,
), children: [
Container( IconButton(
padding: EdgeInsets.only(left: 15, right: 15), onPressed: () {
child: Row( Navigator.pop(context);
mainAxisAlignment: MainAxisAlignment.spaceBetween, },
children: [ icon: const Icon(
IconButton( Icons.arrow_back_ios,
onPressed: () { color: Colors.white,
Navigator.pop(context);
},
icon: Icon(
Icons.arrow_back_ios,
color: Colors.white,
),
), ),
InkWell( ),
onTap: () { InkWell(
startImageSheet(); onTap: () {
}, startImageSheet();
child: Container( },
padding: EdgeInsets.only(left: 10, right: 10, top: 5, bottom: 5), child: Container(
decoration: BoxDecoration(borderRadius: BorderRadius.circular(15), color: Colors.black.withOpacity(.3)), padding: const EdgeInsets.only(left: 17, right: 17, top: 8, bottom: 8),
child: Row( decoration: BoxDecoration(
children: [ borderRadius: BorderRadius.circular(30),
Icon(Icons.photo, color: Colors.white), color: Colors.black.withOpacity(.21),
Text( ),
'Edit', child: Row(
style: TextStyle(color: Colors.white, fontSize: 12), children: [
) const Icon(Icons.photo, color: Colors.white, size: 16),
], 4.width,
), LocaleKeys.edit.tr().toText12(color: Colors.white),
],
), ),
), ),
], ),
), ],
), ).paddingOnly(left: 16, right: 16, top: 80),
HeaderPanel(memberInformationList), ProfilePanel(memberInformationList)
ProfilePanle(memberInformationList)
], ],
), ),
) )
])); ],
),
);
} }
void startImageSheet() { void startImageSheet() {

@ -0,0 +1,108 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.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/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/member_information_list_model.dart';
import 'package:mohem_flutter_app/models/profile_menu.model.dart';
class ProfileInFo extends StatelessWidget {
MemberInformationListModel memberInfo;
ProfileInFo(this.memberInfo, {Key? key}) : super(key: key);
List<ProfileMenu> menu = [
ProfileMenu(name: LocaleKeys.profile_personalInformation.tr(), icon: 'personal-info.svg', route: AppRoutes.personalInfo),
ProfileMenu(name: LocaleKeys.profile_basicDetails.tr(), icon: 'basic-details.svg', route: AppRoutes.basicDetails),
ProfileMenu(name: LocaleKeys.profile_contactDetails.tr(), icon: 'contact-details.svg', route: AppRoutes.contactDetails),
ProfileMenu(name: LocaleKeys.profile_familyDetails.tr(), icon: 'family-members.svg', route: AppRoutes.familyMembers),
];
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
16.height,
memberInfo.eMPLOYEENAME!.toText22(),
("${memberInfo.eMPLOYEENUMBER!} | ${memberInfo.jOBNAME!}").toText13(color: MyColors.grey80Color),
memberInfo.eMPLOYEEEMAILADDRESS!.toText13(),
12.height,
const Divider(height: 8, thickness: 8, color: MyColors.lightGreyEFColor),
12.height,
LocaleKeys.completingYear.tr().toText11(),
Row(children: [
appreciationTime(LocaleKeys.year.tr(), memberInfo.sERVICEYEARS.toString()),
appreciationTime(LocaleKeys.month.tr(), memberInfo.sERVICEMONTHS.toString()),
appreciationTime(LocaleKeys.day.tr(), memberInfo.sERVICEDAYS.toString()),
]).paddingOnly(bottom: 12, top: 12),
const Divider(height: 8, thickness: 8, color: MyColors.lightGreyEFColor),
Column(
// mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
(LocaleKeys.profile_profileCompletionPer.tr() + ' 75%').toText16(),
8.height,
Row(
children: [
for (var i = 0; i < 4; i++)
if (i < 3) Expanded(child: drawSlider(Color(0xff2BB8A6))) else Expanded(child: drawSlider(const Color(0xffefefef)))
],
),
14.height,
LocaleKeys.profile_completeProfile.tr().toText16(color: MyColors.textMixColor, isUnderLine: true),
],
).paddingOnly(left: 21, right: 21, bottom: 18, top: 12),
const Divider(height: 8, thickness: 8, color: MyColors.lightGreyEFColor),
ListView.separated(
padding: EdgeInsets.zero,
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (cxt, index) => Row(
children: [
SvgPicture.asset('assets/images/' + menu[index].icon, width: 20, height: 20),
16.width,
menu[index].name.toText16().expanded,
16.width,
const Icon(Icons.arrow_forward, color: MyColors.darkIconColor)
],
).onPress(() {
Navigator.pushNamed(context, menu[index].route);
}).paddingOnly(left: 21, right: 21, top: 21),
separatorBuilder: (cxt, index) => 12.height,
itemCount: menu.length),
],
);
}
Widget drawSlider(color) {
return Row(children: [
Expanded(
flex: 1,
child: ClipRRect(
borderRadius: BorderRadius.circular(10),
child: Container(
height: 6,
width: 20,
color: color,
),
)),
Container(height: 6, width: 3, color: Colors.white),
]);
}
Widget appreciationTime(String title, String value) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
title.toText13(color: MyColors.grey80Color),
value.padLeft(2, '0').toText20(color: MyColors.textMixColor),
],
).expanded;
}
}

@ -0,0 +1,49 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/models/member_information_list_model.dart';
import 'package:mohem_flutter_app/ui/profile/widgets/profile_info.dart';
class ProfilePanel extends StatelessWidget {
ProfilePanel(this.memberInformationList);
late MemberInformationListModel memberInformationList;
@override
Widget build(BuildContext context) {
return SizedBox(
height: MediaQuery.of(context).size.height,
child: Stack(
children: [
Container(
margin: const EdgeInsets.only(top: 32),
padding: const EdgeInsets.only(top: 37),
decoration: BoxDecoration(
color: Colors.white,
// border: Border.all(color: MyColors.lightGreyEFColor, width: 1),
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(25),
topRight: Radius.circular(25),
),
boxShadow: [
BoxShadow(
color: const Color(0xff000000).withOpacity(.1),
blurRadius: 26,
offset: const Offset(0, -3),
),
],
),
child: ProfileInFo(memberInformationList),
),
Container(height: 68, alignment: Alignment.center, child: profileImage())
],
),
);
}
Widget profileImage() => CircleAvatar(
radius: 68,
backgroundImage: MemoryImage(Utils.getPostBytes(memberInformationList.eMPLOYEEIMAGE)),
backgroundColor: Colors.black,
);
}

@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_html/flutter_html.dart'; import 'package:flutter_html/flutter_html.dart';
import 'package:mohem_flutter_app/api/pending_transactions_api_client.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/classes/utils.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/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/get_announcement_details.dart'; import 'package:mohem_flutter_app/models/get_announcement_details.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
@ -37,47 +38,30 @@ class _AnnouncementDetailsState extends State<AnnouncementDetails> {
context, context,
title: LocaleKeys.announcements.tr(), title: LocaleKeys.announcements.tr(),
), ),
body: SingleChildScrollView( body: getAnnouncementDetailsObj == null
child: Container( ? const SizedBox()
width: double.infinity, : SingleChildScrollView(
padding: const EdgeInsets.all(10.0), child: Column(
margin: const EdgeInsets.all(12.0), crossAxisAlignment: CrossAxisAlignment.start,
decoration: BoxDecoration( mainAxisSize: MainAxisSize.min,
color: Colors.white, children: [
borderRadius: BorderRadius.circular(10), SizedBox(
boxShadow: [ width: double.infinity,
BoxShadow( height: 150.0,
color: const Color(0xff000000).withOpacity(.05), child: ClipRRect(
blurRadius: 26, borderRadius: BorderRadius.circular(10),
offset: const Offset(0, -3), child: Image.memory(
), base64Decode(Utils.getBase64FromJpeg(getAnnouncementDetailsObj?.bannerImage)),
], fit: BoxFit.cover,
), ),
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,
), ),
), Html(
), data: getAnnouncementDetailsObj?.bodyEN,
Container( ).paddingOnly(top: 12),
margin: const EdgeInsets.only(top: 12.0), ],
child: Html( ).objectContainerView().paddingAll(21),
data: getAnnouncementDetailsObj?.bodyEN, ),
),
),
],
),
),
),
); );
} }

@ -9,6 +9,7 @@ import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/int_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/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/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/get_announcements.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/app_bar_widget.dart';
@ -44,18 +45,15 @@ class _AnnouncementsState extends State<Announcements> {
context, context,
title: LocaleKeys.announcements.tr(), title: LocaleKeys.announcements.tr(),
), ),
body: getAnnouncementsObject.isNotEmpty body: jsonResponse.isEmpty
? Container( ? const SizedBox()
margin: const EdgeInsets.only(top: 10.0), : getAnnouncementsObject.isNotEmpty
child: Column( ? Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
12.height, DynamicTextFieldWidget(
Container( LocaleKeys.search.tr(),
margin: const EdgeInsets.fromLTRB(12.0, 0.0, 12.0, 0.0),
child: DynamicTextFieldWidget(
"Search",
LocaleKeys.searchAnnouncements.tr(), LocaleKeys.searchAnnouncements.tr(),
isEnable: true, isEnable: true,
suffixIconData: Icons.search, suffixIconData: Icons.search,
@ -66,72 +64,52 @@ class _AnnouncementsState extends State<Announcements> {
onChange: (String value) { onChange: (String value) {
_runFilter(value); _runFilter(value);
}, },
), ).paddingOnly(left: 21, right: 21),
), ListView.separated(
12.height, physics: const BouncingScrollPhysics(),
Expanded( shrinkWrap: true,
child: ListView.separated( padding: EdgeInsets.all(21),
physics: const BouncingScrollPhysics(), itemBuilder: (BuildContext context, int index) {
shrinkWrap: true, return InkWell(
itemBuilder: (BuildContext context, int index) { onTap: () {
return InkWell( openAnnouncementsDetails(int.parse(_foundAnnouncements[index].rowID!));
onTap: () { },
openAnnouncementsDetails(int.parse(_foundAnnouncements[index].rowID!)); child: Row(
}, crossAxisAlignment: CrossAxisAlignment.start,
child: Container( mainAxisAlignment: MainAxisAlignment.start,
width: double.infinity, children: [
padding: const EdgeInsets.all(10.0), SizedBox(
margin: const EdgeInsets.only(left: 12, right: 12, top: 10), width: 80.0,
decoration: BoxDecoration( child: AspectRatio(
color: Colors.white, aspectRatio: 1 / 1,
borderRadius: BorderRadius.circular(10), child: ClipRRect(
boxShadow: [ borderRadius: BorderRadius.circular(10),
BoxShadow( child: Image.memory(
color: const Color(0xff000000).withOpacity(.05), base64Decode(Utils.getBase64FromJpeg(_foundAnnouncements[index].bannerImage)),
blurRadius: 26, fit: BoxFit.cover,
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)
],
),
), ),
], ),
), ),
), ),
); 12.width,
}, Column(
separatorBuilder: (BuildContext context, int index) => 1.height, crossAxisAlignment: CrossAxisAlignment.start,
itemCount: _foundAnnouncements.length ?? 0)) children: [
], (AppState().isArabic(context) ? _foundAnnouncements[index].titleAR! : getAnnouncementsObject[index].titleEN!).toText13(),
), 8.height,
) _foundAnnouncements[index].created!.toText10(color: MyColors.grey98Color)
: Utils.getNoDataWidget(context), ],
).expanded,
],
).objectContainerView(),
);
},
separatorBuilder: (BuildContext context, int index) => 12.height,
itemCount: _foundAnnouncements.length,
).expanded
],
)
: Utils.getNoDataWidget(context),
); );
} }
@ -151,6 +129,8 @@ class _AnnouncementsState extends State<Announcements> {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
jsonResponse = await PendingTransactionsApiClient().getAnnouncements(itgAwarenessID, currentPageNo, itgRowID); 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']); var jsonDecodedData = jsonDecode(jsonDecode(jsonResponse)['result']['data']);
for (int i = 0; i < jsonDecodedData.length; i++) { for (int i = 0; i < jsonDecodedData.length; i++) {
getAnnouncementsObject.add(GetAnnouncementsObject.fromJson(jsonDecodedData[i])); getAnnouncementsObject.add(GetAnnouncementsObject.fromJson(jsonDecodedData[i]));

@ -1,160 +0,0 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart';
import 'package:mohem_flutter_app/models/member_information_list_model.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:mohem_flutter_app/models/profile_menu.model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_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';
import 'package:provider/provider.dart';
// todo '@sultan' kindly follow structure of code written. use extension methods for widgets, also format code
class ProfileInFo extends StatefulWidget {
ProfileInFo(this.memberInfo);
MemberInformationListModel memberInfo;
@override
State<ProfileInFo> createState() => _ProfileInFoState();
}
class _ProfileInFoState extends State<ProfileInFo> {
static List<GetMenuEntriesList> menuData = [];
String data = '.';
double sliderValue = 75;
List<ProfileMenu> menu = [
ProfileMenu(name: LocaleKeys.profile_personalInformation.tr(), icon: 'personal-info.svg', route: AppRoutes.personalInfo, dynamicUrl: '', menuEntries: getMenuEntries('')),
ProfileMenu(name: LocaleKeys.profile_basicDetails.tr(), icon: 'basic-details.svg', route: AppRoutes.basicDetails, menuEntries: getMenuEntries('BASIC_DETAILS')),
ProfileMenu(name: LocaleKeys.profile_contactDetails.tr(), icon: 'contact-details.svg', route: AppRoutes.contactDetails, dynamicUrl: '', menuEntries: getMenuEntries('ADDRESS')),
ProfileMenu(name: LocaleKeys.profile_familyDetails.tr(), icon: 'family-members.svg', route: AppRoutes.familyMembers, dynamicUrl: '', menuEntries: getMenuEntries('CONTACT')),
];
@override
void setState(VoidCallback fn) {
super.setState(fn);
}
@override
Widget build(BuildContext context) {
return Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
/// card header
customLabel(widget.memberInfo.eMPLOYEENAME.toString(), 22, Colors.black, true),
customLabel(widget.memberInfo.eMPLOYEENUMBER.toString() + ' | ' + widget.memberInfo.jOBNAME.toString(), 14, Colors.grey, false),
customLabel(widget.memberInfo.eMPLOYEEEMAILADDRESS.toString(), 13, Colors.black, true),
Divider(height: 40, thickness: 8, color: const Color(0xffefefef)),
customLabel(LocaleKeys.completingYear.tr(), 10, Colors.black, true),
SizedBox(height: 10),
Container(
child: Row(mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [
Column(
children: [customLabel(LocaleKeys.year.tr(), 14, const Color(0xff808080), true), customLabel(widget.memberInfo.sERVICEYEARS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)],
),
Column(
children: [customLabel(LocaleKeys.month.tr(), 14, const Color(0xff808080), true), customLabel(widget.memberInfo.sERVICEMONTHS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)],
),
Column(
children: [customLabel(LocaleKeys.day.tr(), 14, const Color(0xff808080), true), customLabel(widget.memberInfo.sERVICEDAYS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)],
)
])),
Divider(height: 40, thickness: 8, color: const Color(0xffefefef)),
Container(
padding: EdgeInsets.only(
left: 20,
right: 20,
),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
customLabel(LocaleKeys.profile_profileCompletionPer.tr() + ' 75%', 18, Colors.black, true),
const SizedBox(height: 10),
Row(
children: [
for (var i = 0; i < 4; i++)
if (i < 3) Expanded(child: drawSlider(Color(0xff2BB8A6))) else Expanded(child: drawSlider(const Color(0xffefefef)))
],
),
const SizedBox(height: 10),
Text(
LocaleKeys.profile_completeProfile.tr(),
style: TextStyle(color: Color(0xff2BB8A6), fontWeight: FontWeight.bold, decoration: TextDecoration.underline),
),
],
),
),
/// description
Divider(height: 50, thickness: 8, color: const Color(0xffefefef)),
Column(
children: menu.map((i) => rowItem(i, context)).toList(),
)
],
),
);
}
Widget drawSlider(color) {
return Row(children: [
Expanded(
flex: 1,
child: ClipRRect(
borderRadius: BorderRadius.circular(10),
child: Container(
height: 6,
width: 20,
color: color,
),
)),
Container(height: 6, width: 3, color: Colors.white),
]);
}
Widget rowItem(obj, context) {
return InkWell(
onTap: () {
//if (obj.dynamicUrl == '') {
Navigator.pushNamed(context, obj.route);
// } else {
// Navigator.pushNamed(context, AppRoutes.addDynamicInputProfile, arguments: DynamicListViewParams(obj.name, obj.functionName, uRL: obj.dynamicUrl, requestID: obj.requestID));
//}
},
child: ListTile(
leading: SvgPicture.asset('assets/images/' + obj.icon),
title: Text(obj.name),
trailing: Icon(Icons.arrow_forward),
),
);
}
Widget customLabel(String label, double size, Color color, bool isBold, {double padding = 0.0}) => Container(
padding: EdgeInsets.all(padding),
// height: 50,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
children: [Text(label, style: TextStyle(color: color, fontSize: size, fontWeight: isBold ? FontWeight.bold : FontWeight.normal))]));
}
GetMenuEntriesList getMenuEntries(String type) {
List<GetMenuEntriesList> data = _ProfileInFoState.menuData.where((GetMenuEntriesList test) => test.functionName == type).toList();
if (data.isNotEmpty) {
return data[0];
} else {
return GetMenuEntriesList();
}
}

@ -1,39 +0,0 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/models/member_information_list_model.dart';
import 'package:mohem_flutter_app/ui/screens/profile/widgets/profile_info.dart';
class ProfilePanle extends StatelessWidget {
ProfilePanle(this.memberInformationList);
late MemberInformationListModel memberInformationList;
@override
Widget build(BuildContext context) {
double _width = MediaQuery.of(context).size.width;
return Container(
margin: EdgeInsets.fromLTRB(5, 0, 5, 10),
height: MediaQuery.of(context).size.height,
child: Stack(children: [
Container(
width: _width,
margin: EdgeInsets.only(top: 50),
padding: EdgeInsets.only(top: 50),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: const BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)),
boxShadow: [BoxShadow(color: Colors.white60, blurRadius: 10, spreadRadius: 10)],
),
child: ProfileInFo(memberInformationList),
),
Container(height: 100, alignment: Alignment.center, child: ProfileImage())
]));
}
Widget ProfileImage() => CircleAvatar(
radius: 70,
backgroundImage: MemoryImage(Utils.getPostBytes(memberInformationList.eMPLOYEEIMAGE)),
backgroundColor: Colors.black,
);
}

@ -109,14 +109,14 @@ class _DelegateSheetState extends State<DelegateSheet> {
Expanded( Expanded(
child: SingleChildScrollView( child: SingleChildScrollView(
child: Padding( child: Padding(
padding: EdgeInsets.all(21), padding: const EdgeInsets.all(21),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
widget.title.toText24(), widget.title.toText24(isBold: true),
24.height, 21.height,
"Search".toText16(), "Search".toText16(),
20.height, 11.height,
Column( Column(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
@ -148,7 +148,7 @@ class _DelegateSheetState extends State<DelegateSheet> {
), ),
), ),
Container( Container(
height: 24, height: 36,
width: 1, width: 1,
color: Color(0xffE5E5E5), color: Color(0xffE5E5E5),
), ),
@ -156,17 +156,9 @@ class _DelegateSheetState extends State<DelegateSheet> {
padding: EdgeInsets.all(8), padding: EdgeInsets.all(8),
child: Row( child: Row(
children: [ children: [
Text( selectedType.toText12(),
selectedType,
style: const TextStyle(
fontSize: 11,
fontWeight: FontWeight.w600,
color: Color(0xff2B353E),
letterSpacing: -0.44,
),
),
4.width, 4.width,
Icon( const Icon(
Icons.keyboard_arrow_down, Icons.keyboard_arrow_down,
color: Colors.black, color: Colors.black,
size: 16, size: 16,
@ -269,7 +261,7 @@ class _DelegateSheetState extends State<DelegateSheet> {
}, },
separatorBuilder: (context, index) { separatorBuilder: (context, index) {
return Container( return Container(
color: MyColors.borderColor, color: MyColors.borderE3Color,
width: double.infinity, width: double.infinity,
height: 1, height: 1,
margin: EdgeInsets.only(top: 8, bottom: 8), margin: EdgeInsets.only(top: 8, bottom: 8),
@ -286,7 +278,7 @@ class _DelegateSheetState extends State<DelegateSheet> {
}, },
separatorBuilder: (context, index) { separatorBuilder: (context, index) {
return Container( return Container(
color: MyColors.borderColor, color: MyColors.borderE3Color,
width: double.infinity, width: double.infinity,
height: 1, height: 1,
margin: EdgeInsets.only(top: 8, bottom: 8), margin: EdgeInsets.only(top: 8, bottom: 8),
@ -371,11 +363,11 @@ class _DelegateSheetState extends State<DelegateSheet> {
width: 30, width: 30,
isImageBase64: true, isImageBase64: true,
), ),
16.width, 9.width,
Expanded( (actionHistory.nAME ?? "").toText12().expanded,
child: (actionHistory.nAME ?? "").toText12(),
),
IconButton( IconButton(
padding: EdgeInsets.zero,
constraints: const BoxConstraints(),
onPressed: () { onPressed: () {
actionHistory.isFavorite = true; actionHistory.isFavorite = true;
fetchChangeFav( fetchChangeFav(

@ -37,12 +37,12 @@ class SelectedItemSheet extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
title.toText24(), title.toText24(isBold: true),
24.height, 21.height,
if (actionHistoryList != null) showItem(actionHistoryList!.nAME, actionHistoryList!.isFavorite), if (actionHistoryList != null) showItem(actionHistoryList!.nAME, actionHistoryList!.isFavorite),
if (favoriteReplacements != null) showItem(favoriteReplacements!.employeeDisplayName, true), if (favoriteReplacements != null) showItem(favoriteReplacements!.employeeDisplayName, true),
if (replacementList != null) showItem(replacementList!.employeeDisplayName, replacementList!.isFavorite), if (replacementList != null) showItem(replacementList!.employeeDisplayName, replacementList!.isFavorite),
12.height, 14.height,
InputWidget( InputWidget(
"Enter a note", "Enter a note",
"This is simple note", "This is simple note",
@ -61,7 +61,7 @@ class SelectedItemSheet extends StatelessWidget {
Container( Container(
width: double.infinity, width: double.infinity,
height: 1, height: 1,
color: MyColors.borderColor, color: MyColors.borderE3Color,
), ),
Row( Row(
children: [ children: [

@ -8,11 +8,11 @@ void showMyBottomSheet(BuildContext context, {required Widget child}) {
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
builder: (BuildContext context) { builder: (BuildContext context) {
return Container( return Container(
decoration: BoxDecoration( decoration: const BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
topRight: Radius.circular(24), topRight: Radius.circular(25),
topLeft: Radius.circular(24), topLeft: Radius.circular(25),
), ),
), ),
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
@ -20,12 +20,12 @@ void showMyBottomSheet(BuildContext context, {required Widget child}) {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
8.height, 13.height,
Container( Container(
height: 6, height: 6,
width: 60, width: 60,
decoration: BoxDecoration( decoration: const BoxDecoration(
color: Colors.grey[200], color: Color(0xff9A9A9A),
borderRadius: BorderRadius.all( borderRadius: BorderRadius.all(
Radius.circular(20), Radius.circular(20),
), ),

@ -0,0 +1,224 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.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/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_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/dynamic_forms/dynamic_textfield_widget.dart';
class SearchEmployeeBottomSheet extends StatefulWidget {
int? notificationID;
String title, apiMode;
List<GetActionHistoryList>? actionHistoryList;
Function(ReplacementList) onSelectEmployee;
SearchEmployeeBottomSheet({required this.title, required this.apiMode, this.notificationID, this.actionHistoryList, required this.onSelectEmployee});
@override
State<SearchEmployeeBottomSheet> createState() => _SearchEmployeeBottomSheetState();
}
class _SearchEmployeeBottomSheetState extends State<SearchEmployeeBottomSheet> {
TextEditingController username = TextEditingController();
String searchText = "";
List<String>? optionsList = [
LocaleKeys.fullName.tr(),
LocaleKeys.username.tr(),
LocaleKeys.endDate.tr(),
];
List<GetFavoriteReplacements>? favUsersList;
List<ReplacementList>? replacementList;
List<ReplacementList>? favouriteUserList;
List<ReplacementList>? nonFavouriteUserList;
int _selectedSearchIndex = 0;
void fetchUserByInput({bool isNeedLoading = true}) async {
try {
Utils.showLoading(context);
replacementList = await WorkListApiClient().searchUserByInput(
userName: _selectedSearchIndex == 0 ? searchText : "",
userId: _selectedSearchIndex == 1 ? searchText : "",
email: _selectedSearchIndex == 2 ? searchText : "",
);
favouriteUserList = replacementList?.where((element) => element.isFavorite ?? false).toList();
nonFavouriteUserList = replacementList?.where((element) => !(element.isFavorite ?? false)).toList();
Utils.hideLoading(context);
setState(() {});
} catch (e) {
Utils.hideLoading(context);
Utils.handleException(e, context, null);
}
if (isNeedLoading) Utils.hideLoading(context);
setState(() {});
return null;
}
@override
Widget build(BuildContext context) {
return SizedBox(
width: double.infinity,
height: MediaQuery.of(context).size.height - 100,
child: Column(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
widget.title.toText24(isBold: true),
21.height,
"Search".toText16(),
11.height,
Row(
children: [
radioOption("Name", 0, _selectedSearchIndex),
radioOption("User Name", 1, _selectedSearchIndex),
radioOption("Email", 2, _selectedSearchIndex),
],
),
14.height,
Row(
children: [
DynamicTextFieldWidget(
"Search",
"Search By Username",
inputAction: TextInputAction.done,
suffixIconData: Icons.search,
onChange: (text) {
searchText = text;
setState(() {});
},
).expanded,
IconButton(
constraints: const BoxConstraints(),
onPressed: () async {
await SystemChannels.textInput.invokeMethod('TextInput.hide');
fetchUserByInput();
},
icon: Icon(Icons.search))
],
),
if (replacementList != null)
replacementList!.isEmpty
? Utils.getNoDataWidget(context).expanded
: ListView(
physics: const BouncingScrollPhysics(),
padding: EdgeInsets.only(top: 21, bottom: 8),
children: [
if (favouriteUserList?.isNotEmpty ?? false) ...[
"Favorites".toText16(),
12.height,
ListView.separated(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (cxt, index) => employeeItemView(favouriteUserList![index]),
separatorBuilder: (cxt, index) => Container(
height: 1,
color: MyColors.borderE3Color,
),
itemCount: favouriteUserList?.length ?? 0),
12.height,
],
if (nonFavouriteUserList?.isNotEmpty ?? false) ...[
"Related".toText16(),
12.height,
ListView.separated(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (cxt, index) => employeeItemView(nonFavouriteUserList![index]),
separatorBuilder: (cxt, index) => Container(
height: 1,
color: MyColors.borderE3Color,
),
itemCount: nonFavouriteUserList?.length ?? 0),
]
],
).expanded
],
).paddingOnly(left: 21, right: 21, bottom: 0, top: 21).expanded,
Container(width: double.infinity, height: 1, color: MyColors.lightGreyEFColor),
DefaultButton(
LocaleKeys.cancel.tr(),
() {
Navigator.pop(context);
},
textColor: MyColors.grey3AColor,
colors: const [
Color(0xffE6E6E6),
Color(0xffE6E6E6),
],
).insideContainer
],
),
);
}
Widget employeeItemView(ReplacementList replacement) {
return InkWell(
onTap: () {
Navigator.pop(context);
widget.onSelectEmployee(replacement);
},
child: SizedBox(
height: 50,
child: Row(
children: [
CircularAvatar(
url: replacement.employeeImage ?? "",
height: 30,
width: 30,
isImageBase64: true,
),
16.width,
Expanded(
child: (replacement.employeeDisplayName ?? "").toText12(),
),
Icon(Icons.star, size: 16, color: replacement.isFavorite! ? MyColors.yellowFavColor : MyColors.borderCEColor),
],
),
),
);
}
Widget radioOption(String title, int value, int groupValue) {
return Row(
children: [
Container(
width: 24,
height: 24,
decoration: BoxDecoration(
color: Colors.transparent,
border: Border.all(color: MyColors.borderColor, width: 1),
borderRadius: const BorderRadius.all(Radius.circular(100)),
),
padding: const EdgeInsets.all(4),
child: Container(
width: double.infinity,
height: double.infinity,
decoration: BoxDecoration(
color: value == groupValue ? MyColors.grey3AColor : Colors.transparent,
borderRadius: BorderRadius.all(const Radius.circular(100)),
),
),
),
9.width,
title.toText12(color: MyColors.grey57Color)
],
).onPress(() {
_selectedSearchIndex = value;
setState(() {});
}).expanded;
}
}

@ -1,25 +1,28 @@
import 'package:easy_localization/src/public_ext.dart'; import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; 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 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
class ConfirmDialog extends StatelessWidget { class ConfirmDialog extends StatelessWidget {
final String? title; final String? title;
final String? message; final String message;
final String? okTitle; final String? okTitle;
final VoidCallback? onTap; final VoidCallback? onTap;
const ConfirmDialog({Key? key, this.title, @required this.message, this.okTitle, this.onTap}) : super(key: key); const ConfirmDialog({Key? key, this.title, required this.message, this.okTitle, this.onTap}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Dialog( return Dialog(
backgroundColor: Colors.white, backgroundColor: Colors.white,
shape: RoundedRectangleBorder(), shape: const RoundedRectangleBorder(),
insetPadding: EdgeInsets.only(left: 21, right: 21), insetPadding: const EdgeInsets.only(left: 21, right: 21),
child: Padding( child: Padding(
padding: EdgeInsets.only(left: 20, right: 20, top: 18, bottom: 28), padding: const EdgeInsets.only(left: 20, right: 20, top: 18, bottom: 28),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@ -28,33 +31,27 @@ class ConfirmDialog extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Expanded( Expanded(
child: Padding( child: Text(
padding: const EdgeInsets.only(top: 16.0), title ?? LocaleKeys.confirm.tr(),
child: Text( style: const TextStyle(fontSize: 24, fontWeight: FontWeight.w600, color: MyColors.darkTextColor, height: 35 / 24, letterSpacing: -0.96),
title ?? LocaleKeys.confirm.tr(), ).paddingOnly(top: 16),
style: TextStyle(fontSize: 24, fontWeight: FontWeight.w600, color: Color(0xff2B353E), height: 35 / 24, letterSpacing: -0.96),
),
),
), ),
IconButton( IconButton(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
icon: Icon(Icons.close), icon: const Icon(Icons.close),
color: Color(0xff2B353E), color: MyColors.darkTextColor,
constraints: BoxConstraints(), constraints: const BoxConstraints(),
onPressed: () { onPressed: () {
Navigator.pop(context); Navigator.pop(context);
}, },
) )
], ],
), ),
Text( message.toText16(color: MyColors.lightGrayColor),
message ?? "", 28.height,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff808080), letterSpacing: -0.48),
),
SizedBox(height: 28),
DefaultButton( DefaultButton(
okTitle ?? LocaleKeys.ok.tr(), okTitle ?? LocaleKeys.ok.tr(),
onTap == null ? () => Navigator.pop(context) : onTap, onTap ?? () => Navigator.pop(context),
textColor: Colors.white, textColor: Colors.white,
//color: Ap.green, //color: Ap.green,
), ),

@ -8,6 +8,7 @@ class DynamicTextFieldWidget extends StatelessWidget {
final VoidCallback? onTap; final VoidCallback? onTap;
final IconData? suffixIconData; final IconData? suffixIconData;
final bool isEnable; final bool isEnable;
final TextInputAction? inputAction;
final bool isReadOnly; final bool isReadOnly;
final bool isPopup; final bool isPopup;
final int? lines; final int? lines;
@ -24,6 +25,7 @@ class DynamicTextFieldWidget extends StatelessWidget {
this.isReadOnly = false, this.isReadOnly = false,
this.isPopup = false, this.isPopup = false,
this.lines = 1, this.lines = 1,
this.inputAction,
this.onChange, this.onChange,
this.isInputTypeNum = false, this.isInputTypeNum = false,
this.isBackgroundEnable = false}); this.isBackgroundEnable = false});
@ -62,6 +64,7 @@ class DynamicTextFieldWidget extends StatelessWidget {
TextField( TextField(
enabled: isEnable, enabled: isEnable,
scrollPadding: EdgeInsets.zero, readOnly: isReadOnly, scrollPadding: EdgeInsets.zero, readOnly: isReadOnly,
textInputAction: inputAction,
keyboardType: isInputTypeNum ? TextInputType.number : TextInputType.text, keyboardType: isInputTypeNum ? TextInputType.number : TextInputType.text,
//controller: controller, //controller: controller,
maxLines: lines, maxLines: lines,
@ -99,7 +102,7 @@ class DynamicTextFieldWidget extends StatelessWidget {
), ),
), ),
if (isPopup) const Icon(Icons.keyboard_arrow_down_outlined, color: MyColors.darkIconColor), 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), if (onTap != null) Icon(suffixIconData ?? Icons.keyboard_arrow_down_outlined, color: MyColors.darkIconColor),
], ],
), ),
), ),

Loading…
Cancel
Save