From 169a9bcc600d1c71b581fe474d47784f0a913fdb Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 28 Aug 2022 12:28:39 +0300 Subject: [PATCH] leave balance cont. --- assets/langs/ar-SA.json | 6 ++ assets/langs/en-US.json | 6 ++ lib/api/leave_balance_api_client.dart | 34 +++++++ lib/config/routes.dart | 11 +++ lib/generated/codegen_loader.g.dart | 12 +++ lib/generated/locale_keys.g.dart | 6 ++ lib/ui/landing/widget/menus_widget.dart | 5 +- .../add_leave_balance_screen.dart | 51 ++++++++++ .../leave_balance/leave_balance_screen.dart | 95 +++++++++++++++++++ 9 files changed, 223 insertions(+), 3 deletions(-) create mode 100644 lib/api/leave_balance_api_client.dart create mode 100644 lib/ui/leave_balance/add_leave_balance_screen.dart create mode 100644 lib/ui/leave_balance/leave_balance_screen.dart diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 0c6ce54..da047f3 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -339,6 +339,12 @@ "pleaseSelectEmployeeForReplacement": "الرجاء تحديد موظف للاستبدال", "pleaseSelectAction": "الرجاء تحديد الإجراء", "pleaseSelectDate": "الرجاء تحديد التاريخ", + "absenceType": "نوع الغياب", + "absenceCategory": "فئة الغياب", + "days": "أيام", + "hours": "ساعات", + "approvalStatus": "حالة القبول", + "absenceStatus": "حالة الغياب", "profile": { "reset_password": { "label": "Reset Password", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 812fa49..ad1c8ee 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -339,6 +339,12 @@ "pleaseSelectEmployeeForReplacement": "Please select employee for replacement", "pleaseSelectAction": "Please select action", "pleaseSelectDate": "Please select date", + "absenceType": "Absence Type", + "absenceCategory": "Absence Category", + "days": "Days", + "hours": "Hours", + "approvalStatus": "Approval Status", + "absenceStatus": "Absence Status", "profile": { "reset_password": { "label": "Reset Password", diff --git a/lib/api/leave_balance_api_client.dart b/lib/api/leave_balance_api_client.dart new file mode 100644 index 0000000..58158f9 --- /dev/null +++ b/lib/api/leave_balance_api_client.dart @@ -0,0 +1,34 @@ +import 'package:mohem_flutter_app/api/api_client.dart'; +import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/classes/consts.dart'; +import 'package:mohem_flutter_app/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/vacation_rule/get_vacation_rules_list_model.dart'; +import 'package:mohem_flutter_app/models/vacation_rule/vr_item_types_list_model.dart'; + +class LeaveBalanceApiClient { + static final LeaveBalanceApiClient _instance = LeaveBalanceApiClient._internal(); + + LeaveBalanceApiClient._internal(); + + factory LeaveBalanceApiClient() => _instance; + + Future> getAbsenceTransactions(int pSelectedResopID) async { + String url = "${ApiConsts.erpRest}GET_ABSENCE_TRANSACTIONS"; + Map postParams = {"P_PAGE_LIMIT": 50, "P_PAGE_NUM": 1, "P_MENU_TYPE": "E", "P_SELECTED_RESP_ID": pSelectedResopID}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getVacationRulesList ?? []; + }, url, postParams); + } + + Future> getVrItgetAbsenceAttendanceTypesemTypes() async { + String url = "${ApiConsts.erpRest}GET_ABSENCE_ATTENDANCE_TYPES"; + Map postParams = {}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.vrItemTypesList ?? []; + }, url, postParams); + } +} diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 91e4b56..a7fc29c 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -5,6 +5,8 @@ import 'package:mohem_flutter_app/ui/attendance/vacation_rule_screen.dart'; import 'package:mohem_flutter_app/ui/bottom_sheets/attendence_details_bottom_sheet.dart'; import 'package:mohem_flutter_app/ui/landing/dashboard_screen.dart'; import 'package:mohem_flutter_app/ui/landing/today_attendance_screen.dart'; +import 'package:mohem_flutter_app/ui/leave_balance/add_leave_balance_screen.dart'; +import 'package:mohem_flutter_app/ui/leave_balance/leave_balance_screen.dart'; import 'package:mohem_flutter_app/ui/login/forgot_password_screen.dart'; import 'package:mohem_flutter_app/ui/login/login_screen.dart'; import 'package:mohem_flutter_app/ui/login/new_password_screen.dart'; @@ -62,6 +64,10 @@ class AppRoutes { static const String itgDetail = "/itgDetail"; static const String itemHistory = "/itemHistory"; + // Leave Balance + static const String leaveBalance = "/leaveBalance"; + static const String addLeaveBalance = "/addLeaveBalance"; + static const String servicesMenuListScreen = "/servicesMenuListScreen"; static const String dynamicScreen = "/dynamicScreen"; static const String addDynamicInput = "/addDynamicInput"; @@ -126,6 +132,11 @@ class AppRoutes { itgDetail: (context) => ItgDetailScreen(), itemHistory: (context) => ItemHistoryScreen(), + // Leave Balance + + leaveBalance: (context) => LeaveBalance(), + addLeaveBalance: (context) => AddLeaveBalanceScreen(), + servicesMenuListScreen: (context) => ServicesMenuListScreen(), // workFromHome: (context) => WorkFromHomeScreen(), // addWorkFromHome: (context) => AddWorkFromHomeScreen(), diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 57323da..e77e32f 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -355,6 +355,12 @@ class CodegenLoader extends AssetLoader{ "pleaseSelectEmployeeForReplacement": "الرجاء تحديد موظف للاستبدال", "pleaseSelectAction": "الرجاء تحديد الإجراء", "pleaseSelectDate": "الرجاء تحديد التاريخ", + "absenceType": "نوع الغياب", + "absenceCategory": "فئة الغياب", + "days": "أيام", + "hours": "ساعات", + "approvalStatus": "حالة القبول", + "absenceStatus": "حالة الغياب", "profile": { "reset_password": { "label": "Reset Password", @@ -730,6 +736,12 @@ static const Map en_US = { "pleaseSelectEmployeeForReplacement": "Please select employee for replacement", "pleaseSelectAction": "Please select action", "pleaseSelectDate": "Please select date", + "absenceType": "Absence Type", + "absenceCategory": "Absence Category", + "days": "Days", + "hours": "Hours", + "approvalStatus": "Approval Status", + "absenceStatus": "Absence Status", "profile": { "reset_password": { "label": "Reset Password", diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index d736c34..7e679fe 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -340,6 +340,12 @@ abstract class LocaleKeys { static const pleaseSelectEmployeeForReplacement = 'pleaseSelectEmployeeForReplacement'; static const pleaseSelectAction = 'pleaseSelectAction'; static const pleaseSelectDate = 'pleaseSelectDate'; + static const absenceType = 'absenceType'; + static const absenceCategory = 'absenceCategory'; + static const days = 'days'; + static const hours = 'hours'; + static const approvalStatus = 'approvalStatus'; + static const absenceStatus = 'absenceStatus'; static const profile_reset_password_label = 'profile.reset_password.label'; static const profile_reset_password_username = 'profile.reset_password.username'; static const profile_reset_password_password = 'profile.reset_password.password'; diff --git a/lib/ui/landing/widget/menus_widget.dart b/lib/ui/landing/widget/menus_widget.dart index e386295..529e649 100644 --- a/lib/ui/landing/widget/menus_widget.dart +++ b/lib/ui/landing/widget/menus_widget.dart @@ -46,8 +46,7 @@ class MenusWidget extends StatelessWidget { ) ], ).paddingOnly(left: 10, right: 10, bottom: 6, top: 6), - ).onPress(() async { - //await data.fetchWorkListCounter(context, showLoading: true); + ).onPress(() { Navigator.pushNamed(context, AppRoutes.workList); }), data.isMissingSwipeLoading @@ -102,7 +101,7 @@ class MenusWidget extends StatelessWidget { ], ).paddingOnly(left: 10, right: 10, bottom: 6, top: 6), ).onPress(() { - Navigator.pushNamed(context, AppRoutes.workList); + Navigator.pushNamed(context, AppRoutes.leaveBalance); }), data.isLeaveTicketBalanceLoading ? MenuShimmer().onPress(() { diff --git a/lib/ui/leave_balance/add_leave_balance_screen.dart b/lib/ui/leave_balance/add_leave_balance_screen.dart new file mode 100644 index 0000000..f0b70f8 --- /dev/null +++ b/lib/ui/leave_balance/add_leave_balance_screen.dart @@ -0,0 +1,51 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; + +class AddLeaveBalanceScreen extends StatefulWidget { + AddLeaveBalanceScreen({Key? key}) : super(key: key); + + @override + _AddLeaveBalanceScreenState createState() { + return _AddLeaveBalanceScreenState(); + } +} + +class _AddLeaveBalanceScreenState extends State { + @override + void initState() { + super.initState(); + getAbsenceAttendanceTypes(); + } + + void getAbsenceAttendanceTypes() async { + try { + Utils.showLoading(context); + var bac = await LeaveBalanceApiClient().getAbsenceTransactions(-999); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: LocaleKeys.leaveBalance.tr(), + ), + ); + } +} diff --git a/lib/ui/leave_balance/leave_balance_screen.dart b/lib/ui/leave_balance/leave_balance_screen.dart new file mode 100644 index 0000000..7dd4c29 --- /dev/null +++ b/lib/ui/leave_balance/leave_balance_screen.dart @@ -0,0 +1,95 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; + +class LeaveBalance extends StatefulWidget { + LeaveBalance({Key? key}) : super(key: key); + + @override + _LeaveBalanceState createState() { + return _LeaveBalanceState(); + } +} + +class _LeaveBalanceState extends State { + List list = []; + + @override + void initState() { + super.initState(); + getAbsenceTransactions(); + } + + @override + void dispose() { + super.dispose(); + } + + void getAbsenceTransactions() async { + try { + Utils.showLoading(context); + var bac = await LeaveBalanceApiClient().getAbsenceTransactions(-999); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: LocaleKeys.leaveBalance.tr(), + ), + body: list == null + ? const SizedBox() + : (list!.isEmpty + ? Utils.getNoDataWidget(context) + : ListView.separated( + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.all(21), + itemBuilder: (cxt, int parentIndex) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + ItemDetailView(LocaleKeys.startDateT.tr(), ""), + ItemDetailView(LocaleKeys.endDateT.tr(), ""), + ItemDetailView(LocaleKeys.absenceType.tr(), ""), + ItemDetailView(LocaleKeys.absenceCategory.tr(), ""), + ItemDetailView(LocaleKeys.days.tr(), ""), + ItemDetailView(LocaleKeys.hours.tr(), ""), + ItemDetailView(LocaleKeys.approvalStatus.tr(), ""), + ItemDetailView(LocaleKeys.absenceStatus.tr(), ""), + ], + ).objectContainerView(), + separatorBuilder: (cxt, index) => 12.height, + itemCount: list!.length + 1)), + floatingActionButton: Container( + height: 54, + width: 54, + decoration: const BoxDecoration( + shape: BoxShape.circle, + gradient: LinearGradient(transform: GradientRotation(.83), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [ + MyColors.gradiantEndColor, + MyColors.gradiantStartColor, + ]), + ), + child: const Icon(Icons.add, color: Colors.white, size: 30), + ).onPress(() { + Navigator.pushNamed(context, AppRoutes.addLeaveBalance); + }), + ); + } +}