worklist & itg counters issue resolved, delegate & request info in itg added.

merge-requests/31/head
Sikander Saleem 3 years ago
parent 0ad9d4dd9e
commit 212f8e6663

@ -357,6 +357,39 @@ class WorkListApiClient {
}, url, postParams);
}
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,
"TaskID": taskId,
"ItemID": itemId,
"EmployeeNumber": employeeNumber,
"NewUserEMPId": newUserEMPId,
"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,
"TaskID": taskId,
"ItemID": itemId,
"EmployeeNumber": employeeNumber,
"NewUserEMPId": newUserEMPId,
"Comments": comments,
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
ItgFormsModel responseData = ItgFormsModel.fromJson(json);
return responseData.itgRequest;
}, url, postParams);
}
//HR Detail Screen Requests
Future<List<GetEitCollectionNotificationBodyList>?> GetEitNotificationBody(int? notificationId) async {
String url = "${ApiConsts.erpRest}GET_EIT_NOTIFICATION_BODY";

@ -18,7 +18,6 @@ class MenusWidget extends StatelessWidget {
return Consumer<DashboardProviderModel>(
builder: (cxt, data, child) {
print("data.workListCounter:${data.workListCounter}");
return GridView(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 2 / 2, crossAxisSpacing: 9, mainAxisSpacing: 9),
padding: EdgeInsets.zero,

@ -16,7 +16,9 @@ import 'package:mohem_flutter_app/models/itg_forms_models/itg_request_model.dart
import 'package:mohem_flutter_app/models/itg_forms_models/request_detail_model.dart';
import 'package:mohem_flutter_app/ui/work_list/itg_fragments/approval_level_fragment.dart';
import 'package:mohem_flutter_app/ui/work_list/itg_fragments/request_detail_fragment.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/delegate_sheet.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dialogs/itg_comments_dialog.dart';
@ -203,7 +205,7 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
myFab(LocaleKeys.pleaseEnterComments.tr(), "assets/images/skip.svg").onPress(() {
myFab(LocaleKeys.skip.tr(), "assets/images/skip.svg").onPress(() {
if (AppState().requestAllList!.length - 1 > AppState().itgWorkListIndex!) {
AppState().itgWorkListIndex = AppState().itgWorkListIndex! + 1;
requestDetails = null;
@ -257,13 +259,17 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
}
void handleFabAction(AllowedActions action) {
print(action.toJson());
switch (action.action) {
case "DELEGATE":
// showMyBottomSheet(context, child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: action.action!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList));
case "Delegate":
showMyBottomSheet(context,
child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? []));
break;
case "REQUEST_INFO":
// do something else
case "RequestInformation":
showMyBottomSheet(context,
child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? []));
break;
case "RFC":
// do something else
@ -357,11 +363,11 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
Utils.hideLoading(context);
Utils.showToast(LocaleKeys.yourChangeHasBeenSavedSuccessfully.tr());
// Navigator.pop(context, "delegate_reload");
AppState().workList!.removeAt(AppState().workListIndex!);
if (AppState().workList!.isEmpty) {
AppState().requestAllList!.removeAt(AppState().itgWorkListIndex!);
if (AppState().requestAllList!.isEmpty) {
Navigator.pop(context, "delegate_reload");
} else {
if (AppState().workList!.length <= AppState().workListIndex!) {
if (AppState().requestAllList!.length <= AppState().itgWorkListIndex!) {
Navigator.pop(context, "delegate_reload");
} else {
requestDetails = null;
@ -381,11 +387,11 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
Utils.hideLoading(context);
Utils.showToast(LocaleKeys.yourChangeHasBeenSavedSuccessfully.tr());
// Navigator.pop(context, "delegate_reload");
AppState().workList!.removeAt(AppState().workListIndex!);
if (AppState().workList!.isEmpty) {
AppState().requestAllList!.removeAt(AppState().itgWorkListIndex!);
if (AppState().requestAllList!.isEmpty) {
Navigator.pop(context, "delegate_reload");
} else {
if (AppState().workList!.length <= AppState().workListIndex!) {
if (AppState().requestAllList!.length <= AppState().itgWorkListIndex!) {
Navigator.pop(context, "delegate_reload");
} else {
requestDetails = null;

@ -6,7 +6,7 @@ import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/itg_forms_models/wf_history_model.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/request_more_info_sheet.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/selected_itg_item_sheet.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
@ -96,11 +96,25 @@ class ApprovalLevelfragment extends StatelessWidget {
Row(
children: [
LocaleKeys.request_info.tr().toText12(color: MyColors.grey67Color).center.paddingOnly(top: 6, bottom: 6).onPress(() {
showMyBottomSheet(context, child: RequestMoreInfoSheet());
showMyBottomSheet(
context,
child: SelectedItgItemSheet(
LocaleKeys.comments.tr(),
wfHistory: history,
apiMode: 'RequestInformation',
),
);
}).expanded,
Container(width: 1, height: 30, color: MyColors.lightGreyEFColor),
LocaleKeys.delegate.tr().toText12(color: MyColors.gradiantEndColor).center.paddingOnly(top: 6, bottom: 6).onPress(() {
// showMyBottomSheet(context, child: DelegateSheet());
showMyBottomSheet(
context,
child: SelectedItgItemSheet(
LocaleKeys.comments.tr(),
wfHistory: history,
apiMode: 'Delegate',
),
);
}).expanded,
],
),

@ -17,6 +17,7 @@ import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_mode
import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/search_options_sheet.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/selected_item_sheet.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/selected_itg_item_sheet.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
@ -28,7 +29,7 @@ class DelegateSheet extends StatefulWidget {
List<GetActionHistoryList>? actionHistoryList;
List<WFHistory>? wFHistory;
DelegateSheet({required this.title, required this.apiMode, this.notificationID, this.actionHistoryList,this.wFHistory});
DelegateSheet({required this.title, required this.apiMode, this.notificationID, this.actionHistoryList, this.wFHistory});
@override
State<DelegateSheet> createState() => _DelegateSheetState();
@ -45,6 +46,21 @@ class _DelegateSheetState extends State<DelegateSheet> {
List<GetFavoriteReplacements>? favUsersList;
List<ReplacementList>? replacementList;
@override
void initState() {
super.initState();
if (widget.wFHistory != null) {
widget.wFHistory = widget.wFHistory!.reversed.toList();
var ids = widget.wFHistory!.map((e) => e.employeeID).toSet();
widget.wFHistory!.retainWhere((x) => ids.remove(x.employeeID));
}
}
@override
void dispose() {
super.dispose();
}
Future fetchFavLetters({bool isNeedLoading = true}) async {
favLetters = [];
if (isNeedLoading) Utils.showLoading(context);
@ -276,23 +292,41 @@ class _DelegateSheetState extends State<DelegateSheet> {
itemCount: replacementList!.length,
padding: EdgeInsets.only(top: 8, bottom: 8),
)
: ListView.separated(
itemBuilder: (context, index) {
return showItem(widget.actionHistoryList![index]);
},
separatorBuilder: (context, index) {
return Container(
color: MyColors.borderE3Color,
width: double.infinity,
height: 1,
margin: EdgeInsets.only(top: 8, bottom: 8),
);
},
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: widget.actionHistoryList!.length,
padding: EdgeInsets.only(top: 8, bottom: 8),
),
: (widget.wFHistory != null
? ListView.separated(
itemBuilder: (context, index) {
return showItgItem(widget.wFHistory![index]);
},
separatorBuilder: (context, index) {
return Container(
color: MyColors.borderE3Color,
width: double.infinity,
height: 1,
margin: EdgeInsets.only(top: 8, bottom: 8),
);
},
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: widget.wFHistory!.length,
padding: EdgeInsets.only(top: 8, bottom: 8),
)
: ListView.separated(
itemBuilder: (context, index) {
return showItem(widget.actionHistoryList![index]);
},
separatorBuilder: (context, index) {
return Container(
color: MyColors.borderE3Color,
width: double.infinity,
height: 1,
margin: EdgeInsets.only(top: 8, bottom: 8),
);
},
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: widget.actionHistoryList!.length,
padding: EdgeInsets.only(top: 8, bottom: 8),
)),
),
),
if (favLetters != null)
@ -393,6 +427,30 @@ class _DelegateSheetState extends State<DelegateSheet> {
);
}
Widget showItgItem(WFHistory wfHistory) {
return InkWell(
onTap: () {
showMyBottomSheet(context,
child: SelectedItgItemSheet(
"Comment",
apiMode: widget.apiMode,
wfHistory: wfHistory,
// notificationID: widget.notificationID,
));
},
child: Row(
children: [
CircularAvatar(
height: 30,
width: 30,
),
9.width,
(wfHistory.name ?? "").toText12().expanded,
],
),
);
}
Widget showFavUserItem(GetFavoriteReplacements actionHistory) {
return InkWell(
onTap: () {

@ -0,0 +1,170 @@
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/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/itg_forms_models/wf_history_model.dart';
import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart';
import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
import 'package:mohem_flutter_app/widgets/input_widget.dart';
class SelectedItgItemSheet extends StatelessWidget {
String title, apiMode;
int? notificationID;
WFHistory wfHistory;
GetFavoriteReplacements? favoriteReplacements;
ReplacementList? replacementList;
SelectedItgItemSheet(this.title, {required this.apiMode, this.notificationID, required this.wfHistory, this.favoriteReplacements, this.replacementList});
TextEditingController username = TextEditingController();
String comment = "";
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
height: MediaQuery.of(context).size.height - 80,
child: Column(
children: [
Expanded(
child: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.all(21),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
title.toText24(isBold: true),
21.height,
if (wfHistory != null) showItem(wfHistory.name, false),
if (favoriteReplacements != null) showItem(favoriteReplacements!.employeeDisplayName, true),
if (replacementList != null) showItem(replacementList!.employeeDisplayName, replacementList!.isFavorite),
14.height,
InputWidget(
"Enter a note",
"This is simple note",
username,
isBackgroundEnable: true,
lines: 5,
onChange: (v) {
comment = v;
},
),
],
),
),
),
),
Container(
width: double.infinity,
height: 1,
color: MyColors.borderE3Color,
),
Row(
children: [
Expanded(
child: DefaultButton(
LocaleKeys.cancel.tr(),
() {
Navigator.pop(context);
},
textColor: Colors.black,
colors: [
Color(0xffE6E6E6),
Color(0xffE6E6E6),
],
),
),
16.width,
Expanded(
child: DefaultButton(
LocaleKeys.submit.tr(),
() {
if (comment.trim() != "") {
String? email = "", userId = "";
if (wfHistory != null) {
email = wfHistory.email;
userId = wfHistory.employeeID;
} else if (favoriteReplacements != null) {
email = favoriteReplacements!.emailAddress;
userId = favoriteReplacements!.userName;
} else {
email = replacementList!.emailAddress;
userId = replacementList!.userName;
}
performNetworkCall(context, email: email ?? "", userId: userId ?? "");
} else {
Utils.showToast("Please enter comments");
}
},
colors: const [
Color(0xff32D892),
Color(0xff1AB170),
],
),
),
],
).insideContainer
],
),
);
}
Future<void> performNetworkCall(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 ?? "", wfHistory.employeeID!, comment);
} else if (apiMode == "RequestInformation") {
await WorkListApiClient()
.informationITGRequest(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);
Utils.handleException(ex, context, null);
}
}
Widget showItem(String? name, bool? isFav) {
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
color: Color(0xffF7F7F7),
border: Border.all(
color: Color(0xffefefef),
width: 1,
),
),
padding: EdgeInsets.only(top: 16, bottom: 16, left: 21, right: 21),
child: Row(
children: [
CircularAvatar(
height: 30,
width: 30,
),
16.width,
Expanded(
child: (name ?? "").toText12(),
),
Icon(
Icons.star,
size: 12,
color: (isFav ?? false) ? MyColors.yellowColor : MyColors.borderColor,
),
],
),
);
}
}

@ -117,6 +117,34 @@ class _WorkListScreenState extends State<WorkListScreen> {
});
}
void verifyWorkListCounter() {
workListItemTypes.forEach((workListElement) {
if (workListElement.key == "ITG" && workListItemTypes[workListItemIndex].key == "ITG") {
workListElement.value = providerData.itgFormsModel?.totalCount ?? 0;
if ((AppState().requestAllList?.length ?? 0) != workListElement.value) {
workListElement.value = AppState().requestAllList?.length ?? 0;
providerData.workListCounter = providerData.workListCounter - (providerData.itgFormsModel?.totalCount ?? 0);
providerData.itgFormsModel?.totalCount = ((providerData.itgFormsModel!.totalCount ?? 0) - ((providerData.itgFormsModel?.totalCount ?? 0) - (AppState().requestAllList?.length ?? 0)));
providerData.workListCounter = providerData.workListCounter + (providerData.itgFormsModel?.totalCount ?? 0);
providerData.notify();
}
} else if (workListElement.key == "COC") {
workListElement.value = providerData.cocFinalCount;
} else {
var tempList = providerData.getOpenNotificationsList?.where((notificationElement) {
return (notificationElement.itemType == workListItemTypes[workListItemIndex].key) && notificationElement.itemType == workListElement.key;
}).toList();
if (tempList!.isNotEmpty) {
if ((AppState().workList?.length ?? 0) != (tempList.first.openNtfNumber ?? 0)) {
workListElement.value = AppState().workList?.length ?? 0;
providerData.workListCounter = providerData.workListCounter - ((tempList.first.openNtfNumber ?? 0) - (AppState().workList?.length ?? 0));
providerData.notify();
}
}
}
});
}
ItgFormsModel? itgFormsModel;
int? itgRequestTypeIndex;
@ -331,6 +359,9 @@ class _WorkListScreenState extends State<WorkListScreen> {
// }
// calculateCounter();
// if (mounted) setState(() {});
} else {
verifyWorkListCounter();
if (mounted) setState(() {});
}
},
child: Container(
@ -424,7 +455,7 @@ class _WorkListScreenState extends State<WorkListScreen> {
var shouldReloadData = await Navigator.pushNamed(context, AppRoutes.workListDetail, arguments: workData);
if (shouldReloadData != null) {
if (shouldReloadData.toString() == "delegate_reload") {
calculateCounter();
verifyWorkListCounter();
getWorkList();
} else {
workList!.remove(data);
@ -443,6 +474,7 @@ class _WorkListScreenState extends State<WorkListScreen> {
if (mounted) setState(() {});
}
} else {
verifyWorkListCounter();
if (mounted) setState(() {});
}
},

@ -307,7 +307,7 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
myFab(LocaleKeys.pleaseEnterComments.tr(), "assets/images/skip.svg").onPress(() {
myFab(LocaleKeys.skip.tr(), "assets/images/skip.svg").onPress(() {
if (AppState().workList!.length - 1 > AppState().workListIndex!) {
AppState().setWorkListIndex = AppState().workListIndex! + 1;
workListData = null;
@ -481,7 +481,6 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
void performAction(String actionMode) {
TextEditingController textEditingController = TextEditingController();
print("actionMode:$actionMode");
showDialog(
context: context,
builder: (cxt) => AcceptRejectInputDialog(
@ -503,7 +502,7 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
}
],
};
if (actionMode == "APPROVED" || actionMode == "APPROVE") {
if (actionMode == "APPROVED" || actionMode == "APPROVE" || actionMode == "CLOSE") {
performNotificationAction(payload);
} else if (note.isNotEmpty && (actionMode != "APPROVED" || actionMode != "APPROVE")) {
performNotificationAction(payload);

@ -99,7 +99,8 @@ class ActionsFragment extends StatelessWidget {
Row(
children: [
LocaleKeys.request_info.tr().toText12(color: MyColors.grey67Color).center.paddingOnly(top: 6, bottom: 6).onPress(() {
showMyBottomSheet(context, child: DelegateSheet(title: "Request Info", apiMode: "REQUEST_INFO", notificationID: notificationID, actionHistoryList: actionHistoryList));
showMyBottomSheet(context,
child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: "REQUEST_INFO", notificationID: notificationID, actionHistoryList: actionHistoryList));
}).expanded,
Container(width: 1, height: 30, color: MyColors.lightGreyEFColor),
LocaleKeys.delegate.tr().toText12(color: MyColors.gradiantEndColor).center.paddingOnly(top: 6, bottom: 6).onPress(() {

Loading…
Cancel
Save