diff --git a/assets/images/drawer/change_password.svg b/assets/images/drawer/change_password.svg new file mode 100644 index 0000000..7e953d2 --- /dev/null +++ b/assets/images/drawer/change_password.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/drawer/employee_id.svg b/assets/images/drawer/employee_id.svg new file mode 100644 index 0000000..b40b670 --- /dev/null +++ b/assets/images/drawer/employee_id.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/images/drawer/logout.svg b/assets/images/drawer/logout.svg new file mode 100644 index 0000000..acdc741 --- /dev/null +++ b/assets/images/drawer/logout.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/drawer/mowadhafi.svg b/assets/images/drawer/mowadhafi.svg new file mode 100644 index 0000000..b76f9b8 --- /dev/null +++ b/assets/images/drawer/mowadhafi.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/drawer/my_profile.svg b/assets/images/drawer/my_profile.svg new file mode 100644 index 0000000..45b9155 --- /dev/null +++ b/assets/images/drawer/my_profile.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/images/drawer/my_requests.svg b/assets/images/drawer/my_requests.svg new file mode 100644 index 0000000..223beee --- /dev/null +++ b/assets/images/drawer/my_requests.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/drawer/my_team.svg b/assets/images/drawer/my_team.svg new file mode 100644 index 0000000..9eae21b --- /dev/null +++ b/assets/images/drawer/my_team.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/drawer/pending_trasactions.svg b/assets/images/drawer/pending_trasactions.svg new file mode 100644 index 0000000..5975ca3 --- /dev/null +++ b/assets/images/drawer/pending_trasactions.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/drawer/performance_evaluation.svg b/assets/images/drawer/performance_evaluation.svg new file mode 100644 index 0000000..534b5a6 --- /dev/null +++ b/assets/images/drawer/performance_evaluation.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/images/drawer/view_business_card.svg b/assets/images/drawer/view_business_card.svg new file mode 100644 index 0000000..5544e05 --- /dev/null +++ b/assets/images/drawer/view_business_card.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 1ba7218..5353a84 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -97,6 +97,7 @@ "cancel": "إلغاء", "requestedItems": "العناصر المطلوبة", "request": "طلب", + "myRequest": "طلبي", "actions": "أجراءات", "delegate": "مندوب", "request_info": "اطلب معلومات", @@ -311,6 +312,9 @@ "requestType": "نوع الطلب", "employeeDigitalID": "هويةالموظف الرقمية", "businessCard": "بطاقة العمل", + "viewBusinessCard": "عرض بطاقة العمل", + "performanceEvaluation": "تقييم الأداء", + "logout": "تسجيل خروج", "checkOut": "وقت الخروج", "regular": "منتظم", "mark": "علامة", @@ -341,13 +345,12 @@ "pleaseSelectDate": "الرجاء تحديد التاريخ", "todayAttendance": "حضور اليوم", "viewAttendance": "عرض الحضور", - "teamMembers":"اعضاءالفريق", + "teamMembers": "اعضاءالفريق", "profileDetails": "الملف الشخصي", - "noResultsFound" : "لايوجد نتائج", + "noResultsFound": "لايوجد نتائج", "searchBy": "بحث بواسطة", "myTeamMembers": "اعضاء فريقي", "save": "حفظ", - "itemType": "نوع العنصر", "TurnNotificationsFor": "تفعيل الاشعارات", "worklistSettings": "اعدادات الاشعارات", "absenceType": "نوع الغياب", @@ -358,6 +361,8 @@ "absenceStatus": "حالة الغياب", "subordinateLeave": "إجازة التابعيين", "numberDays": "عدد الأيام", + "poweredBy": "مشغل بواسطة", + "cloudSolutions": "حلول السحابة", "profile": { "reset_password": { "label": "Reset Password", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 47d33b9..18bf326 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -94,6 +94,7 @@ "cancel": "Cancel", "requestedItems": "Requested Items", "request": "Request", + "myRequest": "My Request", "actions": "Actions", "delegate": "Delegate", "request_info": "Request Info", @@ -311,6 +312,9 @@ "wantToReject": "Are you sure want to reject?", "employeeDigitalID": "Employee Digital ID", "businessCard": "Business Card", + "viewBusinessCard": "View Business Card", + "performanceEvaluation": "Performance Evaluation", + "logout": "Logout", "checkOut": "Check Out", "regular": "Regular", "mark": "Mark", @@ -341,13 +345,12 @@ "pleaseSelectDate": "Please select date", "todayAttendance": "Today's Attendance", "viewAttendance": "View Attendance", - "teamMembers":"Team Members", + "teamMembers": "Team Members", "profileDetails": "Profile Details", - "noResultsFound" : "No Results Found", + "noResultsFound": "No Results Found", "searchBy": "Search by", "myTeamMembers": "My Team Members", "save": "Save", - "itemType": "Item Type", "TurnNotificationsFor": "Turn on notifications for", "worklistSettings": "Worklist Settings", "absenceType": "Absence Type", @@ -356,6 +359,8 @@ "hours": "Hours", "approvalStatus": "Approval Status", "absenceStatus": "Absence Status", + "poweredBy": "Powered By", + "cloudSolutions": "Cloud Solutions", "subordinateLeave": "Subordinate Leave", "numberDays": "Number of days", "profile": { diff --git a/lib/api/dashboard_api_client.dart b/lib/api/dashboard_api_client.dart index 1dd58b1..5b00e7f 100644 --- a/lib/api/dashboard_api_client.dart +++ b/lib/api/dashboard_api_client.dart @@ -5,6 +5,7 @@ import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart'; +import 'package:mohem_flutter_app/models/dashboard/list_menu.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:uuid/uuid.dart'; @@ -66,13 +67,13 @@ class DashboardApiClient { } //Menus List - Future getListMenu() async { + Future> getListMenu() async { String url = "${ApiConsts.erpRest}GET_MENU"; Map postParams = {}; postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { GenericResponseModel responseData = GenericResponseModel.fromJson(json); - return responseData; + return responseData.listMenu ?? []; }, url, postParams); } diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 8f280b1..30c7e2e 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -15,9 +15,9 @@ extension CapExtension on String { extension EmailValidator on String { Widget get toWidget => Text(this); - Widget toText10({Color? color, bool isBold = false, int maxLine = 0}) => Text( + Widget toText10({Color? color, bool isBold = false, int? maxLine}) => Text( this, - maxLines: (maxLine > 0) ? maxLine : null, + maxLines: maxlines, style: TextStyle(fontSize: 10, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4), ); @@ -50,21 +50,22 @@ extension EmailValidator on String { style: TextStyle(fontSize: 13, fontWeight: FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.52, decoration: isUnderLine ? TextDecoration.underline : null), ); - Widget toText14({Color? color, bool isBold = false, int? maxlines}) => Text( + Widget toText14({Color? color, bool isBold = false, FontWeight? weight, int? maxlines}) => Text( this, maxLines: maxlines, - 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: weight ?? (isBold ? FontWeight.bold : FontWeight.w600)), ); - Widget toText16({Color? color, bool isBold = false, int? maxlines, bool isUnderLine = false}) => Text( + Widget toText16({Color? color, bool isUnderLine = false, bool isBold = false, int? maxlines}) => Text( this, maxLines: maxlines, style: TextStyle( - color: color ?? MyColors.darkTextColor, - fontSize: 16, - letterSpacing: -0.64, - fontWeight: isBold ? FontWeight.bold : FontWeight.w600, - decoration: isUnderLine ? TextDecoration.underline : TextDecoration.none), + 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( @@ -72,6 +73,11 @@ extension EmailValidator on String { style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 17, letterSpacing: -0.68, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), ); + Widget toText18({Color? color, bool isBold = false}) => Text( + this, + style: TextStyle(fontSize: 18, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -1.08), + ); + Widget toText20({Color? color, bool isBold = false}) => Text( this, style: TextStyle(fontSize: 20, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4), diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 7452524..255e04e 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -113,6 +113,7 @@ class CodegenLoader extends AssetLoader{ "cancel": "إلغاء", "requestedItems": "العناصر المطلوبة", "request": "طلب", + "myRequest": "طلبي", "actions": "أجراءات", "delegate": "مندوب", "request_info": "اطلب معلومات", @@ -327,6 +328,9 @@ class CodegenLoader extends AssetLoader{ "requestType": "نوع الطلب", "employeeDigitalID": "هويةالموظف الرقمية", "businessCard": "بطاقة العمل", + "viewBusinessCard": "عرض بطاقة العمل", + "performanceEvaluation": "تقييم الأداء", + "logout": "تسجيل خروج", "checkOut": "وقت الخروج", "regular": "منتظم", "mark": "علامة", @@ -373,6 +377,8 @@ class CodegenLoader extends AssetLoader{ "absenceStatus": "حالة الغياب", "subordinateLeave": "إجازة التابعيين", "numberDays": "عدد الأيام", + "poweredBy": "مشغل بواسطة", + "cloudSolutions": "حلول السحابة", "profile": { "reset_password": { "label": "Reset Password", @@ -503,6 +509,7 @@ static const Map en_US = { "cancel": "Cancel", "requestedItems": "Requested Items", "request": "Request", + "myRequest": "My Request", "actions": "Actions", "delegate": "Delegate", "request_info": "Request Info", @@ -720,6 +727,9 @@ static const Map en_US = { "wantToReject": "Are you sure want to reject?", "employeeDigitalID": "Employee Digital ID", "businessCard": "Business Card", + "viewBusinessCard": "View Business Card", + "performanceEvaluation": "Performance Evaluation", + "logout": "Logout", "checkOut": "Check Out", "regular": "Regular", "mark": "Mark", @@ -766,6 +776,8 @@ static const Map en_US = { "absenceStatus": "Absence Status", "subordinateLeave": "Subordinate Leave", "numberDays": "Number of days", + "poweredBy": "Powered By", + "cloudSolutions": "Cloud Solutions", "profile": { "reset_password": { "label": "Reset Password", diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 12fb29a..8c6247b 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -98,6 +98,7 @@ abstract class LocaleKeys { static const cancel = 'cancel'; static const requestedItems = 'requestedItems'; static const request = 'request'; + static const myRequest = 'myRequest'; static const actions = 'actions'; static const delegate = 'delegate'; static const request_info = 'request_info'; @@ -312,6 +313,9 @@ abstract class LocaleKeys { static const requestType = 'requestType'; static const employeeDigitalID = 'employeeDigitalID'; static const businessCard = 'businessCard'; + static const viewBusinessCard = 'viewBusinessCard'; + static const performanceEvaluation = 'performanceEvaluation'; + static const logout = 'logout'; static const checkOut = 'checkOut'; static const regular = 'regular'; static const mark = 'mark'; @@ -356,6 +360,8 @@ abstract class LocaleKeys { static const hours = 'hours'; static const approvalStatus = 'approvalStatus'; static const absenceStatus = 'absenceStatus'; + static const poweredBy = 'poweredBy'; + static const cloudSolutions = 'cloudSolutions'; static const subordinateLeave = 'subordinateLeave'; static const numberDays = 'numberDays'; static const profile_reset_password_label = 'profile.reset_password.label'; diff --git a/lib/models/dashboard/drawer_menu_item_model.dart b/lib/models/dashboard/drawer_menu_item_model.dart new file mode 100644 index 0000000..54a7bfc --- /dev/null +++ b/lib/models/dashboard/drawer_menu_item_model.dart @@ -0,0 +1,7 @@ +class DrawerMenuItem { + String icon; + String title; + String routeName; + + DrawerMenuItem(this.icon, this.title, this.routeName); +} diff --git a/lib/provider/dashboard_provider_model.dart b/lib/provider/dashboard_provider_model.dart index 289ab33..5c4b20f 100644 --- a/lib/provider/dashboard_provider_model.dart +++ b/lib/provider/dashboard_provider_model.dart @@ -1,16 +1,17 @@ -import 'dart:convert'; - import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/dashboard_api_client.dart'; import 'package:mohem_flutter_app/api/offers_and_discounts_api_client.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/main.dart'; +import 'package:mohem_flutter_app/models/dashboard/drawer_menu_item_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_open_notifications_list.dart'; import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart'; +import 'package:mohem_flutter_app/models/dashboard/list_menu.dart'; import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; import 'package:mohem_flutter_app/models/dashboard/menus.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; @@ -144,20 +145,28 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { } //List Menu API's & Methods + + List drawerMenuItemList = [ + DrawerMenuItem("assets/images/drawer/my_profile.svg", LocaleKeys.myProfile.tr(), AppRoutes.profile), + DrawerMenuItem("assets/images/drawer/performance_evaluation.svg", LocaleKeys.performanceEvaluation.tr(), ""), + DrawerMenuItem("assets/images/drawer/mowadhafi.svg", LocaleKeys.mowadhafhi.tr(), AppRoutes.mowadhafhi), + DrawerMenuItem("assets/images/drawer/pending_trasactions.svg", LocaleKeys.pendingTransactions.tr(), AppRoutes.pendingTransactions), + DrawerMenuItem("assets/images/drawer/change_password.svg", LocaleKeys.changePassword.tr(), ""), + ]; + void fetchListMenu() async { try { - GenericResponseModel? genericResponseModel = await DashboardApiClient().getListMenu(); - Map map = {}; - print(jsonEncode(genericResponseModel!.listMenu)); - for (int i = 0; i < genericResponseModel.listMenu!.length; i++) { - print(genericResponseModel.listMenu![i].menuName ?? ""); - map[genericResponseModel.listMenu![i].menuName ?? ""] = i.toString(); + List menuList = await DashboardApiClient().getListMenu(); + List findMyRequest = menuList.where((element) => element.menuName == "My Requests").toList(); + if (findMyRequest.isNotEmpty) { + drawerMenuItemList.insert(3, DrawerMenuItem("assets/images/drawer/my_requests.svg", LocaleKeys.myRequest.tr(), AppRoutes.myTeam)); + } + List findMyTeam = menuList.where((element) => element.menuName == "My Team").toList(); + if (findMyTeam.isNotEmpty) { + drawerMenuItemList.insert(2, DrawerMenuItem("assets/images/drawer/my_team.svg", LocaleKeys.myTeamMembers.tr(), AppRoutes.myTeam)); } - logger.i(map); - notifyListeners(); } catch (ex) { logger.wtf(ex); - notifyListeners(); Utils.handleException(ex, null, null); } } diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart index 9a3baa0..ad5ba1d 100644 --- a/lib/ui/landing/dashboard_screen.dart +++ b/lib/ui/landing/dashboard_screen.dart @@ -43,6 +43,7 @@ class _DashboardScreenState extends State { void initState() { super.initState(); data = Provider.of(context, listen: false); + data.fetchListMenu(); data.fetchAttendanceTracking(context); data.fetchWorkListCounter(context); data.fetchMissingSwipe(context); @@ -220,9 +221,11 @@ class _DashboardScreenState extends State { ), ], ), - ).onPress(() { - Navigator.pushNamed(context, AppRoutes.todayAttendance); - })) + ).onPress( + () { + Navigator.pushNamed(context, AppRoutes.todayAttendance); + }, + )) .animatedSwither(); }, ), @@ -240,10 +243,10 @@ class _DashboardScreenState extends State { 8.height, Container( width: double.infinity, - padding: EdgeInsets.only(top: 31), + padding: const EdgeInsets.only(top: 31), decoration: BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.only(topRight: Radius.circular(50), topLeft: Radius.circular(50)), + borderRadius: const BorderRadius.only(topRight: Radius.circular(50), topLeft: Radius.circular(50)), border: Border.all(color: MyColors.lightGreyEDColor, width: 1), ), child: Column( diff --git a/lib/ui/landing/widget/app_drawer.dart b/lib/ui/landing/widget/app_drawer.dart index 70fc38f..7ea9748 100644 --- a/lib/ui/landing/widget/app_drawer.dart +++ b/lib/ui/landing/widget/app_drawer.dart @@ -1,12 +1,20 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; -import 'package:mohem_flutter_app/config/routes.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/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/drawer_menu_item_model.dart'; +import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/ui/dialogs/id/business_card_dialog.dart'; import 'package:mohem_flutter_app/ui/dialogs/id/employee_digital_id_dialog.dart'; -import 'package:mohem_flutter_app/ui/landing/widget/drawer_item.dart'; import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart'; +import 'package:provider/provider.dart'; class AppDrawer extends StatefulWidget { @override @@ -14,104 +22,108 @@ class AppDrawer extends StatefulWidget { } class _AppDrawerState extends State { + List drawerMenuItemList = []; + @override Widget build(BuildContext context) { - return Container( - color: Colors.white, - child: Drawer( - child: Column(children: [ - const SizedBox( - height: 200, - ), - Expanded( - child: ListView(padding: const EdgeInsets.all(21), physics: const BouncingScrollPhysics(), children: [ - Divider(), - InkWell( - child: DrawerItem( - //'My Profile', - LocaleKeys.myProfile.tr(), - icon: Icons.person, - color: Colors.grey, - ), - onTap: () { - drawerNavigator(context, AppRoutes.profile); - }), - Divider(), - InkWell( - child: DrawerItem( - // 'Mowadhafhi', - LocaleKeys.mowadhafhi.tr(), - icon: Icons.person, - color: Colors.grey, - ), - onTap: () { - drawerNavigator(context, AppRoutes.mowadhafhi); - }, - ), - Divider(), - InkWell( - child: DrawerItem( - LocaleKeys.pendingTransactions.tr(), - icon: Icons.person, - color: Colors.grey, - ), - onTap: () { - drawerNavigator(context, AppRoutes.pendingTransactions); - }, - ), - const Divider(), - InkWell( - child: DrawerItem( - "My Team", - icon: Icons.person, - color: Colors.grey, - ), - onTap: () { - drawerNavigator(context, AppRoutes.myTeam); - }, - ), - Divider(), - InkWell( - child: const DrawerItem( - 'My Requests', - icon: Icons.person, - color: Colors.grey, - ), - onTap: () { - drawerNavigator(context, AppRoutes.myRequests); - }), - InkWell( - child: DrawerItem( - LocaleKeys.employeeDigitalID.tr(), - icon: Icons.insert_drive_file_outlined, - color: Colors.grey, - ), - onTap: () { - showMDialog(context, child: EmployeeDigitialIdDialog()); - }, - ), - Divider(), - InkWell( - child: DrawerItem( - LocaleKeys.businessCard.tr(), - icon: Icons.insert_drive_file_outlined, - color: Colors.grey, + if (drawerMenuItemList.isEmpty) { + drawerMenuItemList = Provider.of(context, listen: false).drawerMenuItemList; + } + + return Drawer( + width: MediaQuery.of(context).size.width * 303 / 375, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Image.asset("assets/images/logos/main_mohemm_logo.png", width: 134, height: 24), + const Icon(Icons.clear).onPress(() => Navigator.pop(context)), + ], + ).paddingOnly(left: 4, right: 14), + Row( + children: [ + CircleAvatar( + radius: 52 / 2, + backgroundImage: MemoryImage(Utils.getPostBytes(AppState().memberInformationList!.eMPLOYEEIMAGE)), + backgroundColor: Colors.black, ), - onTap: () { - showMDialog(context, child: BusinessCardDialog()); - }, - ), - ])) - ]))); + 12.width, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppState().memberInformationList!.eMPLOYEENAME!.toText18(isBold: true), + AppState().memberInformationList!.jOBNAME!.toText14(weight: FontWeight.w500), + ], + ).expanded + ], + ).paddingOnly(left: 14, right: 14, top: 21, bottom: 21), + const Divider( + height: 1, + thickness: 1, + color: MyColors.lightGreyEFColor, + ), + ListView( + padding: const EdgeInsets.only(top: 21, bottom: 21), + children: [ + ListView.builder( + padding: EdgeInsets.zero, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: drawerMenuItemList.length, + itemBuilder: (cxt, index) { + return menuItem(drawerMenuItemList[index].icon, drawerMenuItemList[index].title, drawerMenuItemList[index].routeName, onPress: () { + Navigator.pushNamed(context, drawerMenuItemList[index].routeName); + }); + }), + menuItem("assets/images/drawer/employee_id.svg", LocaleKeys.employeeDigitalID.tr(), "", closeDrawer: false, onPress: () => showMDialog(context, child: EmployeeDigitialIdDialog())), + menuItem("assets/images/drawer/view_business_card.svg", LocaleKeys.viewBusinessCard.tr(), "", closeDrawer: false, onPress: () => showMDialog(context, child: BusinessCardDialog())), + menuItem("assets/images/drawer/logout.svg", LocaleKeys.logout.tr(), "", color: MyColors.redA3Color, closeDrawer: false, onPress: () {}), + ], + ).expanded, + const Divider( + height: 1, + thickness: 1, + color: MyColors.lightGreyEFColor, + ), + Row( + children: [ + RichText( + text: TextSpan(text: LocaleKeys.poweredBy.tr() + " ", style: const TextStyle(color: MyColors.grey98Color, fontSize: 14, letterSpacing: -0.56, fontWeight: FontWeight.w600), children: [ + TextSpan( + text: LocaleKeys.cloudSolutions.tr(), + style: const TextStyle(color: MyColors.grey3AColor, fontSize: 14, letterSpacing: -0.56, fontWeight: FontWeight.w600), + ), + ]), + ).expanded, + Image.asset("assets/images/logos/bn_cloud_soloution.jpg", width: 40, height: 40) + ], + ).paddingOnly(left: 21, right: 21, top: 21) + ], + ).paddingOnly(top: 21, bottom: 21), + ); } - void drawerNavigator(context, routeName) { - Navigator.of(context).pushNamed(routeName); + Widget menuItem(String icon, String title, String routeName, {Color? color, bool closeDrawer = true, VoidCallback? onPress}) { + return Row( + children: [ + SvgPicture.asset( + icon, + height: 20, + width: 20, + ), + 9.width, + title.toText14(color: color).expanded + ], + ).paddingOnly(left: 21, top: 10, bottom: 10).onPress(closeDrawer + ? () async { + Navigator.pop(context); + Future.delayed(const Duration(microseconds: 200), onPress); + } + : onPress!); } - String capitalizeOnlyFirstLater(String text) { - if (text.trim().isEmpty) return ""; - - return "${text[0].toUpperCase()}${text.substring(1)}"; + void drawerNavigator(context, routeName) { + Navigator.of(context).pushNamed(routeName); } } diff --git a/lib/ui/my_team/profile_details.dart b/lib/ui/my_team/profile_details.dart index cfc1730..b1bf5df 100644 --- a/lib/ui/my_team/profile_details.dart +++ b/lib/ui/my_team/profile_details.dart @@ -3,11 +3,11 @@ 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/models/my_team/get_employee_subordinates_list.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; - class ProfileDetails extends StatefulWidget { const ProfileDetails({Key? key}) : super(key: key); @@ -18,8 +18,6 @@ class ProfileDetails extends StatefulWidget { class _ProfileDetailsState extends State { GetEmployeeSubordinatesList? getEmployeeSubordinates; - - @override void initState() { super.initState(); @@ -33,47 +31,26 @@ class _ProfileDetailsState extends State { title: LocaleKeys.profileDetails.tr(), ), backgroundColor: MyColors.backgroundColor, - body: Column( + body: ListView( + padding: EdgeInsets.all(21), children: [ - Container( - width: double.infinity, - margin: EdgeInsets.only( - top: 20, - left: 21, - right: 21, - ), - padding: EdgeInsets.only(left: 14, right: 14, top: 13, bottom: 20), - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 5, - blurRadius: 26, - offset: Offset(0, 3), - ), - ], - color: Colors.white, - borderRadius: BorderRadius.circular(10.0), - ), - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - LocaleKeys.category.tr().toText13(color: MyColors.lightGrayColor), - "${getEmployeeSubordinates?.eMPLOYMENTCATEGORYMEANING}".toText16(isBold: true, color: MyColors.darkTextColor), - 23.height, - LocaleKeys.address.tr().toText13(color: MyColors.lightGrayColor), - "${getEmployeeSubordinates?.lOCATIONNAME}".toText16(isBold: true, color: MyColors.darkTextColor), - 23.height, - LocaleKeys.phoneNumber.tr().toText13(color: MyColors.lightGrayColor), - "${getEmployeeSubordinates?.eMPLOYEEMOBILENUMBER}".toText16(isBold: true, color: MyColors.darkTextColor), - 23.height, - LocaleKeys.businessGroup.tr().toText13(color: MyColors.lightGrayColor), - "${getEmployeeSubordinates?.bUSINESSGROUPNAME}".toText16(isBold: true, color: MyColors.darkTextColor), - 23.height, - LocaleKeys.Payroll.tr().toText13(color: MyColors.lightGrayColor), - "${getEmployeeSubordinates?.pAYROLLNAME}".toText16(isBold: true, color: MyColors.darkTextColor), - ]), - ), + Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + LocaleKeys.category.tr().toText13(color: MyColors.lightGrayColor), + "${getEmployeeSubordinates?.eMPLOYMENTCATEGORYMEANING}".toText16(isBold: true, color: MyColors.darkTextColor), + 23.height, + LocaleKeys.address.tr().toText13(color: MyColors.lightGrayColor), + "${getEmployeeSubordinates?.lOCATIONNAME}".toText16(isBold: true, color: MyColors.darkTextColor), + 23.height, + LocaleKeys.phoneNumber.tr().toText13(color: MyColors.lightGrayColor), + "${getEmployeeSubordinates?.eMPLOYEEMOBILENUMBER}".toText16(isBold: true, color: MyColors.darkTextColor), + 23.height, + LocaleKeys.businessGroup.tr().toText13(color: MyColors.lightGrayColor), + "${getEmployeeSubordinates?.bUSINESSGROUPNAME}".toText16(isBold: true, color: MyColors.darkTextColor), + 23.height, + LocaleKeys.Payroll.tr().toText13(color: MyColors.lightGrayColor), + "${getEmployeeSubordinates?.pAYROLLNAME}".toText16(isBold: true, color: MyColors.darkTextColor), + ]).objectContainerView(), ], )); } - } diff --git a/lib/ui/my_team/subordinate_leave.dart b/lib/ui/my_team/subordinate_leave.dart index 9e69fdc..d9ca110 100644 --- a/lib/ui/my_team/subordinate_leave.dart +++ b/lib/ui/my_team/subordinate_leave.dart @@ -1,4 +1,3 @@ - import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; @@ -9,7 +8,6 @@ import 'package:mohem_flutter_app/api/my_team/my_team_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/date_uitl.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; -import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; @@ -18,7 +16,7 @@ import 'package:mohem_flutter_app/models/my_team/get_subordinates_leaves_total_v import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; - +import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; class SubordinateLeave extends StatefulWidget { const SubordinateLeave({Key? key}) : super(key: key); @@ -33,19 +31,16 @@ class _SubordinateLeaveState extends State { DateTime selectedDateTo = DateTime.now(); bool showList = false; - - - @override void initState() { super.initState(); } - void getSubordinatesLeaves()async { + void getSubordinatesLeaves() async { try { Utils.showLoading(context); getSubordinatesLeavesTotalList = await MyTeamApiClient().getSubordinatesLeavesList(DateUtil.convertDateToStringLocation(selectedDateFrom), DateUtil.convertDateToStringLocation(selectedDateTo)); - showList= true; + showList = true; Utils.hideLoading(context); setState(() {}); } catch (ex) { @@ -54,108 +49,85 @@ class _SubordinateLeaveState extends State { } } - @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBarWidget( - context, - title: LocaleKeys.subordinateLeave.tr(), - ), - backgroundColor: MyColors.backgroundColor, - body: Column( - children: [ - Expanded( - child: SingleChildScrollView( - scrollDirection: Axis.vertical, - child: Column( - children: [ - Column( - children: [ - DynamicTextFieldWidget( - LocaleKeys.dateFrom.tr(), - selectedDateFrom.toString().split(" ")[0], - suffixIconData: Icons.calendar_today, - isEnable: false, - onTap: () async { - selectedDateFrom = await _selectDate(context, DateTime.now()); - setState(() {}); - }, - ), - 12.height, - DynamicTextFieldWidget( - LocaleKeys.dateTo.tr(), - selectedDateTo.toString().split(" ")[0], - suffixIconData: Icons.calendar_today, - isEnable: false, - onTap: () async { - selectedDateTo = await _selectDate(context, DateTime.now()); - setState(() {}); - }, - ) - ], - ).objectContainerView(), - Container( - margin: EdgeInsets.only(left: 21, right: 21), - width: MediaQuery.of(context).size.width, - child: SingleChildScrollView( - scrollDirection: Axis.vertical, - child: Column( - children: [ - showList? ListView.separated( - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: ScrollPhysics(), - separatorBuilder: (BuildContext cxt,int index) => 12.height, - itemCount: getSubordinatesLeavesTotalList.length, - itemBuilder: (BuildContext context,int index) { - var diffDays = DateUtil.convertStringToDate(getSubordinatesLeavesTotalList[index].dATEEND!).difference(DateUtil.convertStringToDate(getSubordinatesLeavesTotalList[index].dATESTART!)).inDays; - return getSubordinatesLeavesTotalList.isEmpty - ? Utils.getNoDataWidget(context) - : Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SvgPicture.asset("assets/images/user.svg"), - 14.width, - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "${getSubordinatesLeavesTotalList[index].eMPLOYEENAME}".toText16(isBold: true, color: MyColors.grey3AColor), - 10.height, - Row( - children: [ - (LocaleKeys.from.tr() + ': ${DateUtil.getFormattedDate(DateUtil.convertStringToDate(getSubordinatesLeavesTotalList[index].dATESTART!), "MMM dd yyyy")}').toText10(isBold: true, color: MyColors.grey57Color), - 14.width, - (LocaleKeys.to.tr() + ': ${DateUtil.getFormattedDate(DateUtil.convertStringToDate(getSubordinatesLeavesTotalList[index].dATEEND!), "MMM dd yyyy")}').toText10(isBold: true, color: MyColors.grey57Color), - ], - ), - (LocaleKeys.numberDays.tr()+ ": $diffDays").toText10(color: MyColors.grey3AColor), - ], - ).expanded - ], - ).objectContainerView(); - } - ) - :Container(), - ], - ), - ), - ), - ], - ), - ), + appBar: AppBarWidget( + context, + title: LocaleKeys.subordinateLeave.tr(), + ), + backgroundColor: MyColors.backgroundColor, + body: Column( + children: [ + Expanded( + child: Column( + children: [ + Column( + children: [ + DynamicTextFieldWidget( + LocaleKeys.dateFrom.tr(), + selectedDateFrom.toString().split(" ")[0], + suffixIconData: Icons.calendar_today, + isEnable: false, + onTap: () async { + selectedDateFrom = await _selectDate(context, DateTime.now()); + setState(() {}); + }, + ), + 12.height, + DynamicTextFieldWidget( + LocaleKeys.dateTo.tr(), + selectedDateTo.toString().split(" ")[0], + suffixIconData: Icons.calendar_today, + isEnable: false, + onTap: () async { + selectedDateTo = await _selectDate(context, DateTime.now()); + setState(() {}); + }, + ) + ], + ).objectContainerView(), + if (showList) + ListView.separated( + scrollDirection: Axis.vertical, + physics: ScrollPhysics(), + padding: const EdgeInsets.all(21), + separatorBuilder: (BuildContext cxt, int index) => 12.height, + itemCount: getSubordinatesLeavesTotalList.length, + itemBuilder: (BuildContext context, int index) { + var diffDays = DateUtil.convertStringToDate(getSubordinatesLeavesTotalList[index].dATEEND!) + .difference(DateUtil.convertStringToDate(getSubordinatesLeavesTotalList[index].dATESTART!)) + .inDays; + return getSubordinatesLeavesTotalList.isEmpty + ? Utils.getNoDataWidget(context) + : Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SvgPicture.asset("assets/images/user.svg", width: 34, height: 34).paddingOnly(top: 4), + 9.width, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + getSubordinatesLeavesTotalList[index].eMPLOYEENAME!.toText16(), + ItemDetailView(LocaleKeys.from.tr(), DateUtil.getFormattedDate(DateUtil.convertStringToDate(getSubordinatesLeavesTotalList[index].dATESTART!), "MMM dd yyyy")), + ItemDetailView(LocaleKeys.to.tr(), DateUtil.getFormattedDate(DateUtil.convertStringToDate(getSubordinatesLeavesTotalList[index].dATEEND!), "MMM dd yyyy")), + ItemDetailView(LocaleKeys.numberDays.tr(), diffDays.toString()), + ], + ).expanded + ], + ).objectContainerView(); + }).expanded + ], ), - DefaultButton( - LocaleKeys.submit.tr(), () async { - getSubordinatesLeaves(); - }).insideContainer - ], ), - ); + DefaultButton(LocaleKeys.submit.tr(), () async { + getSubordinatesLeaves(); + }).insideContainer + ], + ), + ); } - - Future _selectDate(BuildContext context, DateTime selectedDate) async { DateTime time = selectedDate; if (!Platform.isIOS) { diff --git a/pubspec.yaml b/pubspec.yaml index fcd8742..ee15638 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -107,6 +107,7 @@ flutter: - assets/images/ - assets/images/login/ - assets/images/logos/ + - assets/images/drawer/ - assets/icons/nfc/ic_nfc.png - assets/icons/nfc/ic_done.png