Merge branch 'development_haroon' into 'master'

Development haroon

See merge request Cloud_Solution/mohemm-flutter-app!50
merge-requests/49/merge
haroon amjad 2 years ago
commit 1ab2fe424e

@ -9,6 +9,7 @@ import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart';
import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart';
import 'package:mohem_flutter_app/models/start_eit_approval_process_model.dart';
import 'package:mohem_flutter_app/models/submit_eit_transaction_list_model.dart';
import 'package:mohem_flutter_app/models/worklist/resubmit_eit_response_model.dart';
class MyAttendanceApiClient {
static final MyAttendanceApiClient _instance = MyAttendanceApiClient._internal();
@ -108,6 +109,21 @@ class MyAttendanceApiClient {
}, url, postParams);
}
Future<ResubmitEITRequestResponse> reSubmitEitTransaction(String itemKey, var notifID, List<Map<String, dynamic>> list) async {
String url = "${ApiConsts.erpRest}RESUBMIT_EIT_TRANSACTION";
Map<String, dynamic> postParams = {
"P_NOTIFICATION_ID": notifID,
"P_ITEM_KEY": itemKey,
"P_EMAIL_ADDRESS": AppState().memberInformationList!.eMPLOYEEEMAILADDRESS,
"EITTransactionTBL": list
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData.resubmitEITTransactionList!; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson());
}, url, postParams);
}
Future<List<GetApprovesList>> getApproversList(String pAmeTransactionType, int pTransactionId) async {
String url = "${ApiConsts.erpRest}GET_APPROVERS_LIST";
Map<String, dynamic> postParams = {

@ -23,6 +23,7 @@ import 'package:mohem_flutter_app/models/itg_forms_models/itg_request_model.dart
import 'package:mohem_flutter_app/models/member_information_list_model.dart';
import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart';
import 'package:mohem_flutter_app/models/update_user_item_type_list.dart';
import 'package:mohem_flutter_app/models/worklist/GetRFCEmployeeList.dart';
import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart';
import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart';
import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart';
@ -88,6 +89,16 @@ class WorkListApiClient {
}, url, postParams);
}
Future<List<GetRFCEmployeeList>> getRFCEmployeeeList(int pNotificationID) async {
String url = "${ApiConsts.erpRest}GET_RFC_EMPLOYEE_LIST";
Map<String, dynamic> postParams = {"P_NOTIFICATION_ID": pNotificationID, "P_PAGE_NUM": 1, "P_PAGE_LIMIT": 10};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData.getRFCEmployeeListList ?? [];
}, url, postParams);
}
Future<List<GetActionHistoryList>> getActionHistory(int pNotificationID) async {
String url = "${ApiConsts.erpRest}GET_ACTION_HISTORY";
Map<String, dynamic> postParams = {
@ -357,7 +368,7 @@ class WorkListApiClient {
}, url, postParams);
}
Future<ITGRequest?> delegateITGRequest(String requestType, int taskId, int itemId, String employeeNumber,String newUserEMPId, String comments) async {
Future<ITGRequest?> delegateITGRequest(String requestType, int taskId, int itemId, String employeeNumber, String newUserEMPId, String comments) async {
String url = "${ApiConsts.cocRest}ITGDelegateRequest";
Map<String, dynamic> postParams = {
"RequestType": requestType,
@ -373,7 +384,26 @@ class WorkListApiClient {
return responseData.itgRequest;
}, url, postParams);
}
Future<ITGRequest?> informationITGRequest(String requestType, int taskId, int itemId, String employeeNumber,String newUserEMPId, String comments) async {
// ANSWER = 'Services/COCWS.svc/REST/ITGAnswer';
Future<ITGRequest?> answerITGRequest(String requestType, int taskId, int itemId, String employeeNumber, String newUserEMPId, String comments) async {
String url = "${ApiConsts.cocRest}ITGAnswer";
Map<String, dynamic> postParams = {
"RequestType": requestType,
"TaskID": taskId,
"ItemID": itemId,
"EmployeeNumber": employeeNumber,
"Comments": comments,
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
ItgFormsModel responseData = ItgFormsModel.fromJson(json);
return responseData.itgRequest;
}, url, postParams);
}
Future<ITGRequest?> informationITGRequest(String requestType, int taskId, int itemId, String employeeNumber, String newUserEMPId, String comments) async {
String url = "${ApiConsts.cocRest}ITGRequestInformation";
Map<String, dynamic> postParams = {
"RequestType": requestType,
@ -481,6 +511,16 @@ class WorkListApiClient {
}, url, postParams);
}
Future<List<GetFavoriteReplacements>?> getFavoriteReplacementWithImageNew(String selectedFavLetter) async {
String url = "${ApiConsts.erpRest}Mohemm_GetFavoriteReplacements_Images";
Map<String, dynamic> postParams = {"ItgFilter": selectedFavLetter};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData.mohemmGetFavoriteReplacementsList;
}, url, postParams);
}
Future<GenericResponseModel> changeFavoriteReplacements({required String email, required String employeName, required String image, required String userName, bool isFav = false}) async {
String url = "${ApiConsts.erpRest}Mohemm_ChangeFavoriteReplacements";
Map<String, dynamic> postParamsObj = {
@ -516,7 +556,7 @@ class WorkListApiClient {
}, url, postParams);
}
Future<GenericResponseModel> submitComment({String? comment, String? email, String? userId, int? notificationId, required String apiMode}) async {
Future<GenericResponseModel> submitComment({String? comment, String? email, String? userId, int? notificationId, required String apiMode, int? approverIndex = null}) async {
String url = "${ApiConsts.erpRest}NOTIFICATION_ACTIONS";
Map<String, dynamic> postParams = {
"P_COMMENTS": comment,
@ -524,7 +564,7 @@ class WorkListApiClient {
"P_EMAIL_ADDRESS": email,
"P_FORWARD_TO_USER_NAME": userId,
"P_NOTIFICATION_ID": notificationId,
"P_APPROVER_INDEX": null,
"P_APPROVER_INDEX": approverIndex,
"RespondAttributeList": []
};
postParams.addAll(AppState().postParamsJson);

File diff suppressed because one or more lines are too long

@ -99,12 +99,14 @@ import 'package:mohem_flutter_app/models/vacation_rule/respond_attributes_list_m
import 'package:mohem_flutter_app/models/vacation_rule/vr_item_types_list_model.dart';
import 'package:mohem_flutter_app/models/vacation_rule/wf_look_up_list_model.dart';
import 'package:mohem_flutter_app/models/validate_eit_transaction_list_model.dart';
import 'package:mohem_flutter_app/models/worklist/GetRFCEmployeeList.dart';
import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart';
import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart';
import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart';
import 'package:mohem_flutter_app/models/worklist/hr/get_contact_notification_body_list_model.dart';
import 'package:mohem_flutter_app/models/worklist/hr/get_phones_notification_body_list_model.dart';
import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart';
import 'package:mohem_flutter_app/models/worklist/resubmit_eit_response_model.dart';
import 'package:mohem_flutter_app/models/worklist_response_model.dart';
import 'package:mohem_flutter_app/start_term_approval_process_list_model.dart';
@ -224,7 +226,7 @@ class GenericResponseModel {
GetPoNotificationBodyList? getPoNotificationBodyList;
GetPrNotificationBodyList? getPrNotificationBodyList;
List<GetQuotationAnalysisList>? getQuotationAnalysisList;
List<String>? getRFCEmployeeListList;
List<GetRFCEmployeeList>? getRFCEmployeeListList;
List<String>? getRespondAttributeValueList;
List<String>? getSITCollectionNotificationBodyList;
List<String>? getSITDFFStructureList;
@ -326,7 +328,7 @@ class GenericResponseModel {
List<RespondAttributesList>? respondAttributesList;
List<String>? respondRolesList;
String? resubmitAbsenceTransactionList;
String? resubmitEITTransactionList;
ResubmitEITRequestResponse? resubmitEITTransactionList;
String? resubmitHrTransactionList;
String? sFHGetPoNotificationBodyList;
String? sFHGetPrNotificationBodyList;
@ -975,7 +977,7 @@ class GenericResponseModel {
getQuotationAnalysisList!.add(GetQuotationAnalysisList.fromJson(v));
});
}
getRFCEmployeeListList = json['GetRFCEmployeeListList'];
getRespondAttributeValueList = json['GetRespondAttributeValueList'];
getSITCollectionNotificationBodyList = json['GetSITCollectionNotificationBodyList'];
getSITDFFStructureList = json['GetSITDFFStructureList'];
@ -986,6 +988,14 @@ class GenericResponseModel {
getScheduleShiftsDetailsList!.add(GetScheduleShiftsDetailsList.fromJson(v));
});
}
if (json['GetRFCEmployeeListList'] != null) {
getRFCEmployeeListList = <GetRFCEmployeeList>[];
json['GetRFCEmployeeListList'].forEach((v) {
getRFCEmployeeListList!.add(GetRFCEmployeeList.fromJson(v));
});
}
getShiftTypesList = json['GetShiftTypesList'];
if (json['GetStampMsNotificationBodyList'] != null) {
@ -1277,7 +1287,7 @@ class GenericResponseModel {
});
}
resubmitAbsenceTransactionList = json['ResubmitAbsenceTransactionList'];
resubmitEITTransactionList = json['ResubmitEITTransactionList'];
resubmitEITTransactionList = json['ResubmitEITTransactionList'] != null ? ResubmitEITRequestResponse.fromJson(json['ResubmitEITTransactionList']) : null;
resubmitHrTransactionList = json['ResubmitHrTransactionList'];
sFHGetPoNotificationBodyList = json['SFH_GetPoNotificationBodyList'];
sFHGetPrNotificationBodyList = json['SFH_GetPrNotificationBodyList'];

@ -0,0 +1,48 @@
class GetRFCEmployeeList {
String? aCTION;
String? eMPLOYEEDISPLAYNAME;
String? eMPLOYEEIMAGE;
int? fROMROWNUM;
int? nOOFROWS;
int? rOWNUM;
int? sEQ;
int? tOROWNUM;
String? uSERNAME;
GetRFCEmployeeList(
{this.aCTION,
this.eMPLOYEEDISPLAYNAME,
this.eMPLOYEEIMAGE,
this.fROMROWNUM,
this.nOOFROWS,
this.rOWNUM,
this.sEQ,
this.tOROWNUM,
this.uSERNAME});
GetRFCEmployeeList.fromJson(Map<String, dynamic> json) {
aCTION = json['ACTION'];
eMPLOYEEDISPLAYNAME = json['EMPLOYEE_DISPLAY_NAME'];
eMPLOYEEIMAGE = json['EMPLOYEE_IMAGE'];
fROMROWNUM = json['FROM_ROW_NUM'];
nOOFROWS = json['NO_OF_ROWS'];
rOWNUM = json['ROW_NUM'];
sEQ = json['SEQ'];
tOROWNUM = json['TO_ROW_NUM'];
uSERNAME = json['USER_NAME'];
}
Map<String, dynamic> toJson() {
Map<String, dynamic> data = new Map<String, dynamic>();
data['ACTION'] = this.aCTION;
data['EMPLOYEE_DISPLAY_NAME'] = this.eMPLOYEEDISPLAYNAME;
data['EMPLOYEE_IMAGE'] = this.eMPLOYEEIMAGE;
data['FROM_ROW_NUM'] = this.fROMROWNUM;
data['NO_OF_ROWS'] = this.nOOFROWS;
data['ROW_NUM'] = this.rOWNUM;
data['SEQ'] = this.sEQ;
data['TO_ROW_NUM'] = this.tOROWNUM;
data['USER_NAME'] = this.uSERNAME;
return data;
}
}

@ -16,10 +16,10 @@ class GetFavoriteReplacements {
this.employeeImage,
});
final String? userName;
final String? employeeDisplayName;
final String? emailAddress;
final String? employeeImage;
String? userName;
String? employeeDisplayName;
String? emailAddress;
String? employeeImage;
factory GetFavoriteReplacements.fromJson(Map<String, dynamic> json) => GetFavoriteReplacements(
userName: json["USER_NAME"] == null ? null : json["USER_NAME"],

@ -23,7 +23,7 @@ class ReplacementList {
final String? emailAddress;
final String? employeeDisplayName;
final String? employeeImage;
String? employeeImage;
final int? fromRowNum;
bool? isFavorite;
final int? noOfRows;

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

@ -1,20 +1,12 @@
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:mohem_flutter_app/classes/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/dashboard/menu_entries.dart';
import 'package:mohem_flutter_app/models/dashboard/menus.dart';
import 'package:mohem_flutter_app/models/eit/get_eit_transaction_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/provider/eit_provider_model.dart';
import 'package:mohem_flutter_app/ui/work_list/work_list_screen.dart';
import 'package:mohem_flutter_app/widgets/loading_dialog.dart';
import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart';
import 'package:provider/provider.dart';
class MissingSwipe extends StatelessWidget {

@ -62,7 +62,7 @@ class _LeaveBalanceState extends State<LeaveBalance> {
physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.all(21),
children: [
BalancesDashboardWidget(LocaleKeys.currentLeaveBalance.tr(), true),
BalancesDashboardWidget(LocaleKeys.currentLeaveBalance.tr(), true),
12.height,
absenceTransList == null
? const SizedBox()
@ -76,14 +76,23 @@ class _LeaveBalanceState extends State<LeaveBalance> {
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
ItemDetailView(LocaleKeys.startDateT.tr(), absenceTransList![index].sTARTDATE ?? ""),
ItemDetailView(LocaleKeys.endDateT.tr(), absenceTransList![index].eNDDATE ?? ""),
ItemDetailView(LocaleKeys.absenceType.tr(), absenceTransList![index].aBSENCETYPE ?? ""),
ItemDetailView(LocaleKeys.absenceCategory.tr(), absenceTransList![index].aBSENCECATEGORY ?? ""),
ItemDetailView(LocaleKeys.days.tr(), absenceTransList![index].aBSENCEDAYS?.toString() ?? ""),
ItemDetailView(LocaleKeys.hours.tr(), absenceTransList![index].aBSENCEHOURS?.toString() ?? ""),
ItemDetailView(LocaleKeys.approvalStatus.tr(), absenceTransList![index].aPPROVALSTATUS ?? ""),
ItemDetailView(LocaleKeys.absenceStatus.tr(), absenceTransList![index].aBSENCESTATUS ?? ""),
ItemDetailGrid(
ItemDetailViewCol(LocaleKeys.startDateT.tr(), absenceTransList![index].sTARTDATE ?? ""),
ItemDetailViewCol(LocaleKeys.endDateT.tr(), absenceTransList![index].eNDDATE ?? ""),
),
ItemDetailGrid(
ItemDetailViewCol(LocaleKeys.absenceType.tr(), absenceTransList![index].aBSENCETYPE ?? ""),
ItemDetailViewCol(LocaleKeys.absenceCategory.tr(), absenceTransList![index].aBSENCECATEGORY ?? ""),
),
ItemDetailGrid(
ItemDetailViewCol(LocaleKeys.days.tr(), absenceTransList![index].aBSENCEDAYS?.toString() ?? ""),
ItemDetailViewCol(LocaleKeys.hours.tr(), absenceTransList![index].aBSENCEHOURS?.toString() ?? ""),
),
ItemDetailGrid(
ItemDetailViewCol(LocaleKeys.approvalStatus.tr(), absenceTransList![index].aPPROVALSTATUS ?? ""),
ItemDetailViewCol(LocaleKeys.absenceStatus.tr(), absenceTransList![index].aBSENCESTATUS ?? ""),
isItLast: true,
),
],
).objectContainerView(),
separatorBuilder: (cxt, index) => 12.height,

@ -58,7 +58,8 @@ class _VerifyLastLoginScreenState extends State<VerifyLastLoginScreen> {
@override
Widget build(BuildContext context) {
mobileLoginInfoListModel ??= ModalRoute.of(context)!.settings.arguments as GetMobileLoginInfoListModel;
String empName = AppState().isArabic(context) ? AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr! : AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn!;
// String empName = AppState().isArabic(context) ? AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr! : AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn!;
String empName = mobileLoginInfoListModel!.employeeName!;
return Scaffold(
appBar: AppBar(
@ -68,7 +69,7 @@ class _VerifyLastLoginScreenState extends State<VerifyLastLoginScreen> {
? LocaleKeys.viewBusinessCard.tr().toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {
showMDialog(context, child: BusinessCardDialog());
})
: null,
: Container(),
actions: [
Center(
child: LocaleKeys.employeeDigitalID.tr().toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {

@ -6,6 +6,7 @@ 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/models/get_eit_transaction_list_model.dart';
import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/balances_dashboard_widget.dart';
import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart';
@ -16,8 +17,10 @@ class DynamicListViewParams {
String uRL;
String requestID;
String colsURL;
bool isUpdate;
List<CollectionNotificationEit>? collectionNotificationList;
DynamicListViewParams(this.title, this.dynamicId, {this.uRL = 'GET_EIT_DFF_STRUCTURE', this.requestID = '', this.colsURL = ''});
DynamicListViewParams(this.title, this.dynamicId, {this.uRL = 'GET_EIT_DFF_STRUCTURE', this.requestID = '', this.colsURL = '', this.isUpdate = false, this.collectionNotificationList});
}
class DynamicListViewScreen extends StatefulWidget {
@ -62,6 +65,17 @@ class _DynamicListViewScreenState extends State<DynamicListViewScreen> {
late bool isTicketRequest;
List<Widget> getEITWidgetsList(List<CollectionTransaction>? collectionTransaction) {
List<Widget> itemsList = [];
for (int t = 0; t < (collectionTransaction ?? []).length; t++) {
if (collectionTransaction![t].dISPLAYFLAG == "Y") {
itemsList.add(ItemDetailViewCol(collectionTransaction[t].sEGMENTPROMPT!, collectionTransaction[t].sEGMENTVALUEDSP ?? ""));
}
}
return itemsList;
}
@override
Widget build(BuildContext context) {
if (dynamicParams == null) {
@ -84,16 +98,45 @@ class _DynamicListViewScreenState extends State<DynamicListViewScreen> {
shrinkWrap: true,
itemBuilder: (cxt, int parentIndex) => getEITTransactionList![parentIndex].collectionTransaction!.isEmpty
? const SizedBox()
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
for (int t = 0; t < (getEITTransactionList![parentIndex].collectionTransaction ?? []).length; t++)
if (getEITTransactionList![parentIndex].collectionTransaction![t].dISPLAYFLAG == "Y")
ItemDetailView(getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTPROMPT!,
getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTVALUEDSP ?? ""),
],
: GridView(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 1.9 / 0.75),
padding: const EdgeInsets.all(12.0),
shrinkWrap: true,
primary: false,
physics: const ScrollPhysics(),
children: getEITWidgetsList(getEITTransactionList![parentIndex].collectionTransaction),
).objectContainerView(),
// Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// mainAxisSize: MainAxisSize.min,
// children: [
// for (int t = 0; t < (getEITTransactionList![parentIndex].collectionTransaction ?? []).length; t++)
// if (getEITTransactionList![parentIndex].collectionTransaction![t].dISPLAYFLAG == "Y")
// // ItemDetailView(getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTPROMPT!,
// // getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTVALUEDSP ?? ""),
// // GridView(
// // gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
// // padding: const EdgeInsets.only(left: 21, right: 21, bottom: 21, top: 12),
// // shrinkWrap: true,
// // primary: false,
// // physics: const ScrollPhysics(),
// // children: getEITWidgetsList(getEITTransactionList![parentIndex].collectionTransaction),
// // )
// // ItemDetailViewCol(getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTPROMPT!,
// // getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTVALUEDSP ?? ""),
//
// // GridView(
// // gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
// // padding: const EdgeInsets.only(left: 21, right: 21, bottom: 21, top: 12),
// // shrinkWrap: true,
// // primary: false,
// // physics: const ScrollPhysics(),
// // children: getEITWidgetsList(getEITTransactionList![parentIndex].collectionTransaction),
// // )
// // ItemDetailView(getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTPROMPT!,
// // getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTVALUEDSP ?? ""),
// ],
// ).objectContainerView(),
separatorBuilder: (cxt, index) => 12.height,
itemCount: getEITTransactionList!.length)),
],

@ -1,4 +1,5 @@
import 'dart:convert';
import 'dart:io';
import 'dart:ui';
import 'package:easy_localization/easy_localization.dart';
@ -16,6 +17,7 @@ import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart';
import 'package:mohem_flutter_app/models/member_information_list_model.dart';
import 'package:mohem_flutter_app/ui/profile/widgets/profile_panel.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/image_picker.dart';
class ProfileScreen extends StatefulWidget {
const ProfileScreen({Key? key}) : super(key: key);
@ -28,6 +30,7 @@ class _ProfileScreenState extends State<ProfileScreen> {
late MemberInformationListModel memberInformationList;
final ImagePicker _picker = ImagePicker();
List<GetEmployeeBasicDetailsList> getEmployeeBasicDetailsList = [];
List<String> images = [];
@override
void initState() {
@ -46,24 +49,25 @@ class _ProfileScreenState extends State<ProfileScreen> {
children: [
memberInformationList!.eMPLOYEEIMAGE != null
? Container(
height: 300,
margin: const EdgeInsets.only(top: 50),
decoration: BoxDecoration(
image: DecorationImage(
image: MemoryImage(
Utils.dataFromBase64String(memberInformationList.eMPLOYEEIMAGE!),
height: 300,
margin: const EdgeInsets.only(top: 50),
decoration: BoxDecoration(
image: DecorationImage(
image: MemoryImage(
Utils.dataFromBase64String(memberInformationList.eMPLOYEEIMAGE!),
),
fit: BoxFit.cover),
),
fit: BoxFit.cover),
),
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
child: Container(
color: Colors.white.withOpacity(0.0),
),
),
): Container(
decoration: BoxDecoration(color: Colors.white.withOpacity(0.0)),
),
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
child: Container(
color: Colors.white.withOpacity(0.0),
),
),
)
: Container(
decoration: BoxDecoration(color: Colors.white.withOpacity(0.0)),
),
SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Column(
@ -83,7 +87,14 @@ class _ProfileScreenState extends State<ProfileScreen> {
),
InkWell(
onTap: () {
startImageSheet();
// startImageSheet();
ImageOptions.showImageOptionsNew(context, false, (String image, File file) {
setState(() {
// images.add(image);
Navigator.of(context).pop();
openGallery(image);
});
});
},
child: Container(
padding: const EdgeInsets.only(left: 17, right: 17, top: 8, bottom: 8),
@ -112,7 +123,8 @@ class _ProfileScreenState extends State<ProfileScreen> {
}
void startImageSheet() {
showMyBottomSheet(context, callBackFunc: (){},
showMyBottomSheet(context,
callBackFunc: () {},
child: Column(
children: [
Container(
@ -123,14 +135,14 @@ class _ProfileScreenState extends State<ProfileScreen> {
)),
BottomSheetItem(
onTap: () {
openGallery(false);
// openGallery(false);
},
title: 'Open Gallery',
icon: Icons.browse_gallery_outlined,
),
BottomSheetItem(
onTap: () {
openGallery(true);
// openGallery(true);
},
title: 'Open Camera',
icon: Icons.camera,
@ -139,19 +151,17 @@ class _ProfileScreenState extends State<ProfileScreen> {
));
}
void openGallery(bool isCamera) async {
XFile? image = await _picker.pickImage(source: isCamera ? ImageSource.camera : ImageSource.gallery);
void openGallery(String image) async {
// XFile? image = await _picker.pickImage(source: isCamera ? ImageSource.camera : ImageSource.gallery);
if (image != null) {
String img = base64.encode(await image!.readAsBytes());
Utils.showLoading(context);
dynamic empImageUpdteResp = await ProfileApiClient().updateEmpImage(img);
Utils.hideLoading(context);
if (empImageUpdteResp['P_RETURN_STATUS'] == 'S') {
setState(() {
memberInformationList.eMPLOYEEIMAGE = img;
});
}
// String img = base64.encode(await image!.readAsBytes());
Utils.showLoading(context);
dynamic empImageUpdteResp = await ProfileApiClient().updateEmpImage(image);
Utils.hideLoading(context);
if (empImageUpdteResp['P_RETURN_STATUS'] == 'S') {
setState(() {
memberInformationList.eMPLOYEEIMAGE = image;
});
}
}
}

@ -127,7 +127,10 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
},
children: [
RequestDetailFragment(fields: itgRequest?.fieldGoups?[1].fields ?? []),
ApprovalLevelfragment(wFHistory: itgRequest?.wFHistory ?? [], voidCallback: reloadITG,),
ApprovalLevelfragment(
wFHistory: itgRequest?.wFHistory ?? [],
voidCallback: reloadITG,
),
RequestDetailFragment(fields: itgRequest?.fieldGoups?[0].fields ?? []),
],
).expanded,
@ -256,24 +259,106 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
if (allowedActionList[i].action! == "Reject" || allowedActionList[i].action! == "Approve" || allowedActionList[i].action! == "CLOSE") {
continue;
}
fabs.add(myFab(allowedActionList[i].action!, "", isIconAsset: false).paddingOnly(bottom: 12).onPress(() => handleFabAction(allowedActionList[i])));
fabs.add(myFab(getFabActionTitle(allowedActionList[i].action!), getFabActionImages(allowedActionList[i].action!)).paddingOnly(bottom: 12).onPress(() => handleFabAction(allowedActionList[i])));
}
return fabs;
}
String getFabActionImages(String actionTitle) {
String returnActionImage = "";
switch (actionTitle) {
case "Delegate":
returnActionImage = "assets/images/delegate.svg";
break;
case "RequestInformation":
returnActionImage = "assets/images/request_info.svg";
break;
case "ReportGenerated":
returnActionImage = "assets/images/request_info.svg";
break;
case "DataCorrected":
returnActionImage = "assets/images/request_info.svg";
break;
case "Doable":
returnActionImage = "assets/images/request_info.svg";
break;
case "NotDoable":
returnActionImage = "assets/images/request_info.svg";
break;
default:
returnActionImage = "assets/images/request_info.svg";
break;
}
return returnActionImage;
}
String getFabActionTitle(String title) {
String returnTitle = "";
switch (title) {
case "Delegate":
returnTitle = "Delegate";
break;
case "RequestInformation":
returnTitle = "Request Information";
break;
case "ReportGenerated":
returnTitle = "Report Generated";
break;
case "DataCorrected":
returnTitle = "Data Corrected";
break;
case "Doable":
returnTitle = "Doable";
break;
case "NotDoable":
returnTitle = "Not Doable";
break;
default:
returnTitle = title;
break;
}
return returnTitle;
}
void handleFabAction(AllowedActions action) {
print(action.toJson());
switch (action.action) {
case "Delegate":
showMyBottomSheet(context, callBackFunc: reloadITG,
child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? [], callBackFunc: reloadITG,));
showMyBottomSheet(context,
callBackFunc: reloadITG,
child: DelegateSheet(
title: LocaleKeys.delegate.tr(),
apiMode: action.action!,
notificationID: null,
actionHistoryList: null,
wFHistory: itgRequest?.wFHistory ?? [],
callBackFunc: reloadITG,
));
break;
case "RequestInformation":
showMyBottomSheet(context, callBackFunc: reloadITG,
child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? [], callBackFunc: reloadITG,));
showMyBottomSheet(context,
callBackFunc: reloadITG,
child: DelegateSheet(
title: LocaleKeys.request_info.tr(),
apiMode: action.action!,
notificationID: null,
actionHistoryList: null,
wFHistory: itgRequest?.wFHistory ?? [],
callBackFunc: reloadITG,
));
break;
case "Doable":
performAction("APPROVED");
break;
case "NotDoable":
performAction("REJECTED");
break;
case "Answer":
performAction("Answer");
break;
case "RFC":
// do something else
break;
@ -356,6 +441,8 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
onTap: (note) {
if (actionMode == "APPROVED") {
performApproveAction(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", note);
} else if (actionMode == "Answer") {
performAnswerAction(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", note);
} else {
performRejectAction(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", note);
}
@ -364,6 +451,30 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
);
}
void performAnswerAction(String requestType, int taskId, int itemId, String employeeNumber, String comments) async {
try {
Utils.showLoading(context);
ITGRequest? itgRequest = await WorkListApiClient().answerITGRequest(requestType, taskId, itemId, employeeNumber, "", comments);
Utils.hideLoading(context);
Utils.showToast(LocaleKeys.yourChangeHasBeenSavedSuccessfully.tr());
// Navigator.pop(context, "delegate_reload");
AppState().requestAllList!.removeAt(AppState().itgWorkListIndex!);
if (AppState().requestAllList!.isEmpty) {
Navigator.pop(context, "delegate_reload");
} else {
if (AppState().requestAllList!.length <= AppState().itgWorkListIndex!) {
Navigator.pop(context, "delegate_reload");
} else {
requestDetails = null;
getDataFromState();
}
}
} catch (ex) {
Utils.hideLoading(context);
Utils.handleException(ex, context, null);
}
}
void performRejectAction(String requestType, int taskId, int itemId, String employeeNumber, String comments) async {
try {
Utils.showLoading(context);
@ -425,5 +536,4 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
}
}
}
}

@ -138,7 +138,8 @@ class ApprovalLevelfragment extends StatelessWidget {
} else if (code.toLowerCase() == "approved" ||
code.toLowerCase() == "auto-approve" ||
code.toLowerCase() == "auto-approved" ||
code.toLowerCase() == "doable") {
code.toLowerCase() == "doable" ||
code.toLowerCase() == "answer") {
return MyColors.greenColor;
} else if (code.toLowerCase() == "requested information" || code.toLowerCase() == "assign" || code.toLowerCase() == "reassign") {
return MyColors.orange;

@ -47,6 +47,8 @@ class _DelegateSheetState extends State<DelegateSheet> {
List<GetFavoriteReplacements>? favUsersList;
List<ReplacementList>? replacementList;
bool isImageLoaded = false;
@override
void initState() {
super.initState();
@ -91,6 +93,17 @@ class _DelegateSheetState extends State<DelegateSheet> {
favUsersList = await WorkListApiClient().getFavoriteReplacementWithImage(selectedFavLetter ?? "");
if (isNeedLoading) Utils.hideLoading(context);
setState(() {});
fetchFavUsersListNew(isNeedLoading: false);
return null;
}
Future fetchFavUsersListNew({bool isNeedLoading = true}) async {
if (isNeedLoading) Utils.showLoading(context);
favUsersList = await WorkListApiClient().getFavoriteReplacementWithImageNew(selectedFavLetter ?? "");
if (isNeedLoading) Utils.hideLoading(context);
setState(() {
isImageLoaded = true;
});
return null;
}
@ -195,7 +208,7 @@ class _DelegateSheetState extends State<DelegateSheet> {
).onPress(() {
showMyBottomSheet(
context,
callBackFunc: (){},
callBackFunc: () {},
child: SearchOptionsSheet(
selectedType,
onSelection: (String value) {
@ -401,6 +414,7 @@ class _DelegateSheetState extends State<DelegateSheet> {
apiMode: widget.apiMode,
actionHistoryList: actionHistory,
notificationID: widget.notificationID,
isITGRequest: widget.wFHistory != null,
));
},
child: Row(
@ -474,16 +488,35 @@ class _DelegateSheetState extends State<DelegateSheet> {
apiMode: widget.apiMode,
favoriteReplacements: actionHistory,
notificationID: widget.notificationID,
isITGRequest: widget.wFHistory != null,
));
},
child: Row(
children: [
CircularAvatar(
url: actionHistory.employeeImage,
height: 30,
width: 30,
isImageBase64: (actionHistory.employeeImage != null || actionHistory.employeeImage!.isNotEmpty) ? true : false,
),
actionHistory.employeeImage != ""
? CircularAvatar(
url: actionHistory.employeeImage,
height: 40,
width: 40,
isImageBase64: (actionHistory.employeeImage != null || actionHistory.employeeImage!.isNotEmpty) ? true : false,
)
: isImageLoaded
? CircularAvatar(
height: 40,
width: 40,
isImageBase64: false,
)
: ClipRRect(
borderRadius: const BorderRadius.all(
Radius.circular(50),
),
child: Image.network(
"https://play-lh.googleusercontent.com/NPo88ojmhah4HDiposucJmfQIop4z4xc8kqJK9ITO9o-yCab2zxIp7PPB_XPj2iUojo",
fit: BoxFit.cover,
height: 40,
width: 40,
).toShimmer(),
),
16.width,
Expanded(
child: (actionHistory.employeeDisplayName ?? "").toText12(),
@ -521,6 +554,7 @@ class _DelegateSheetState extends State<DelegateSheet> {
apiMode: widget.apiMode,
replacementList: actionHistory,
notificationID: widget.notificationID,
isITGRequest: widget.wFHistory != null,
));
},
child: Row(

@ -1,12 +1,15 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/worklist/worklist_api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/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/member_information_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';
@ -19,8 +22,11 @@ class SelectedItemSheet extends StatelessWidget {
GetActionHistoryList? actionHistoryList;
GetFavoriteReplacements? favoriteReplacements;
ReplacementList? replacementList;
MemberInformationListModel? memberInformationListModel;
SelectedItemSheet(this.title, {required this.apiMode, this.notificationID, this.actionHistoryList, this.favoriteReplacements, this.replacementList});
bool isITGRequest;
SelectedItemSheet(this.title, {required this.apiMode, this.notificationID, this.actionHistoryList, this.favoriteReplacements, this.replacementList, this.isITGRequest = false});
TextEditingController username = TextEditingController();
String comment = "";
@ -41,9 +47,9 @@ class SelectedItemSheet extends StatelessWidget {
children: [
title.toText24(isBold: true),
21.height,
if (actionHistoryList != null) showItem(actionHistoryList!.nAME, actionHistoryList!.isFavorite),
if (favoriteReplacements != null) showItem(favoriteReplacements!.employeeDisplayName, true),
if (replacementList != null) showItem(replacementList!.employeeDisplayName, replacementList!.isFavorite),
if (actionHistoryList != null) showItem(actionHistoryList!.nAME, context, actionHistoryList!.isFavorite),
if (favoriteReplacements != null) showItem(favoriteReplacements!.employeeDisplayName, context, true),
if (replacementList != null) showItem(replacementList!.employeeDisplayName, context, replacementList!.isFavorite),
14.height,
InputWidget(
"Enter a note",
@ -97,7 +103,7 @@ class SelectedItemSheet extends StatelessWidget {
email = replacementList!.emailAddress;
userId = replacementList!.userName;
}
performNetworkCall(context, email: email ?? "", userId: userId ?? "");
isITGRequest ? performITGNetworkCall(context, email: email ?? "", userId: userId ?? "") : performNetworkCall(context, email: email ?? "", userId: userId ?? "");
} else {
Utils.showToast("Please enter comments");
}
@ -115,10 +121,26 @@ class SelectedItemSheet extends StatelessWidget {
);
}
void getUserInformation(BuildContext context) async {
String? empID = "";
if (actionHistoryList != null) empID = actionHistoryList!.uSERNAME;
if (favoriteReplacements != null) empID = favoriteReplacements!.userName;
if (replacementList != null) empID = replacementList!.userName;
try {
memberInformationListModel = await WorkListApiClient().getUserInformation(-999, empID!);
if (actionHistoryList != null) empID = actionHistoryList!.eMPLOYEEIMAGE = memberInformationListModel!.eMPLOYEEIMAGE ?? AppState().getBase64ImageEmp;
if (favoriteReplacements != null) empID = favoriteReplacements!.employeeImage = memberInformationListModel!.eMPLOYEEIMAGE ?? AppState().getBase64ImageEmp;
if (replacementList != null) empID = replacementList!.employeeImage = memberInformationListModel!.eMPLOYEEIMAGE ?? AppState().getBase64ImageEmp;
(context as Element).markNeedsBuild();
} catch (ex) {
Utils.handleException(ex, context, null);
}
}
Future<void> performNetworkCall(BuildContext context, {String? email, String? userId}) async {
Utils.showLoading(context);
try {
await WorkListApiClient().submitComment(comment: comment, email: email, userId: userId, notificationId: notificationID, apiMode: apiMode);
await WorkListApiClient().submitComment(comment: comment, email: email, userId: userId, notificationId: notificationID, apiMode: apiMode, approverIndex: actionHistoryList!.sEQUENCE);
Utils.hideLoading(context);
// Navigator.pop(context);
// Navigator.pop(context);
@ -129,30 +151,79 @@ class SelectedItemSheet extends StatelessWidget {
}
}
Widget showItem(String? name, bool? isFav) {
Future<void> performITGNetworkCall(BuildContext context, {String? email, String? userId}) async {
Utils.showLoading(context);
try {
var requestDetails = AppState().requestAllList![AppState().itgWorkListIndex!];
if (apiMode == "Delegate") {
await WorkListApiClient().delegateITGRequest(requestDetails.requestType!, requestDetails.iD!, requestDetails.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "",
isITGRequest ? favoriteReplacements!.userName! : actionHistoryList!.uSERNAME!, comment);
} else if (apiMode == "RequestInformation") {
await WorkListApiClient().informationITGRequest(requestDetails.requestType!, requestDetails.iD!, requestDetails.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "",
isITGRequest ? favoriteReplacements!.userName! : actionHistoryList!.uSERNAME!, comment);
} else if (apiMode == "Answer") {
await WorkListApiClient().answerITGRequest(requestDetails.requestType!, requestDetails.iD!, requestDetails.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "",
isITGRequest ? favoriteReplacements!.userName! : actionHistoryList!.uSERNAME!, comment);
}
Utils.hideLoading(context);
Navigator.pop(context, "delegate_reload");
} catch (ex) {
Utils.hideLoading(context);
Utils.handleException(ex, context, null);
}
}
Widget showItem(String? name, BuildContext context, bool? isFav) {
if (actionHistoryList != null) {
if (actionHistoryList!.eMPLOYEEIMAGE == null || actionHistoryList!.eMPLOYEEIMAGE == "") {
// getUserInformation(context);
}
}
if (favoriteReplacements != null) {
if (favoriteReplacements!.employeeImage == null || favoriteReplacements!.employeeImage == "") {
// getUserInformation(context);
}
}
if (replacementList != null) {
if (replacementList!.employeeImage == null || replacementList!.employeeImage == "") {
// getUserInformation(context);
}
}
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
color: Color(0xffF7F7F7),
color: const Color(0xffF7F7F7),
border: Border.all(
color: Color(0xffefefef),
color: const Color(0xffefefef),
width: 1,
),
),
padding: EdgeInsets.only(top: 16, bottom: 16, left: 21, right: 21),
padding: const EdgeInsets.only(top: 16, bottom: 16, left: 21, right: 21),
child: Row(
children: [
(actionHistoryList != null && actionHistoryList!.eMPLOYEEIMAGE != null)
? CircularAvatar(
height: 30,
width: 30,
url: actionHistoryList!.eMPLOYEEIMAGE,
isImageBase64: true,
)
: CircularAvatar(
height: 30,
width: 30,
),
(isFav != null && isFav && favoriteReplacements != null)
? favoriteReplacements!.employeeImage != ""
? CircularAvatar(
height: 40,
width: 40,
url: favoriteReplacements != null ? favoriteReplacements!.employeeImage : actionHistoryList!.eMPLOYEEIMAGE,
isImageBase64: true,
)
: CircularAvatar(
height: 40,
width: 40,
).toShimmer()
: (actionHistoryList != null && actionHistoryList!.eMPLOYEEIMAGE != null)
? CircularAvatar(
height: 40,
width: 40,
url: actionHistoryList!.eMPLOYEEIMAGE,
isImageBase64: true,
)
: CircularAvatar(
height: 40,
width: 40,
).toShimmer(),
16.width,
Expanded(
child: (name ?? "").toText12(),

@ -126,10 +126,11 @@ class SelectedItgItemSheet extends StatelessWidget {
} else if (apiMode == "RequestInformation") {
await WorkListApiClient()
.informationITGRequest(requestDetails.requestType!, requestDetails.iD!, requestDetails.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", wfHistory.employeeID!, comment);
} else if (apiMode == "Answer") {
await WorkListApiClient()
.answerITGRequest(requestDetails.requestType!, requestDetails.iD!, requestDetails.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", wfHistory.employeeID!, comment);
}
Utils.hideLoading(context);
// Navigator.pop(context);
// Navigator.pop(context);
Navigator.pop(context, "delegate_reload");
} catch (ex) {
Utils.hideLoading(context);

@ -0,0 +1,131 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/my_attendance_api_client.dart';
import 'package:mohem_flutter_app/classes/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/worklist/hr/eit_otification_body_model.dart';
import 'package:mohem_flutter_app/models/worklist/resubmit_eit_response_model.dart';
import 'package:mohem_flutter_app/models/worklist_response_model.dart';
import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart';
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart';
class UpdateContinueSheet extends StatefulWidget {
WorkListResponseModel? workListData;
List<GetEitCollectionNotificationBodyList>? getEitCollectionNotificationBodyList;
DynamicListViewParams? dynamicParams;
UpdateContinueSheet({this.workListData, this.getEitCollectionNotificationBodyList, this.dynamicParams, Key? key}) : super(key: key);
@override
State<UpdateContinueSheet> createState() => _UpdateContinueSheetState();
}
class _UpdateContinueSheetState extends State<UpdateContinueSheet> {
double itemHeight = 0;
double itemWidth = 0;
@override
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;
itemHeight = (size.height - kToolbarHeight - 24) / 9;
itemWidth = size.width / 2;
return Column(
children: [
if ((widget.workListData?.sUBJECT ?? "").isNotEmpty) widget.workListData!.sUBJECT!.toText14().paddingOnly(top: 10, right: 21, left: 21, bottom: 21),
ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (cxt, index) {
List<CollectionNotificationEit> dataList = widget.getEitCollectionNotificationBodyList!.isEmpty ? [] : (widget.getEitCollectionNotificationBodyList![index].collectionNotification ?? []);
dataList = dataList.where((o) => o.displayFlag == "Y").toList();
bool isOdd = false;
if (dataList.length % 2 != 0) {
isOdd = true;
dataList.add(new CollectionNotificationEit());
}
return GridView.builder(
itemCount: dataList.length,
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) => ItemDetailViewGridItem(
index,
dataList[index].segmentPrompt,
dataList[index].segmentValueDsp,
isNeedToShowEmptyDivider: (dataList.length == index + 1)
? isOdd
? true
: false
: false,
),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: (itemWidth / itemHeight),
),
).objectContainerView();
},
separatorBuilder: (cxt, index) => 12.height,
itemCount: widget.getEitCollectionNotificationBodyList!.length,
),
Padding(
padding: const EdgeInsets.only(right: 21, left: 21, bottom: 21),
child: Row(
children: [
DefaultButton(
LocaleKeys.edit.tr(),
() => performEditAction(),
colors: const [Color(0xffE47A7E), Color(0xffDE6D71)],
).expanded,
8.width,
DefaultButton(
LocaleKeys.next.tr(),
() => performNextAction(),
colors: const [Color(0xff28C884), Color(0xff1BB271)],
).expanded,
],
),
),
],
);
}
void performNextAction() async {
//Resubmit EIT Transaction
try {
Utils.showLoading(context);
List<Map<String, dynamic>> values = [];
for (GetEitCollectionNotificationBodyList element in widget.getEitCollectionNotificationBodyList!) {
for (CollectionNotificationEit collectionElement in element.collectionNotification!) {
values.add({
"TRANSACTION_NUMBER": collectionElement.transactionNumber,
"NAME": collectionElement.applicationColumnName,
"VARCHAR2_VALUE": collectionElement.varchar2Value,
"NUMBER_VALUE": collectionElement.numberValue,
"DATE_VALUE": collectionElement.dateValue,
});
}
}
ResubmitEITRequestResponse resubmitEITRequestResponse = await MyAttendanceApiClient().reSubmitEitTransaction(widget.workListData!.iTEMKEY!, widget.workListData!.nOTIFICATIONID, values);
Utils.hideLoading(context);
await Navigator.pushNamed(
context,
AppRoutes.requestSubmitScreen,
arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), resubmitEITRequestResponse.pTRANSACTIONID!, widget.workListData!.iTEMKEY!, 'eit'),
);
} catch (ex) {
Utils.hideLoading(context);
Utils.handleException(ex, context, null);
}
}
void performEditAction() {
//Open EIT Edit Screen
Navigator.pushNamed(context, AppRoutes.addDynamicInput, arguments: widget.dynamicParams);
}
}

@ -23,12 +23,16 @@ import 'package:mohem_flutter_app/models/get_stamp_ms_notification_body_list_mod
import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_model.dart';
import 'package:mohem_flutter_app/models/member_information_list_model.dart';
import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart';
import 'package:mohem_flutter_app/models/worklist/GetRFCEmployeeList.dart';
import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart';
import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart';
import 'package:mohem_flutter_app/models/worklist/hr/get_contact_notification_body_list_model.dart';
import 'package:mohem_flutter_app/models/worklist/hr/get_phones_notification_body_list_model.dart';
import 'package:mohem_flutter_app/models/worklist_response_model.dart';
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/delegate_sheet.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/selected_item_sheet.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/update_continue_sheet.dart';
import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/actions_fragment.dart';
import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/attachments_fragment.dart';
import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/detail_fragment.dart';
@ -65,6 +69,8 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
List<NotificationGetRespondAttributesList> getNotificationRespondAttributes = [];
NotificationGetRespondAttributesList? notificationNoteInput;
List<GetRFCEmployeeList> getRFCEmployeeList = [];
//HR Details Screen Requests
List<GetEitCollectionNotificationBodyList>? getEitCollectionNotificationBodyList = [];
List<GetPhonesNotificationBodyList>? getPhonesNotificationBodyList = [];
@ -375,57 +381,116 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
}
fabs.add(myFab(
notificationButtonsList[i].bUTTONLABEL!,
notificationButtonsList[i].bUTTONACTION == "DELEGATE" ? "assets/images/delegate.svg" : notificationButtonsList[i].bUTTONICON ?? "",
isIconAsset: notificationButtonsList[i].bUTTONACTION == "DELEGATE" ? true : false,
getActionImage(notificationButtonsList[i].bUTTONACTION!),
isIconAsset: true,
).paddingOnly(bottom: 12).onPress(() => handleFabAction(notificationButtonsList[i])));
}
return fabs;
}
String getActionImage(String action) {
String returnActionImage = "";
switch (action) {
case "DELEGATE":
returnActionImage = "assets/images/delegate.svg";
break;
case "REQUEST_INFO":
returnActionImage = "assets/images/request_info.svg";
break;
case "RFC":
returnActionImage = "assets/images/worklist/return.svg";
break;
case "UPDATE_ACTION":
returnActionImage = "assets/images/worklist/update_action.svg";
break;
}
return returnActionImage;
}
void handleFabAction(GetNotificationButtonsList notificationButton) {
print("notificationButton:${notificationButton.bUTTONACTION}");
switch (notificationButton.bUTTONACTION) {
case "DELEGATE":
showMyBottomSheet(context,
callBackFunc: reloadWorkList,
child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,));
child: DelegateSheet(
title: LocaleKeys.delegate.tr(),
apiMode: notificationButton.bUTTONACTION!,
notificationID: workListData!.nOTIFICATIONID,
actionHistoryList: actionHistoryList,
callBackFunc: reloadWorkList,
));
break;
case "REQUEST_INFO":
// do something else
showMyBottomSheet(context,
callBackFunc: reloadWorkList,
child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: "REQUEST_INFO", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,));
child: DelegateSheet(
title: LocaleKeys.request_info.tr(),
apiMode: "REQUEST_INFO",
notificationID: workListData!.nOTIFICATIONID,
actionHistoryList: actionHistoryList,
callBackFunc: reloadWorkList,
));
break;
case "TRANSFER_INFO":
// do something else
showMyBottomSheet(context,
callBackFunc: reloadWorkList,
child:
DelegateSheet(title: notificationButton.bUTTONLABEL!, apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,));
child: DelegateSheet(
title: notificationButton.bUTTONLABEL!,
apiMode: notificationButton.bUTTONACTION!,
notificationID: workListData!.nOTIFICATIONID,
actionHistoryList: actionHistoryList,
callBackFunc: reloadWorkList,
));
break;
case "ANSWER_INFO":
performAction(notificationButton.bUTTONACTION!, title: notificationButton.bUTTONLABEL);
break;
case "RFC":
// do something else
getRFCEmployeeListFunc();
break;
case "APPROVE":
performAction(notificationButton.bUTTONACTION!);
break;
case "UPDATE_ACTION":
// do something else
showMyBottomSheet(
context,
callBackFunc: reloadWorkList,
child: UpdateContinueSheet(
workListData: workListData,
getEitCollectionNotificationBodyList: getEitCollectionNotificationBodyList,
dynamicParams: DynamicListViewParams(workListData!.sUBJECT!, workListData!.fUNCTIONNAME!,
isUpdate: true, collectionNotificationList: getEitCollectionNotificationBodyList![0].collectionNotification)),
);
break;
case "APPROVE_AND_FORWARD":
showMyBottomSheet(context,
callBackFunc: reloadWorkList,
child: DelegateSheet(title: "Approve and Forward", apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,));
child: DelegateSheet(
title: "Approve and Forward",
apiMode: notificationButton.bUTTONACTION!,
notificationID: workListData!.nOTIFICATIONID,
actionHistoryList: actionHistoryList,
callBackFunc: reloadWorkList,
));
break;
case "FORWARD":
showMyBottomSheet(context,
callBackFunc: reloadWorkList,
child: DelegateSheet(title: "Forward", apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,));
child: DelegateSheet(
title: "Forward",
apiMode: notificationButton.bUTTONACTION!,
notificationID: workListData!.nOTIFICATIONID,
actionHistoryList: actionHistoryList,
callBackFunc: reloadWorkList,
));
break;
case "REJECT":
performNetworkCall(context, email: "", userId: "");
performAction(notificationButton.bUTTONACTION!);
break;
case "RETURNED":
Navigator.pop(context);
@ -436,6 +501,28 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
});
}
void getRFCEmployeeListFunc() async {
try {
Utils.showLoading(context);
getRFCEmployeeList = await WorkListApiClient().getRFCEmployeeeList(workListData!.nOTIFICATIONID!);
Utils.hideLoading(context);
actionHistoryList.last.sEQUENCE = getRFCEmployeeList[0].sEQ;
showMyBottomSheet(context,
callBackFunc: reloadWorkList,
child: SelectedItemSheet(
"Comment",
apiMode: "RFC",
actionHistoryList: actionHistoryList.last,
notificationID: workListData!.nOTIFICATIONID,
isITGRequest: false,
));
setState(() {});
} catch (ex) {
Utils.hideLoading(context);
Utils.handleException(ex, context, null);
}
}
Future<void> performNetworkCall(BuildContext context, {String? email, String? userId}) async {
showDialog(
context: context,
@ -519,6 +606,7 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
}
void performAction(String actionMode, {String? title}) {
print(actionMode);
showDialog(
context: context,
builder: (cxt) => AcceptRejectInputDialog(
@ -541,7 +629,7 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
}
],
};
if (actionMode == "APPROVED" || actionMode == "APPROVE" || actionMode == "CLOSE") {
if (actionMode == "APPROVED" || actionMode == "APPROVE" || actionMode == "CLOSE" || actionMode == "ANSWER_INFO" || actionMode == "RFC") {
performNotificationAction(payload);
} else if (note.isNotEmpty && (actionMode != "APPROVED" || actionMode != "APPROVE")) {
performNotificationAction(payload);
@ -865,6 +953,71 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
}
}
// Widget showUpdateContinueSheet(List<GetEitCollectionNotificationBodyList> list) {
// double itemHeight = 0;
// double itemWidth = 0;
// var size = MediaQuery.of(context).size;
// itemHeight = (size.height - kToolbarHeight - 24) / 9;
// itemWidth = size.width / 2;
// return Column(
// children: [
// if ((workListData?.sUBJECT ?? "").isNotEmpty) workListData!.sUBJECT!.toText14().paddingOnly(top: 10, right: 21, left: 21, bottom: 21),
// ListView.separated(
// shrinkWrap: true,
// physics: const NeverScrollableScrollPhysics(),
// itemBuilder: (cxt, index) {
// List<CollectionNotificationEit> dataList = list.isEmpty ? [] : (list[index].collectionNotification ?? []);
// dataList = dataList.where((o) => o.displayFlag == "Y").toList();
// bool isOdd = false;
// if (dataList.length % 2 != 0) {
// isOdd = true;
// dataList.add(new CollectionNotificationEit());
// }
// return GridView.builder(
// itemCount: dataList.length,
// shrinkWrap: true,
// physics: const NeverScrollableScrollPhysics(),
// itemBuilder: (context, index) => ItemDetailViewGridItem(
// index,
// dataList[index].segmentPrompt,
// dataList[index].segmentValueDsp,
// isNeedToShowEmptyDivider: (dataList.length == index + 1)
// ? isOdd
// ? true
// : false
// : false,
// ),
// gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
// crossAxisCount: 2,
// childAspectRatio: (itemWidth / itemHeight),
// ),
// ).objectContainerView();
// },
// separatorBuilder: (cxt, index) => 12.height,
// itemCount: list.length,
// ),
// Padding(
// padding: const EdgeInsets.only(right: 21, left: 21, bottom: 21),
// child: Row(
// children: [
// DefaultButton(
// LocaleKeys.edit.tr(),
// () => performEditAction(),
// colors: const [Color(0xffE47A7E), Color(0xffDE6D71)],
// ).expanded,
// 8.width,
// DefaultButton(
// LocaleKeys.next.tr(),
// () => performNextAction(),
// colors: const [Color(0xff28C884), Color(0xff1BB271)],
// ).expanded,
// ],
// ),
// ),
// ],
// );
// }
Widget showLoadingAnimation() {
return Lottie.asset(
'assets/lottie/loading.json',

@ -88,16 +88,21 @@ class AcceptRejectInputDialog extends StatelessWidget {
).expanded,
10.width,
DefaultButton(
actionMode == "REJECTED" ? LocaleKeys.reject.tr() : LocaleKeys.ok.tr(),
(actionMode == "REJECTED" || actionMode == "REJECT") ? LocaleKeys.reject.tr() : LocaleKeys.ok.tr(),
() {
if(note.isNotEmpty) {
if (note.isEmpty) {
if ((actionMode != "REJECTED" && actionMode != "REJECT") && actionMode != "ANSWER_INFO" && actionMode != "RFC") {
Navigator.pop(context);
onTap(note);
} else {
Utils.showToast(LocaleKeys.pleaseEnterComments.tr());
}
} else {
Navigator.pop(context);
onTap(note);
} else {
Utils.showToast(LocaleKeys.pleaseEnterComments.tr());
}
},
colors: actionMode == "REJECTED"
colors: (actionMode == "REJECTED" || actionMode == "REJECT")
? const [
Color(0xffE47A7E),
Color(0xffE47A7E),

@ -127,6 +127,7 @@ flutter:
- assets/lottie/
- assets/audio/
- assets/images/
- assets/images/worklist/
- assets/images/login/
- assets/icons/chat/
- assets/images/logos/

Loading…
Cancel
Save