COC changes

merge-requests/11/merge
Sultan khan 3 years ago
parent bbaca492f5
commit 8d9561b570

@ -379,6 +379,8 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 99Z3UD3LJM;
ENABLE_BITCODE = NO;
@ -391,6 +393,7 @@
);
PRODUCT_BUNDLE_IDENTIFIER = com.cloudsolutions.mohemmtest;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
@ -510,6 +513,8 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 99Z3UD3LJM;
ENABLE_BITCODE = NO;
@ -522,6 +527,7 @@
);
PRODUCT_BUNDLE_IDENTIFIER = com.cloudsolutions.mohemmtest;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
@ -536,6 +542,8 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 99Z3UD3LJM;
ENABLE_BITCODE = NO;
@ -548,6 +556,7 @@
);
PRODUCT_BUNDLE_IDENTIFIER = com.cloudsolutions.mohemmtest;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";

@ -18,7 +18,8 @@ class APIError {
APIError(this.errorCode, this.errorMessage);
Map<String, dynamic> toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage};
Map<String, dynamic> toJson() =>
{'errorCode': errorCode, 'errorMessage': errorMessage};
@override
String toString() {
@ -53,7 +54,8 @@ APIException _throwAPIException(Response response) {
return APIException(APIException.INTERNAL_SERVER_ERROR);
case 444:
var downloadUrl = response.headers["location"];
return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl);
return APIException(APIException.UPGRADE_REQUIRED,
arguments: downloadUrl);
default:
return APIException(APIException.OTHER);
}
@ -66,8 +68,13 @@ class ApiClient {
factory ApiClient() => _instance;
Future<U> postJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, T jsonObject,
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0, bool isFormData = false}) async {
Future<U> postJsonForObject<T, U>(
FactoryConstructor<U> factoryConstructor, String url, T jsonObject,
{String? token,
Map<String, dynamic>? queryParameters,
Map<String, String>? headers,
int retryTimes = 0,
bool isFormData = false}) async {
var _headers = {'Accept': 'application/json'};
if (headers != null && headers.isNotEmpty) {
_headers.addAll(headers);
@ -77,7 +84,12 @@ class ApiClient {
var bodyJson = json.encode(jsonObject);
print("body:$bodyJson");
}
var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes, isFormData: isFormData);
var response = await postJsonForResponse(url, jsonObject,
token: token,
queryParameters: queryParameters,
headers: _headers,
retryTimes: retryTimes,
isFormData: isFormData);
// try {
if (!kReleaseMode) {
logger.i("res: " + response.body);
@ -90,7 +102,8 @@ class ApiClient {
return factoryConstructor(jsonData);
} else {
APIError? apiError;
apiError = APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage']);
apiError =
APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage']);
throw APIException(APIException.BAD_REQUEST, error: apiError);
}
// } catch (ex) {
@ -103,7 +116,11 @@ class ApiClient {
}
Future<Response> postJsonForResponse<T>(String url, T jsonObject,
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0, bool isFormData = false}) async {
{String? token,
Map<String, dynamic>? queryParameters,
Map<String, String>? headers,
int retryTimes = 0,
bool isFormData = false}) async {
String? requestBody;
late Map<String, String> stringObj;
if (jsonObject != null) {
@ -117,13 +134,22 @@ class ApiClient {
if (isFormData) {
headers = {'Content-Type': 'application/x-www-form-urlencoded'};
stringObj = ((jsonObject ?? {}) as Map<String, dynamic>).map((key, value) => MapEntry(key, value?.toString() ?? ""));
stringObj = ((jsonObject ?? {}) as Map<String, dynamic>)
.map((key, value) => MapEntry(key, value?.toString() ?? ""));
}
return await _postForResponse(url, isFormData ? stringObj : requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes);
return await _postForResponse(url, isFormData ? stringObj : requestBody,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes);
}
Future<Response> _postForResponse(String url, requestBody, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
Future<Response> _postForResponse(String url, requestBody,
{String? token,
Map<String, dynamic>? queryParameters,
Map<String, String>? headers,
int retryTimes = 0}) async {
try {
var _headers = <String, String>{};
if (token != null) {
@ -138,7 +164,9 @@ class ApiClient {
var queryString = new Uri(queryParameters: queryParameters).query;
url = url + '?' + queryString;
}
var response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 60));
var response =
await _post(Uri.parse(url), body: requestBody, headers: _headers)
.timeout(Duration(seconds: 120));
if (response.statusCode >= 200 && response.statusCode < 300) {
return response;
@ -149,7 +177,11 @@ class ApiClient {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
return await _postForResponse(url, requestBody,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
@ -157,7 +189,11 @@ class ApiClient {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
return await _postForResponse(url, requestBody,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
@ -167,23 +203,39 @@ class ApiClient {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
return await _postForResponse(url, requestBody,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
}
}
Future<Response> getJsonForResponse<T>(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
Future<Response> getJsonForResponse<T>(String url,
{String? token,
Map<String, dynamic>? queryParameters,
Map<String, String>? headers,
int retryTimes = 0}) async {
if (headers == null) {
headers = {'Content-Type': 'application/json'};
} else {
headers['Content-Type'] = 'application/json';
}
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes);
return await _getForResponse(url,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes);
}
Future<Response> _getForResponse(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
Future<Response> _getForResponse(String url,
{String? token,
Map<String, dynamic>? queryParameters,
Map<String, String>? headers,
int retryTimes = 0}) async {
try {
var _headers = <String, String>{};
if (token != null) {
@ -198,7 +250,8 @@ class ApiClient {
var queryString = new Uri(queryParameters: queryParameters).query;
url = url + '?' + queryString;
}
var response = await _get(Uri.parse(url), headers: _headers).timeout(Duration(seconds: 60));
var response = await _get(Uri.parse(url), headers: _headers)
.timeout(Duration(seconds: 60));
if (response.statusCode >= 200 && response.statusCode < 300) {
return response;
@ -209,7 +262,11 @@ class ApiClient {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
return await _getForResponse(url,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
@ -217,7 +274,11 @@ class ApiClient {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
return await _getForResponse(url,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
@ -227,14 +288,19 @@ class ApiClient {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
return await _getForResponse(url,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes - 1);
} else {
throw APIException(APIException.OTHER, arguments: e);
}
}
}
Future<Response> _get(url, {Map<String, String>? headers}) => _withClient((client) => client.get(url, headers: headers));
Future<Response> _get(url, {Map<String, String>? headers}) =>
_withClient((client) => client.get(url, headers: headers));
bool _certificateCheck(X509Certificate cert, String host, int port) => true;
@ -248,5 +314,8 @@ class ApiClient {
}
}
Future<Response> _post(url, {Map<String, String>? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding));
Future<Response> _post(url,
{Map<String, String>? headers, body, Encoding? encoding}) =>
_withClient((client) =>
client.post(url, headers: headers, body: body, encoding: encoding));
}

@ -3,6 +3,7 @@ import 'dart:async';
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/classes/date_uitl.dart';
import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.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';
@ -37,6 +38,20 @@ class DashboardApiClient {
}, url, postParams);
}
Future<GenericResponseModel?> getCOCNotifications() async {
String url = "${ApiConsts.cocRest}Mohemm_ITG_ReviewerAdmin_Pending_Tasks";
Map<String, dynamic> postParams = {
"Date": DateUtil.getISODateFormat(DateTime.now()),
"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData;
}, url, postParams);
}
Future<ItgFormsModel?> getItgFormsPendingTask() async {
String url = "${ApiConsts.cocRest}ITGFormsPendingTasks";
Map<String, dynamic> postParams = {};
@ -47,7 +62,8 @@ class DashboardApiClient {
}, url, postParams);
}
Future<List<GetAccrualBalancesList>> getAccrualBalances(String effectiveDate) async {
Future<List<GetAccrualBalancesList>> getAccrualBalances(
String effectiveDate) async {
String url = "${ApiConsts.erpRest}GET_ACCRUAL_BALANCES";
Map<String, dynamic> postParams = {"P_EFFECTIVE_DATE": effectiveDate};
postParams.addAll(AppState().postParamsJson);
@ -81,7 +97,10 @@ class DashboardApiClient {
//GET_MENU_ENTRIES
Future<GenericResponseModel?> getGetMenuEntries() async {
String url = "${ApiConsts.erpRest}GET_MENU_ENTRIES";
Map<String, dynamic> postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E"};
Map<String, dynamic> postParams = {
"P_SELECTED_RESP_ID": -999,
"P_MENU_TYPE": "E"
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
@ -90,7 +109,13 @@ class DashboardApiClient {
}
//Mark Attendance
Future<GenericResponseModel?> markAttendance({String lat = "0", String? long = "0", required int pointType, String nfcValue = "", bool isGpsRequired = false, String QRValue = ""}) async {
Future<GenericResponseModel?> markAttendance(
{String lat = "0",
String? long = "0",
required int pointType,
String nfcValue = "",
bool isGpsRequired = false,
String QRValue = ""}) async {
String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC";
var uuid = Uuid();
// Generate a v4 (random) id

@ -23,4 +23,4 @@ class SharedPrefsConsts {
static String mohemmWifiSSID = "mohemmWifiSSID";
static String mohemmWifiPassword = "mohemmWifiPassword";
static String editItemForSale = "editItemForSale";
}
}

@ -0,0 +1,44 @@
class MohemmITGPendingTaskResponseItem {
int? escalation;
int? exceedTAT;
int? extendTATRequest;
int? open;
int? pendningWithReviewer;
int? waitingForAcceptance;
int? waitingToClose;
int? withInTAT;
MohemmITGPendingTaskResponseItem(
{this.escalation,
this.exceedTAT,
this.extendTATRequest,
this.open,
this.pendningWithReviewer,
this.waitingForAcceptance,
this.waitingToClose,
this.withInTAT});
MohemmITGPendingTaskResponseItem.fromJson(Map<String, dynamic> json) {
escalation = json['escalation'];
exceedTAT = json['exceedTAT'];
extendTATRequest = json['extendTATRequest'];
open = json['open'];
pendningWithReviewer = json['pendningWithReviewer'];
waitingForAcceptance = json['waitingForAcceptance'];
waitingToClose = json['waitingToClose'];
withInTAT = json['withInTAT'];
}
Map<String, dynamic> toJson() {
Map<String, dynamic> data = new Map<String, dynamic>();
data['escalation'] = this.escalation;
data['exceedTAT'] = this.exceedTAT;
data['extendTATRequest'] = this.extendTATRequest;
data['open'] = this.open;
data['pendningWithReviewer'] = this.pendningWithReviewer;
data['waitingForAcceptance'] = this.waitingForAcceptance;
data['waitingToClose'] = this.waitingToClose;
data['withInTAT'] = this.withInTAT;
return data;
}
}

File diff suppressed because it is too large Load Diff

@ -15,6 +15,7 @@ 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/dashboard/mohemm_itg_pending_task_responseitem.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart';
@ -59,10 +60,13 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
isAttendanceTrackingLoading = false;
// isTimeRemainingInSeconds = calculateSeconds( "00:00:00");
if (attendanceTracking?.pSwipeIn != null) {
isTimeRemainingInSeconds = calculateSeconds(attendanceTracking!.pRemainingHours ?? "00:00:00");
int totalShiftTimeInSeconds = calculateSeconds(attendanceTracking!.pScheduledHours ?? "00:00:00");
isTimeRemainingInSeconds =
calculateSeconds(attendanceTracking!.pRemainingHours ?? "00:00:00");
int totalShiftTimeInSeconds =
calculateSeconds(attendanceTracking!.pScheduledHours ?? "00:00:00");
progress = (isTimeRemainingInSeconds / totalShiftTimeInSeconds);
endTime = DateTime.now().millisecondsSinceEpoch + Duration(seconds: isTimeRemainingInSeconds).inMilliseconds;
endTime = DateTime.now().millisecondsSinceEpoch +
Duration(seconds: isTimeRemainingInSeconds).inMilliseconds;
}
notifyListeners();
@ -112,17 +116,32 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
ItgFormsModel? itgFormsModel;
List<GetOpenNotificationsList>? getOpenNotificationsList;
MohemmITGPendingTaskResponseItem? cocCount;
int cocFinalCount = 0;
//Work List API's & Methods
Future fetchWorkListCounter(context, {bool showLoading = false}) async {
try {
if (showLoading) Utils.showLoading(context);
GenericResponseModel? genericResponseModel = await DashboardApiClient().getOpenNotifications();
GenericResponseModel? genericResponseModel =
await DashboardApiClient().getOpenNotifications();
isWorkListLoading = false;
getOpenNotificationsList = genericResponseModel?.getOpenNotificationsList;
workListCounter = genericResponseModel?.pOPENNTFNUMBER ?? 0;
itgFormsModel = await DashboardApiClient().getItgFormsPendingTask();
workListCounter = workListCounter + (itgFormsModel?.totalCount ?? 0);
GenericResponseModel? cocGenericResponseModel =
await DashboardApiClient().getCOCNotifications();
cocCount = cocGenericResponseModel?.mohemmITGPendingTaskResponseItem;
if (cocCount != null) {
cocFinalCount = (cocCount?.escalation ?? 0) +
(cocCount?.waitingToClose ?? 0) +
(cocCount?.waitingForAcceptance ?? 0) +
(cocCount?.extendTATRequest ?? 0);
workListCounter += cocFinalCount;
}
if (showLoading) Utils.hideLoading(context);
notifyListeners();
} catch (ex) {
@ -137,9 +156,12 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
//Missing Siwpe API's & Methods
Future fetchMissingSwipe(context) async {
try {
GenericResponseModel? genericResponseModel = await DashboardApiClient().getOpenMissingSwipes();
GenericResponseModel? genericResponseModel =
await DashboardApiClient().getOpenMissingSwipes();
isMissingSwipeLoading = false;
missingSwipeCounter = genericResponseModel!.getOpenMissingSwipesList!.pOpenMissingSwipes ?? 0;
missingSwipeCounter =
genericResponseModel!.getOpenMissingSwipesList!.pOpenMissingSwipes ??
0;
notifyListeners();
} catch (ex) {
isMissingSwipeLoading = false;
@ -152,10 +174,12 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
//Leave and Ticket Balance API's & Methods
Future fetchLeaveTicketBalance(context, DateTime date) async {
try {
accrualList = await DashboardApiClient().getAccrualBalances(DateFormat("MM/dd/yyyy").format(date));
accrualList = await DashboardApiClient()
.getAccrualBalances(DateFormat("MM/dd/yyyy").format(date));
isLeaveTicketBalanceLoading = false;
leaveBalanceAccrual = accrualList![0];
ticketBalance = (accrualList![1].accrualNetEntitlement ?? 0.0) + (accrualList![2].accrualNetEntitlement ?? 0.0);
ticketBalance = (accrualList![1].accrualNetEntitlement ?? 0.0) +
(accrualList![2].accrualNetEntitlement ?? 0.0);
notifyListeners();
} catch (ex) {
isLeaveTicketBalanceLoading = false;
@ -168,23 +192,36 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
//List Menu API's & Methods
List<DrawerMenuItem> drawerMenuItemList = [
DrawerMenuItem("assets/images/drawer/my_profile.svg", LocaleKeys.myProfile.tr(), AppRoutes.profile),
DrawerMenuItem("assets/images/drawer/performance_evaluation.svg", LocaleKeys.performanceEvaluation.tr(), AppRoutes.performanceEvaluation),
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(), AppRoutes.changePassword),
DrawerMenuItem("assets/images/drawer/my_profile.svg",
LocaleKeys.myProfile.tr(), AppRoutes.profile),
DrawerMenuItem("assets/images/drawer/performance_evaluation.svg",
LocaleKeys.performanceEvaluation.tr(), AppRoutes.performanceEvaluation),
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(), AppRoutes.changePassword),
];
void fetchListMenu() async {
try {
List<ListMenu> menuList = await DashboardApiClient().getListMenu();
List findMyRequest = menuList.where((element) => element.menuType == "E").toList();
List findMyRequest =
menuList.where((element) => element.menuType == "E").toList();
if (findMyRequest.isNotEmpty) {
drawerMenuItemList.insert(3, DrawerMenuItem("assets/images/drawer/my_requests.svg", LocaleKeys.myRequest.tr(), AppRoutes.myRequests));
drawerMenuItemList.insert(
3,
DrawerMenuItem("assets/images/drawer/my_requests.svg",
LocaleKeys.myRequest.tr(), AppRoutes.myRequests));
}
List findMyTeam = menuList.where((element) => element.menuType == "M").toList();
List findMyTeam =
menuList.where((element) => element.menuType == "M").toList();
if (findMyTeam.isNotEmpty) {
drawerMenuItemList.insert(2, DrawerMenuItem("assets/images/drawer/my_team.svg", LocaleKeys.myTeamMembers.tr(), AppRoutes.myTeam));
drawerMenuItemList.insert(
2,
DrawerMenuItem("assets/images/drawer/my_team.svg",
LocaleKeys.myTeamMembers.tr(), AppRoutes.myTeam));
}
} catch (ex) {
logger.wtf(ex);
@ -195,12 +232,19 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
//Menu Entries API's & Methods
void fetchMenuEntries() async {
try {
GenericResponseModel? genericResponseModel = await DashboardApiClient().getGetMenuEntries();
GenericResponseModel? genericResponseModel =
await DashboardApiClient().getGetMenuEntries();
getMenuEntriesList = genericResponseModel!.getMenuEntriesList;
homeMenus = parseMenus(getMenuEntriesList ?? []);
if (homeMenus!.isNotEmpty) {
homeMenus!.first.menuEntiesList.insert(0, GetMenuEntriesList(requestType: "MONTHLY_ATTENDANCE", prompt: LocaleKeys.monthlyAttendance.tr()));
homeMenus!.first.menuEntiesList.add(GetMenuEntriesList(requestType: "VACATION_RULE", prompt: LocaleKeys.vacationRule.tr()));
homeMenus!.first.menuEntiesList.insert(
0,
GetMenuEntriesList(
requestType: "MONTHLY_ATTENDANCE",
prompt: LocaleKeys.monthlyAttendance.tr()));
homeMenus!.first.menuEntiesList.add(GetMenuEntriesList(
requestType: "VACATION_RULE",
prompt: LocaleKeys.vacationRule.tr()));
}
isServicesMenusLoading = false;
notifyListeners();
@ -228,7 +272,12 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
List<Menus> menus = [];
for (int i = 0; i < getMenuEntriesList.length; i++) {
if (getMenuEntriesList[i].parentMenuName!.isEmpty) {
menus.add(Menus(getMenuEntriesList[i], getMenuEntriesList.where((element) => getMenuEntriesList[i].menuName == element.parentMenuName).toList()));
menus.add(Menus(
getMenuEntriesList[i],
getMenuEntriesList
.where((element) =>
getMenuEntriesList[i].menuName == element.parentMenuName)
.toList()));
}
}
return menus;

@ -41,7 +41,14 @@ class _WorkListScreenState extends State<WorkListScreen> {
key: 'HRSSA',
disable: false),
WorkListItemTypeModelData(
value: 0, name: 'MR', fullName: LocaleKeys.moveOrder.tr(), active: false, color: [Color(0xff58DCFA), Color(0xff3CB9D5)], icon: "assets/images/miss_swipe.svg", key: 'INVMOA', disable: false),
value: 0,
name: 'MR',
fullName: LocaleKeys.moveOrder.tr(),
active: false,
color: [Color(0xff58DCFA), Color(0xff3CB9D5)],
icon: "assets/images/miss_swipe.svg",
key: 'INVMOA',
disable: false),
WorkListItemTypeModelData(
value: 0,
name: 'PR',
@ -61,7 +68,14 @@ class _WorkListScreenState extends State<WorkListScreen> {
key: 'POAPPRV',
disable: false),
WorkListItemTypeModelData(
value: 0, name: 'ITG', fullName: LocaleKeys.ITGForms.tr(), active: false, color: [Color(0xffEB8C90), Color(0xffDE6C70)], icon: "assets/images/miss_swipe.svg", key: 'ITG', disable: false),
value: 0,
name: 'ITG',
fullName: LocaleKeys.ITGForms.tr(),
active: false,
color: [Color(0xffEB8C90), Color(0xffDE6C70)],
icon: "assets/images/miss_swipe.svg",
key: 'ITG',
disable: false),
WorkListItemTypeModelData(
value: 0,
name: 'IC',
@ -72,7 +86,23 @@ class _WorkListScreenState extends State<WorkListScreen> {
key: 'INVITEM',
disable: false),
WorkListItemTypeModelData(
value: 0, name: 'STAMP', fullName: LocaleKeys.stamp.tr(), active: false, color: [Color(0xff32D892), Color(0xff1AB170)], icon: "assets/images/miss_swipe.svg", key: 'STAMP', disable: false),
value: 0,
name: 'STAMP',
fullName: LocaleKeys.stamp.tr(),
active: false,
color: [Color(0xff32D892), Color(0xff1AB170)],
icon: "assets/images/miss_swipe.svg",
key: 'STAMP',
disable: false),
WorkListItemTypeModelData(
value: 0,
name: 'COC',
fullName: LocaleKeys.itemCreation.tr(),
active: false,
color: [Color(0xff787299), Color(0xff1AB170)],
icon: "assets/images/miss_swipe.svg",
key: 'COC',
disable: true)
];
int workListItemIndex = 0;
@ -95,8 +125,13 @@ class _WorkListScreenState extends State<WorkListScreen> {
workListItemTypes.forEach((workListElement) {
if (workListElement.key == "ITG") {
workListElement.value = providerData.itgFormsModel?.totalCount ?? 0;
} else if (workListElement.key == "COC") {
workListElement.value = providerData.cocFinalCount;
} else {
var tempList = providerData.getOpenNotificationsList?.where((notificationElement) => notificationElement.itemType == workListElement.key).toList();
var tempList = providerData.getOpenNotificationsList
?.where((notificationElement) =>
notificationElement.itemType == workListElement.key)
.toList();
if (tempList!.isNotEmpty) {
workListElement.value = tempList.first.openNtfNumber ?? 0;
}
@ -115,18 +150,26 @@ class _WorkListScreenState extends State<WorkListScreen> {
List<RequestDetails> requestAllList = [];
for (int i = 0; i < (itgFormsModel?.requestType!.length ?? 0); i++) {
itgFormsModel?.requestType![i].requestDetails?.forEach((element) {
element.requestType = itgFormsModel?.requestType![i].requestTypeCode;
element.requestType =
itgFormsModel?.requestType![i].requestTypeCode;
});
requestAllList = requestAllList + (itgFormsModel?.requestType![i].requestDetails ?? []);
requestAllList = requestAllList +
(itgFormsModel?.requestType![i].requestDetails ?? []);
}
AppState().setRequestAllList = requestAllList;
itgFormsModel?.requestType!.insert(0, RequestType(requestDetails: requestAllList, requestTypeCode: "all", requestTypeName: "All"));
itgFormsModel?.requestType!.insert(
0,
RequestType(
requestDetails: requestAllList,
requestTypeCode: "all",
requestTypeName: "All"));
if ((itgFormsModel?.requestType?.length ?? 0) > 0) {
itgRequestTypeIndex = 0;
}
} else {
itgRequestTypeIndex = null;
workList = await WorkListApiClient().getWorkList(pageNumber, workListItemTypes[workListItemIndex].key);
workList = await WorkListApiClient()
.getWorkList(pageNumber, workListItemTypes[workListItemIndex].key);
AppState().setWorkList = workList;
}
Utils.hideLoading(context);
@ -167,13 +210,23 @@ class _WorkListScreenState extends State<WorkListScreen> {
child: ListView.separated(
itemBuilder: (context, index) {
return Container(
padding: const EdgeInsets.only(left: 21, right: 21, top: 8, bottom: 8),
padding: const EdgeInsets.only(
left: 21, right: 21, top: 8, bottom: 8),
alignment: Alignment.center,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(6), color: workListItemIndex == index ? MyColors.darkIconColor : MyColors.lightGreyEAColor),
child: ("${workListItemTypes[index].name} ${workListItemTypes[index].value > 0 ? "(${workListItemTypes[index].value})" : ""}")
.toText12(color: workListItemIndex == index ? MyColors.white : MyColors.black),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6),
color: workListItemIndex == index
? MyColors.darkIconColor
: MyColors.lightGreyEAColor),
child:
("${workListItemTypes[index].name} ${workListItemTypes[index].value > 0 ? "(${workListItemTypes[index].value})" : ""}")
.toText12(
color: workListItemIndex == index
? MyColors.white
: MyColors.black),
).onPress(() {
if (workListItemIndex != index) {
if (workListItemIndex != index &&
!workListItemTypes[index].disable) {
workListItemIndex = index;
if (workListItemTypes[index].value == 0) {
workList = [];
@ -194,7 +247,10 @@ class _WorkListScreenState extends State<WorkListScreen> {
padding: const EdgeInsets.only(left: 21, right: 21),
),
).paddingOnly(top: 21, bottom: 21),
workListItemTypes[workListItemIndex].fullName.toSectionHeading().paddingOnly(left: 21, right: 21),
workListItemTypes[workListItemIndex]
.fullName
.toSectionHeading()
.paddingOnly(left: 21, right: 21),
if (itgRequestTypeIndex != null)
SizedBox(
height: 40,
@ -202,10 +258,18 @@ class _WorkListScreenState extends State<WorkListScreen> {
itemBuilder: (context, index) {
RequestType type = itgFormsModel!.requestType![index];
return Container(
padding: const EdgeInsets.only(left: 21, right: 21, top: 8, bottom: 8),
padding: const EdgeInsets.only(
left: 21, right: 21, top: 8, bottom: 8),
alignment: Alignment.center,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(30), color: itgRequestTypeIndex == index ? MyColors.darkIconColor : MyColors.lightGreyEAColor),
child: ("${type.requestTypeName}").toText12(color: itgRequestTypeIndex == index ? MyColors.white : MyColors.black),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30),
color: itgRequestTypeIndex == index
? MyColors.darkIconColor
: MyColors.lightGreyEAColor),
child: ("${type.requestTypeName}").toText12(
color: itgRequestTypeIndex == index
? MyColors.white
: MyColors.black),
).onPress(() {
if (itgRequestTypeIndex != index) {
itgRequestTypeIndex = index;
@ -225,21 +289,35 @@ class _WorkListScreenState extends State<WorkListScreen> {
child: ListView.separated(
physics: BouncingScrollPhysics(),
itemBuilder: (context, index) {
return itgRowItem(workListItemTypes[workListItemIndex], itgFormsModel!.requestType![itgRequestTypeIndex!].requestDetails![index], index);
return itgRowItem(
workListItemTypes[workListItemIndex],
itgFormsModel!.requestType![itgRequestTypeIndex!]
.requestDetails![index],
index);
},
separatorBuilder: (context, index) => 12.height,
itemCount: itgFormsModel!.requestType![itgRequestTypeIndex!].requestDetails?.length ?? 0,
itemCount: itgFormsModel!
.requestType![itgRequestTypeIndex!]
.requestDetails
?.length ??
0,
padding: const EdgeInsets.all(21),
),
)
: Expanded(
child: workList != null
? ((workList!).isEmpty
? LocaleKeys.noHistoryAvailable.tr().toText16().center
? LocaleKeys.noHistoryAvailable
.tr()
.toText16()
.center
: ListView.separated(
physics: const BouncingScrollPhysics(),
itemBuilder: (context, index) {
return rowItem(workListItemTypes[workListItemIndex], workList![index], index);
return rowItem(
workListItemTypes[workListItemIndex],
workList![index],
index);
},
separatorBuilder: (context, index) => 12.height,
itemCount: workList?.length ?? 0,
@ -253,14 +331,17 @@ class _WorkListScreenState extends State<WorkListScreen> {
);
}
Widget itgRowItem(WorkListItemTypeModelData data, RequestDetails requestDetails, int index) {
Widget itgRowItem(WorkListItemTypeModelData data,
RequestDetails requestDetails, int index) {
return InkWell(
onTap: () async {
AppState().setItgWorkListIndex = index;
var shouldReloadData = await Navigator.pushNamed(context, AppRoutes.itgDetail);
var shouldReloadData =
await Navigator.pushNamed(context, AppRoutes.itgDetail);
if (shouldReloadData != null) {
if (shouldReloadData.toString() == "delegate_reload") {
providerData.itgFormsModel!.totalCount = providerData.itgFormsModel!.totalCount! - 1;
providerData.itgFormsModel!.totalCount =
providerData.itgFormsModel!.totalCount! - 1;
calculateCounter();
getWorkList();
}
@ -284,7 +365,8 @@ class _WorkListScreenState extends State<WorkListScreen> {
},
child: Container(
width: double.infinity,
padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10),
padding:
const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
@ -303,11 +385,20 @@ class _WorkListScreenState extends State<WorkListScreen> {
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
gradient: LinearGradient(transform: GradientRotation(.218), begin: Alignment.topRight, end: Alignment.bottomRight, colors: data.color),
gradient: LinearGradient(
transform: GradientRotation(.218),
begin: Alignment.topRight,
end: Alignment.bottomRight,
colors: data.color),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [SvgPicture.asset("assets/images/miss_swipe.svg", width: 20, height: 20, color: Colors.white), 2.height, data.name.toText10(color: Colors.white)],
children: [
SvgPicture.asset("assets/images/miss_swipe.svg",
width: 20, height: 20, color: Colors.white),
2.height,
data.name.toText10(color: Colors.white)
],
).paddingAll(6),
),
8.width,
@ -320,11 +411,17 @@ class _WorkListScreenState extends State<WorkListScreen> {
10.height,
Row(
children: [
DateUtil.formatDateToDate(DateUtil.convertStringToDate(requestDetails.modifiedDate!), false).toText10(color: MyColors.lightTextColor).expanded,
DateUtil.formatDateToDate(
DateUtil.convertStringToDate(
requestDetails.modifiedDate!),
false)
.toText10(color: MyColors.lightTextColor)
.expanded,
RotatedBox(
quarterTurns: AppState().isArabic(context) ? 2:4,
child: SvgPicture.asset("assets/images/arrow_next.svg", color:MyColors.darkIconColor)
),
quarterTurns: AppState().isArabic(context) ? 2 : 4,
child: SvgPicture.asset(
"assets/images/arrow_next.svg",
color: MyColors.darkIconColor)),
],
),
],
@ -336,12 +433,15 @@ class _WorkListScreenState extends State<WorkListScreen> {
);
}
Widget rowItem(WorkListItemTypeModelData data, WorkListResponseModel workData, int index) {
Widget rowItem(WorkListItemTypeModelData data, WorkListResponseModel workData,
int index) {
return InkWell(
onTap: () async {
AppState().setWorkListIndex = index;
var data = workList![index];
var shouldReloadData = await Navigator.pushNamed(context, AppRoutes.workListDetail, arguments: workData);
var shouldReloadData = await Navigator.pushNamed(
context, AppRoutes.workListDetail,
arguments: workData);
if (shouldReloadData != null) {
if (shouldReloadData.toString() == "delegate_reload") {
calculateCounter();
@ -366,7 +466,8 @@ class _WorkListScreenState extends State<WorkListScreen> {
},
child: Container(
width: double.infinity,
padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10),
padding:
const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
@ -385,11 +486,20 @@ class _WorkListScreenState extends State<WorkListScreen> {
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
gradient: LinearGradient(transform: GradientRotation(.218), begin: Alignment.topRight, end: Alignment.bottomRight, colors: data.color),
gradient: LinearGradient(
transform: GradientRotation(.218),
begin: Alignment.topRight,
end: Alignment.bottomRight,
colors: data.color),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [SvgPicture.asset("assets/images/miss_swipe.svg", width: 20, height: 20, color: Colors.white), 2.height, data.name.toText10(color: Colors.white)],
children: [
SvgPicture.asset("assets/images/miss_swipe.svg",
width: 20, height: 20, color: Colors.white),
2.height,
data.name.toText10(color: Colors.white)
],
).paddingAll(6),
),
8.width,
@ -402,12 +512,17 @@ class _WorkListScreenState extends State<WorkListScreen> {
10.height,
Row(
children: [
DateUtil.formatDateToDate(DateUtil.convertSimpleStringDateToDate(workData.bEGINDATE!), false).toText10(color: MyColors.lightTextColor).expanded,
DateUtil.formatDateToDate(
DateUtil.convertSimpleStringDateToDate(
workData.bEGINDATE!),
false)
.toText10(color: MyColors.lightTextColor)
.expanded,
RotatedBox(
quarterTurns: AppState().isArabic(context) ? 2:4,
child: SvgPicture.asset("assets/images/arrow_next.svg", color:MyColors.darkIconColor)
),
quarterTurns: AppState().isArabic(context) ? 2 : 4,
child: SvgPicture.asset(
"assets/images/arrow_next.svg",
color: MyColors.darkIconColor)),
],
),
],

Loading…
Cancel
Save