Compare commits

...

18 Commits

Author SHA1 Message Date
haroon amjad 4f96629467 Update to stores VersionID 8.6 9 months ago
haroon amjad db6b0ad1b0 Merge branch 'master_mohemm_flutter'
# Conflicts:
#	lib/app_state/app_state.dart
#	lib/ui/landing/dashboard_screen.dart
#	pubspec.yaml
9 months ago
haroon amjad 92a16381aa Update to stores VersionID 8.6 9 months ago
haroon amjad 5adc2bc64f updates 9 months ago
sultan khan 6e15336cc4 image changes. 9 months ago
sultan khan 29334a9ef0 leave balance page fix. 9 months ago
sultan khan 822a99a291 countdown updated. 9 months ago
sultan khan 75ba1283d3 event activity page added. 9 months ago
Sikander Saleem 6e3fc55fde event activity added - cont 9 months ago
Sikander Saleem a33da491f9 description format section seperated in itg forms 9 months ago
Sikander Saleem c35074576a offer and discount, do not show if api have issue. 9 months ago
Sikander Saleem 9362859013 CEI notification body added. 10 months ago
haroon amjad 4e9725477a Merge branch 'master_mohemm_flutter'
# Conflicts:
#	pubspec.yaml
10 months ago
haroon amjad 77de3ed4cf updates 10 months ago
haroon amjad 48f2264848 icon updates 10 months ago
haroon amjad e20d6eca3f Safe device issue fixed 10 months ago
Sikander Saleem 3e19508c5e child education assistance added. 10 months ago
haroon amjad 9f89f7530d Update to stores VersionID 8.5 10 months ago

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

@ -610,5 +610,7 @@
"manageGroup": "إدارة المجموعة",
"members": "الأعضاء",
"searchByUserName": "البحث بواسطة اسم المستخدم",
"shareScreen": "مشاركة الشاشة"
"shareScreen": "مشاركة الشاشة",
"start":"يبدأ",
"about":"عن"
}

@ -610,5 +610,7 @@
"qtyOrdered": "Qty. Ordered",
"qtyReceived": "Qty. Received",
"bonusQty": "Bonus Qty.",
"balQty": "Bal. Qty."
"balQty": "Bal. Qty.",
"start":"Start",
"about":"About"
}

@ -370,13 +370,13 @@
DEVELOPMENT_TEAM = 3A359E86ZF;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Al Habib Mohemm";
INFOPLIST_KEY_CFBundleDisplayName = "Al Habib MoheM";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 3.6.3;
MARKETING_VERSION = 3.7.94;
PRODUCT_BUNDLE_IDENTIFIER = com.cloudsolutions.alhabibmohemm;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -508,13 +508,13 @@
DEVELOPMENT_TEAM = 3A359E86ZF;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Al Habib Mohemm";
INFOPLIST_KEY_CFBundleDisplayName = "Al Habib MoheM";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 3.6.3;
MARKETING_VERSION = 3.7.94;
PRODUCT_BUNDLE_IDENTIFIER = com.cloudsolutions.alhabibmohemm;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -538,13 +538,13 @@
DEVELOPMENT_TEAM = 3A359E86ZF;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "Al Habib Mohemm";
INFOPLIST_KEY_CFBundleDisplayName = "Al Habib MoheM";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 3.6.3;
MARKETING_VERSION = 3.7.94;
PRODUCT_BUNDLE_IDENTIFIER = com.cloudsolutions.alhabibmohemm;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";

@ -22,7 +22,7 @@
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Al Habib Mohemm</string>
<string>Al Habib MoheM</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>

@ -105,6 +105,16 @@ class DashboardApiClient {
}, url, postParams);
}
Future<GenericResponseModel?> getEventActivity() async {
String url = "${ApiConsts.erpRest}Get_EventActivity";
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);
return responseData;
}, url, postParams);
}
//Mark Attendance
Future<GenericResponseModel?> markAttendance({String lat = "0", String? long = "0", required int pointType, String nfcValue = "", bool isGpsRequired = false, String QRValue = "", String payrollCode = ""}) async {
String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC";

@ -29,6 +29,21 @@ class MyAttendanceApiClient {
}, url, postParams);
}
Future<List<GetEITTransactionList>?> getCeiTransaction(String pFunctionName, int? relationID) async {
String url = "${ApiConsts.erpRest}GET_CEI_TRANSACTIONS";
Map<String, dynamic> postParams = {"P_PAGE_LIMIT": 50, "P_PAGE_NUM": 1, "P_FUNCTION_NAME": pFunctionName};
postParams.addAll(AppState().postParamsJson);
if (relationID != null) postParams["P_CONTACT_RELATIONSHIP_ID"] = relationID;
return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
if (responseData.getCEITransactionList?.isNotEmpty ?? false) {
return responseData.getCEITransactionList!.map((e) => GetEITTransactionList(collectionTransaction: e.collectionTransaction)).toList();
} else {
return [];
}
}, url, postParams);
}
Future<GenericResponseModel> getEitDffStructure(String pFunctionName, String? empID) async {
String url = "${ApiConsts.erpRest}GET_EIT_DFF_STRUCTURE";
Map<String, dynamic> postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E", "P_FUNCTION_NAME": pFunctionName};
@ -40,6 +55,17 @@ class MyAttendanceApiClient {
}, url, postParams);
}
Future<GenericResponseModel> getCEIDffStructure(String pFunctionName, String? empID) async {
String url = "${ApiConsts.erpRest}GET_CEI_DFF_STRUCTURE";
Map<String, dynamic> postParams = {"P_FUNCTION_NAME": pFunctionName};
postParams.addAll(AppState().postParamsJson);
if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData;
}, url, postParams);
}
Future<List<ESERVICESVS>> getValueSetValues(String pSegmentName, String pDescFlexContextCode, String pDescFlexName, List<Map<String, dynamic>> list,
{String? empID, String? parentValue, bool hasParent = false}) async {
String url = "${ApiConsts.erpRest}GET_VALUE_SET_VALUES";
@ -102,6 +128,25 @@ class MyAttendanceApiClient {
}, url, postParams);
}
Future<SubmitEITTransactionList> submitCEITransaction(String pDescFlexContextCode, String pFunctionName, List<Map<String, dynamic>> list, {String? empID, int? pContactRelationID}) async {
String url = "${ApiConsts.erpRest}SUBMIT_CEI_TRANSACTION";
Map<String, dynamic> postParams = {
"P_SELECTED_RESP_ID": -999,
"P_MENU_TYPE": "E",
"P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode,
"P_CONTACT_RELATIONSHIP_ID": pContactRelationID,
"P_FUNCTION_NAME": pFunctionName,
"EITTransactionTBL": list,
"EITTransactionTBLModel": list,
};
postParams.addAll(AppState().postParamsJson);
if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData.submitCEITransactionList!; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson());
}, url, postParams);
}
Future<SubmitEITTransactionList> submitEitTransaction(String pDescFlexContextCode, String pFunctionName, List<Map<String, dynamic>> list, {String? empID}) async {
String url = "${ApiConsts.erpRest}SUBMIT_EIT_TRANSACTION";
Map<String, dynamic> postParams = {

@ -534,6 +534,20 @@ class WorkListApiClient {
}, url, postParams);
}
Future<List<GetEitCollectionNotificationBodyList>?> GetCeiNotificationBody(int? notificationId) async {
String url = "${ApiConsts.erpRest}GET_CEI_NOTIFICATION_BODY";
Map<String, dynamic> postParams = {
"P_NOTIFICATION_ID": notificationId,
"P_PAGE_LIMIT": 100,
"P_PAGE_NUM": 1,
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData.getCEICollectionNotificationBodyList;
}, url, postParams);
}
Future<List<GetPhonesNotificationBodyList>?> getPhonesNotificationBodyList(int? notificationId) async {
String url = "${ApiConsts.erpRest}GET_PHONES_NOTIFICATION_BODY";
Map<String, dynamic> postParams = {

@ -90,7 +90,7 @@ class AppState {
String get getHuaweiPushToken => _huaweiPushToken;
final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 33, versionID: 8.5, mobileType: Platform.isAndroid ? "android" : "ios");
final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 33, versionID: 8.6, mobileType: Platform.isAndroid ? "android" : "ios");
void setPostParamsInitConfig() {
isAuthenticated = false;

@ -10,7 +10,7 @@ class ApiConsts {
// static String baseUrl = "https://hmgwebservices.com"; // Live server
static String baseUrl = "https://mohemm.hmg.com"; // New Live server
//
// static String baseUrl = "https://uat.hmgwebservices.com"; // UAT ser343622ver
// static String baseUrl = "http://10.20.200.111:1010/";

@ -7,7 +7,7 @@ class DateUtil {
///
static DateTime convertStringToDateMarathon(String date) {
// /Date(1585774800000+0300)/
// return DateTime(2025, 2, 5);
if (date != null) {
const start = "/Date(";
const end = "+0300)";

@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/models/my_documents/employee_documents_list_model.dart';
import 'package:mohem_flutter_app/ui/app_update_screen.dart';
import 'package:mohem_flutter_app/ui/attendance/add_vacation_rule_screen.dart';
import 'package:mohem_flutter_app/ui/attendance/monthly_attendance_screen.dart';
@ -33,7 +32,6 @@ import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart';
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart';
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart';
import 'package:mohem_flutter_app/ui/my_attendance/services_menu_list_screen.dart';
// import 'package:mohem_flutter_app/ui/my_attendance/my_attendance_screen.dart';
import 'package:mohem_flutter_app/ui/my_team/create_request.dart';
import 'package:mohem_flutter_app/ui/my_team/employee_details.dart';
@ -55,16 +53,16 @@ import 'package:mohem_flutter_app/ui/profile/personal_info.dart';
import 'package:mohem_flutter_app/ui/profile/profile_screen.dart';
import 'package:mohem_flutter_app/ui/screens/announcements/announcement_details.dart';
import 'package:mohem_flutter_app/ui/screens/announcements/announcements.dart';
import 'package:mohem_flutter_app/ui/screens/child_education/child_education_assistance.dart';
// import 'package:mohem_flutter_app/ui/my_attendance/work_from_home_screen.dart';
import 'package:mohem_flutter_app/ui/screens/eit/add_eit.dart';
import 'package:mohem_flutter_app/ui/screens/event_activity/event_activity.dart';
import 'package:mohem_flutter_app/ui/screens/items_for_sale/add_new_item_for_sale.dart';
import 'package:mohem_flutter_app/ui/screens/items_for_sale/item_for_sale_detail.dart';
import 'package:mohem_flutter_app/ui/screens/items_for_sale/items_for_sale_home.dart';
import 'package:mohem_flutter_app/ui/screens/mowadhafhi/mowadhafhi_home.dart';
import 'package:mohem_flutter_app/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart';
import 'package:mohem_flutter_app/ui/screens/mowadhafhi/request_details.dart';
import 'package:mohem_flutter_app/ui/screens/my_documents/my_document_detail_screen.dart';
import 'package:mohem_flutter_app/ui/screens/my_documents/my_documents_screen.dart';
import 'package:mohem_flutter_app/ui/screens/my_requests/my_requests.dart';
import 'package:mohem_flutter_app/ui/screens/my_requests/new_request.dart';
@ -198,6 +196,7 @@ class AppRoutes {
static const String manageGroup = "/manageGroup";
static const String groupMembers = "/groupmembers";
static const String groupChatDetailed = "/groupChatDetailed";
//Marathon
static const String marathonIntroScreen = "/marathonIntroScreen";
static const String marathonScreen = "/marathonScreen";
@ -208,6 +207,9 @@ class AppRoutes {
static const String unsafeDeviceScreen = "/unsafeDeviceScreen";
static const String appUpdateScreen = "/appUpdateScreen";
static const String childEducation = "/childEducation";
static const String activityScreen = "/activityScreen";
static final Map<String, WidgetBuilder> routes = {
login: (BuildContext context) => LoginScreen(),
@ -325,5 +327,7 @@ class AppRoutes {
unsafeDeviceScreen: (BuildContext context) => const UnsafeDeviceScreen(),
appUpdateScreen: (BuildContext context) => const AppUpdateScreen(),
childEducation: (BuildContext context) => ChildEducationAssistance(),
activityScreen:(BuildContext context) => const EventActivityScreen()
};
}

@ -626,7 +626,9 @@ class CodegenLoader extends AssetLoader{
"manageGroup": "إدارة المجموعة",
"members": "الأعضاء",
"searchByUserName": "البحث بواسطة اسم المستخدم",
"shareScreen": "مشاركة الشاشة"
"shareScreen": "مشاركة الشاشة",
"start":"يبدأ",
"about":"عن"
};
static const Map<String,dynamic> en_US = {
"mohemm": "Mohemm",
@ -1240,7 +1242,9 @@ static const Map<String,dynamic> en_US = {
"qtyOrdered": "Qty. Ordered",
"qtyReceived": "Qty. Received",
"bonusQty": "Bonus Qty.",
"balQty": "Bal. Qty."
"balQty": "Bal. Qty.",
"start":"Start",
"about":"About"
};
static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US};
}

@ -597,5 +597,6 @@ abstract class LocaleKeys {
static const members = 'members';
static const searchByUserName = 'searchByUserName';
static const shareScreen = 'shareScreen';
static const start = 'start';
static const about ='about';
}

@ -0,0 +1,84 @@
class EventActivityList {
EventActivityList({
required this.id,
required this.titleEn,
required this.titleAr,
required this.shortDescEn,
required this.shortDescAr,
required this.longDescEn,
required this.longDescAr,
required this.url,
required this.startOn,
required this.endOn,
required this.channel,
required this.isActive,
required this.createdBy,
required this.createdOn,
required this.modifiedBy,
required this.modifiedOn,
required this.shortImageURL,
required this.detailImageURL
});
final int? id;
final String? titleEn;
final String? titleAr;
final String? shortDescEn;
final String? shortDescAr;
final String? longDescEn;
final String? longDescAr;
final String? url;
final String? startOn;
final String? endOn;
final int? channel;
final bool? isActive;
final int? createdBy;
final String? createdOn;
final String? modifiedBy;
final String? modifiedOn;
final String? shortImageURL;
final String? detailImageURL;
factory EventActivityList.fromJson(Map<String, dynamic> json) {
return EventActivityList(
id: json["ID"],
titleEn: json["TitleEn"],
titleAr: json["TitleAr"],
shortDescEn: json["ShortDescEn"],
shortDescAr: json["ShortDescAr"],
longDescEn: json["LongDescEn"],
longDescAr: json["LongDescAr"],
url: json["URL"],
startOn: json["StartOn"],
endOn: json["EndOn"],
channel: json["Channel"],
isActive: json["IsActive"],
createdBy: json["CreatedBy"],
createdOn: json["CreatedOn"],
modifiedBy: json["ModifiedBy"],
modifiedOn: json["ModifiedOn"],
shortImageURL: json["ShortImageURL"],
detailImageURL: json["DetailImageURL"]
);
}
Map<String, dynamic> toJson() => {
"ID": id,
"TitleEn": titleEn,
"TitleAr": titleAr,
"ShortDescEn": shortDescEn,
"ShortDescAr": shortDescAr,
"LongDescEn": longDescEn,
"LongDescAr": longDescAr,
"URL": url,
"StartOn": startOn,
"EndOn": endOn,
"Channel": channel,
"IsActive": isActive,
"CreatedBy": createdBy,
"CreatedOn": createdOn,
"ModifiedBy": modifiedBy,
"ModifiedOn": modifiedOn,
"DetailImageURL": detailImageURL,
"ShortImageURL" : shortImageURL
};
}

@ -1,6 +1,7 @@
import 'package:mohem_flutter_app/models/add_att_success_list_model.dart';
import 'package:mohem_flutter_app/models/add_attachment_list_model.dart';
import 'package:mohem_flutter_app/models/basic_member_information_model.dart';
import 'package:mohem_flutter_app/models/dashboard/event_activity.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/get_open_missing_swipes_list_model.dart';
@ -184,9 +185,9 @@ class GenericResponseModel {
List<GetBasicDetColsStructureList>? getBasicDetColsStructureList;
List<GetBasicDetDffStructureList>? getBasicDetDffStructureList;
List<GetBasicDetNtfBodyList>? getBasicDetNtfBodyList;
List<String>? getCEICollectionNotificationBodyList;
List<String>? getCEIDFFStructureList;
List<String>? getCEITransactionList;
List<GetEitCollectionNotificationBodyList>? getCEICollectionNotificationBodyList;
List<GetEITDFFStructureList>? getCEIDFFStructureList;
List<GetCEITransactionList>? getCEITransactionList;
List<String>? getCcpTransactionsList;
List<GetContactColsStructureList>? getContactColsStructureList;
@ -214,6 +215,7 @@ class GenericResponseModel {
List<String>? getItemTypesList;
List<String>? getLookupValuesList;
List<GetMenuEntriesList>? getMenuEntriesList;
List<EventActivityList>? getEventActivityList;
List<GetMoItemHistoryList>? getMoItemHistoryList;
List<GetMoNotificationBodyList>? getMoNotificationBodyList;
List<GetNotificationButtonsList>? getNotificationButtonsList;
@ -226,6 +228,7 @@ class GenericResponseModel {
List<String>? getOrganizationsSalariesList;
List<GetPaymentInformationList>? getPaymentInformationList;
List<GetPayslipList>? getPayslipList;
// List<String>? getPendingReqDetailsList;
// List<String>? getPendingReqFunctionsList;
List<GetPerformanceAppraisalList>? getPerformanceAppraisalList;
@ -355,7 +358,7 @@ class GenericResponseModel {
StartTermApprovalProcessList? startTermApprovalProcessList;
SubmitAddressTransaction? submitAddressTransactionList;
SubmitBasicDetailsTransactionList? submitBasicDetTransactionList;
String? submitCEITransactionList;
SubmitEITTransactionList? submitCEITransactionList;
SubmitCcpTransactionList? submitCcpTransactionList;
SubmitContactTransactionList? submitContactTransactionList;
SubmitEITTransactionList? submitEITTransactionList;
@ -486,6 +489,7 @@ class GenericResponseModel {
this.getItemTypesList,
this.getLookupValuesList,
this.getMenuEntriesList,
this.getEventActivityList,
this.getMoItemHistoryList,
this.getMoNotificationBodyList,
this.getNotificationButtonsList,
@ -503,7 +507,7 @@ class GenericResponseModel {
this.getPoItemHistoryList,
this.getPoNotificationBodyList,
this.getPrNotificationBodyList,
this.getPaymentNotificationBodyList,
this.getPaymentNotificationBodyList,
this.getPRInformationList,
this.getQuotationAnalysisList,
this.getRFCEmployeeListList,
@ -700,7 +704,7 @@ class GenericResponseModel {
cancelHRTransactionLIst = json['CancelHRTransactionLIst'] != null ? new CancelHRTransactionLIst.fromJson(json['CancelHRTransactionLIst']) : null;
if (json['GetTermNotificationBodyList'] != null) {
getTermNotificationBodyList = <TerminationNotificationBody>[];
getTermNotificationBodyList = <TerminationNotificationBody>[];
json['GetTermNotificationBodyList'].forEach((v) {
getTermNotificationBodyList!.add(TerminationNotificationBody.fromJson(v));
});
@ -844,9 +848,24 @@ class GenericResponseModel {
});
}
getCEICollectionNotificationBodyList = json['GetCEICollectionNotificationBodyList'];
getCEIDFFStructureList = json['GetCEIDFFStructureList'];
getCEITransactionList = json['GetCEITransactionList'];
getCEICollectionNotificationBodyList = json["GetCEICollectionNotificationBodyList"] == null
? null
: List<GetEitCollectionNotificationBodyList>.from(json["GetCEICollectionNotificationBodyList"].map((x) => GetEitCollectionNotificationBodyList.fromJson(x)));
if (json['GetCEIDFFStructureList'] != null) {
getCEIDFFStructureList = <GetEITDFFStructureList>[];
json['GetCEIDFFStructureList'].forEach((v) {
getCEIDFFStructureList!.add(GetEITDFFStructureList.fromJson(v));
});
}
if (json['GetCEITransactionList'] != null) {
getCEITransactionList = <GetCEITransactionList>[];
json['GetCEITransactionList'].forEach((v) {
getCEITransactionList!.add(GetCEITransactionList.fromJson(v));
});
}
getCcpTransactionsList = json['GetCcpTransactionsList'];
getContactNotificationBodyList = json["GetContactNotificationBodyList"] == null ? null : GetContactNotificationBodyList.fromJson(json["GetContactNotificationBodyList"]);
if (json['GetContactColsStructureList'] != null) {
@ -958,6 +977,7 @@ class GenericResponseModel {
getItemTypesList = json['GetItemTypesList'];
getLookupValuesList = json['GetLookupValuesList'];
getMenuEntriesList = json["GetMenuEntriesList"] == null ? null : List<GetMenuEntriesList>.from(json["GetMenuEntriesList"].map((x) => GetMenuEntriesList.fromJson(x)));
getEventActivityList = json["EventActivityList"] == null ? null : List<EventActivityList>.from(json["EventActivityList"].map((x) => EventActivityList.fromJson(x)));
if (json['GetMoItemHistoryList'] != null) {
getMoItemHistoryList = <GetMoItemHistoryList>[];
json['GetMoItemHistoryList'].forEach((v) {
@ -1028,7 +1048,6 @@ class GenericResponseModel {
getPrNotificationBodyList = json['GetPrNotificationBodyList'] != null ? GetPrNotificationBodyList.fromJson(json['GetPrNotificationBodyList']) : null;
getPaymentNotificationBodyList = json['Pay_ReqNotificationBody'] != null ? GetPaymentNotificationBodyList.fromJson(json['Pay_ReqNotificationBody']) : null;
getPRInformationList = json['PR_Information_List'] != null ? GetPRInformationList.fromJson(json['PR_Information_List']) : null;
if (json['GetQuotationAnalysisList'] != null) {
getQuotationAnalysisList = <GetQuotationAnalysisList>[];
@ -1106,8 +1125,6 @@ class GenericResponseModel {
});
}
if (json['GetTimeCardSummaryList'] != null) {
getTimeCardSummaryList = <GetTimeCardSummaryList>[];
json['GetTimeCardSummaryList'].forEach((v) {
@ -1367,7 +1384,7 @@ class GenericResponseModel {
submitAddressTransactionList = json['SubmitAddressTransactionList'] != null ? SubmitAddressTransaction.fromJson(json['SubmitAddressTransactionList']) : null;
submitBasicDetTransactionList = json['SubmitBasicDetTransactionList'] != null ? SubmitBasicDetailsTransactionList.fromJson(json['SubmitBasicDetTransactionList']) : null;
submitCEITransactionList = json['SubmitCEITransactionList'];
submitCEITransactionList = json['SubmitCEITransactionList'] != null ? SubmitEITTransactionList.fromJson(json['SubmitCEITransactionList']) : null;
submitCcpTransactionList = json['SubmitCcpTransactionList'] != null ? new SubmitCcpTransactionList.fromJson(json['SubmitCcpTransactionList']) : null;
submitContactTransactionList = json['SubmitContactTransactionList'] != null ? SubmitContactTransactionList.fromJson(json['SubmitContactTransactionList']) : null;
submitEITTransactionList = json['SubmitEITTransactionList'] != null ? SubmitEITTransactionList.fromJson(json['SubmitEITTransactionList']) : null;
@ -1542,10 +1559,15 @@ class GenericResponseModel {
if (this.getBasicDetNtfBodyList != null) {
data['GetBasicDetNtfBodyList'] = this.getBasicDetNtfBodyList!.map((v) => v.toJson()).toList();
}
data['GetCEICollectionNotificationBodyList'] = this.getCEICollectionNotificationBodyList;
data['GetCEIDFFStructureList'] = this.getCEIDFFStructureList;
data['GetCEITransactionList'] = this.getCEITransactionList;
if (this.getCEIDFFStructureList != null) {
data['GetCEIDFFStructureList'] = this.getCEIDFFStructureList!.map((v) => v.toJson()).toList();
}
if (this.getCEITransactionList != null) {
data['GetCEITransactionList'] = this.getCEITransactionList!.map((v) => v.toJson()).toList();
}
data['GetCcpTransactionsList'] = this.getCcpTransactionsList;
if (this.getContactDetailsList != null) {
data['GetContactDetailsList'] = this.getContactDetailsList!.map((v) => v.toJson()).toList();
@ -1612,6 +1634,7 @@ class GenericResponseModel {
data['GetItemTypesList'] = this.getItemTypesList;
data['GetLookupValuesList'] = this.getLookupValuesList;
data['GetMenuEntriesList'] = this.getMenuEntriesList;
data['EventActivityList'] = this.getEventActivityList;
if (this.getMoItemHistoryList != null) {
data['GetMoItemHistoryList'] = this.getMoItemHistoryList!.map((v) => v.toJson()).toList();
}
@ -1628,7 +1651,7 @@ class GenericResponseModel {
data['GetNotificationReassignModeList'] = getNotificationReassignModeList!.map((v) => v.toJson()).toList();
}
if(getTermNotificationBodyList !=null){
if (getTermNotificationBodyList != null) {
data['GetTermNotificationBodyList'] = getTermNotificationBodyList!.map((v) => v.toJson()).toList();
}
data['GetObjectValuesList'] = this.getObjectValuesList;
@ -1837,6 +1860,10 @@ class GenericResponseModel {
}
data['SubmitCEITransactionList'] = this.submitCEITransactionList;
if (this.submitCEITransactionList != null) {
data['SubmitCEITransactionList'] = this.submitCEITransactionList!.toJson();
}
if (this.submitCcpTransactionList != null) {
data['SubmitCcpTransactionList'] = this.submitCcpTransactionList!.toJson();
}

@ -15,8 +15,30 @@ class GetEITTransactionList {
Map<String, dynamic> toJson() {
Map<String, dynamic> data = new Map<String, dynamic>();
if (this.collectionTransaction != null) {
data['Collection_Transaction'] =
this.collectionTransaction!.map((v) => v.toJson()).toList();
data['Collection_Transaction'] = this.collectionTransaction!.map((v) => v.toJson()).toList();
}
return data;
}
}
class GetCEITransactionList {
List<CollectionTransaction>? collectionTransaction;
GetCEITransactionList({this.collectionTransaction});
GetCEITransactionList.fromJson(Map<String, dynamic> json) {
if (json['Collection_Transaction'] != null) {
collectionTransaction = <CollectionTransaction>[];
json['Collection_Transaction'].forEach((v) {
collectionTransaction!.add(new CollectionTransaction.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
Map<String, dynamic> data = new Map<String, dynamic>();
if (this.collectionTransaction != null) {
data['Collection_Transaction'] = this.collectionTransaction!.map((v) => v.toJson()).toList();
}
return data;
}
@ -43,22 +65,22 @@ class CollectionTransaction {
CollectionTransaction(
{this.aPPLICATIONCOLUMNNAME,
this.dATATYPE,
this.dATEVALUE,
this.dESCFLEXCONTEXTCODE,
this.dESCFLEXNAME,
this.dISPLAYFLAG,
this.fROMROWNUM,
this.nOOFROWS,
this.nUMBERVALUE,
this.rOWNUM,
this.sEGMENTNAME,
this.sEGMENTPROMPT,
this.sEGMENTSEQNUM,
this.sEGMENTVALUEDSP,
this.tOROWNUM,
this.tRANSACTIONNUMBER,
this.vARCHAR2VALUE});
this.dATATYPE,
this.dATEVALUE,
this.dESCFLEXCONTEXTCODE,
this.dESCFLEXNAME,
this.dISPLAYFLAG,
this.fROMROWNUM,
this.nOOFROWS,
this.nUMBERVALUE,
this.rOWNUM,
this.sEGMENTNAME,
this.sEGMENTPROMPT,
this.sEGMENTSEQNUM,
this.sEGMENTVALUEDSP,
this.tOROWNUM,
this.tRANSACTIONNUMBER,
this.vARCHAR2VALUE});
CollectionTransaction.fromJson(Map<String, dynamic> json) {
aPPLICATIONCOLUMNNAME = json['APPLICATION_COLUMN_NAME'];
@ -101,4 +123,4 @@ class CollectionTransaction {
data['VARCHAR2_VALUE'] = this.vARCHAR2VALUE;
return data;
}
}
}

@ -9,6 +9,7 @@ import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/main.dart';
import 'package:mohem_flutter_app/models/dashboard/drawer_menu_item_model.dart';
import 'package:mohem_flutter_app/models/dashboard/event_activity.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/get_open_notifications_list.dart';
@ -20,7 +21,6 @@ import 'package:mohem_flutter_app/models/dashboard/mohemm_itg_pending_task_respo
import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart';
import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart';
import 'package:mohem_flutter_app/ui/landing/dashboard_screen.dart';
import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart';
/// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for the devtool
@ -50,9 +50,12 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
//Menu Entries
bool isServicesMenusLoading = true;
bool isEventLoadingLoading = true;
List<Menus>? homeMenus;
List<GetMenuEntriesList>? getMenuEntriesList;
EventActivityList? eventActivity;
//Offers And Discounts
bool isOffersLoading = true;
List<OffersListModel> getOffersList = [];
@ -99,6 +102,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
ticketBalance = 0;
isServicesMenusLoading = true;
isEventLoadingLoading = true;
homeMenus = null;
getMenuEntriesList = null;
isOffersLoading = true;
@ -253,8 +257,28 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
notifyListeners();
} catch (ex) {
// Utils.hideLoading(context);
getOffersList = [];
isOffersLoading = false;
notifyListeners();
Utils.handleException(ex, context, null);
// Utils.handleException(ex, context, null);
}
}
void fetchEventActivity() async {
try {
GenericResponseModel? genericResponseModel = await DashboardApiClient().getEventActivity();
List<EventActivityList> eventList = (genericResponseModel!.getEventActivityList ?? []);
if (eventList.isNotEmpty) {
eventActivity = eventList.first;
}
isEventLoadingLoading = false;
notifyListeners();
} catch (ex) {
logger.wtf(ex);
isEventLoadingLoading = false;
notifyListeners();
Utils.handleException(ex, null, null);
}
}

@ -3,7 +3,6 @@ import 'dart:io';
import 'dart:ui' as ui;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_countdown_timer/flutter_countdown_timer.dart';
import 'package:flutter_svg/flutter_svg.dart';
@ -22,6 +21,7 @@ import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.da
import 'package:mohem_flutter_app/models/privilege_list_model.dart';
import 'package:mohem_flutter_app/provider/chat_provider_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/landing/event_activity_banner.dart';
import 'package:mohem_flutter_app/ui/landing/widget/app_drawer.dart';
import 'package:mohem_flutter_app/ui/landing/widget/menus_widget.dart';
import 'package:mohem_flutter_app/ui/landing/widget/services_widget.dart';
@ -150,6 +150,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
data.fetchMissingSwipe(context);
data.fetchLeaveTicketBalance(context, DateTime.now());
data.fetchMenuEntries();
data.fetchEventActivity();
data.getCategoryOffersListAPI(context);
marathonProvider.getMarathonDetailsFromApi();
marathonProvider.getMarathonTutorial();
@ -421,103 +422,109 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
),
],
).paddingOnly(left: 21, right: 21, top: 7, bottom: 21),
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
LocaleKeys.offers.tr().toText12(),
Row(
children: [
LocaleKeys.discounts.tr().toText24(isBold: true),
6.width,
Container(
padding: const EdgeInsets.only(left: 8, right: 8),
decoration: BoxDecoration(
color: MyColors.yellowColor,
borderRadius: BorderRadius.circular(10),
),
child: LocaleKeys.newString.tr().toText10(isBold: true)),
],
),
],
eventActivityWidget(context),
Consumer<DashboardProviderModel>(builder: (BuildContext context, DashboardProviderModel model, Widget? child) {
if (!model.isOffersLoading && model.getOffersList.isEmpty) {
return const SizedBox();
}
return Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
LocaleKeys.offers.tr().toText12(),
Row(
children: [
LocaleKeys.discounts.tr().toText24(isBold: true),
6.width,
Container(
padding: const EdgeInsets.only(left: 8, right: 8),
decoration: BoxDecoration(
color: MyColors.yellowColor,
borderRadius: BorderRadius.circular(10),
),
child: LocaleKeys.newString.tr().toText10(isBold: true)),
],
),
],
),
),
),
LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true).onPress(() {
Navigator.pushNamed(context, AppRoutes.offersAndDiscounts);
})
],
).paddingOnly(left: 21, right: 21),
Consumer<DashboardProviderModel>(
builder: (BuildContext context, DashboardProviderModel model, Widget? child) {
return SizedBox(
height: 103 + 33,
child: ListView.separated(
shrinkWrap: true,
physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.only(left: 21, right: 21, top: 13),
scrollDirection: Axis.horizontal,
itemBuilder: (BuildContext cxt, int index) {
return model.isOffersLoading
? const OffersShimmerWidget()
: InkWell(
onTap: () {
navigateToDetails(data.getOffersList[index]);
},
child: SizedBox(
width: 73,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
width: 73,
height: 73,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: const BorderRadius.all(
Radius.circular(100),
),
border: Border.all(color: MyColors.lightGreyE3Color, width: 1),
),
child: ClipRRect(
borderRadius: const BorderRadius.all(
Radius.circular(50),
LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true).onPress(() {
Navigator.pushNamed(context, AppRoutes.offersAndDiscounts);
})
],
).paddingOnly(left: 21, right: 21),
Consumer<DashboardProviderModel>(
builder: (BuildContext context, DashboardProviderModel model, Widget? child) {
return SizedBox(
height: 103 + 33,
child: ListView.separated(
shrinkWrap: true,
physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.only(left: 21, right: 21, top: 13),
scrollDirection: Axis.horizontal,
itemBuilder: (BuildContext cxt, int index) {
return model.isOffersLoading
? const OffersShimmerWidget()
: InkWell(
onTap: () {
navigateToDetails(data.getOffersList[index]);
},
child: SizedBox(
width: 73,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
width: 73,
height: 73,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: const BorderRadius.all(
Radius.circular(100),
),
border: Border.all(color: MyColors.lightGreyE3Color, width: 1),
),
child: Hero(
tag: "ItemImage" + data.getOffersList[index].offersDiscountId.toString()!,
transitionOnUserGestures: true,
child: Image.network(
data.getOffersList[index].logo ?? "",
fit: BoxFit.contain,
child: ClipRRect(
borderRadius: const BorderRadius.all(
Radius.circular(50),
),
child: Hero(
tag: "ItemImage" + data.getOffersList[index].offersDiscountId.toString()!,
transitionOnUserGestures: true,
child: Image.network(
data.getOffersList[index].logo ?? "",
fit: BoxFit.contain,
),
),
),
),
),
4.height,
Expanded(
child: AppState().isArabic(context)
? data.getOffersList[index].titleAr!.toText12(isCenter: true, maxLine: 1)
: data.getOffersList[index].titleEn!.toText12(isCenter: true, maxLine: 1),
),
],
4.height,
Expanded(
child: AppState().isArabic(context)
? data.getOffersList[index].titleAr!.toText12(isCenter: true, maxLine: 1)
: data.getOffersList[index].titleEn!.toText12(isCenter: true, maxLine: 1),
),
],
),
),
),
);
},
separatorBuilder: (BuildContext cxt, int index) => 8.width,
itemCount: 9),
);
},
),
],
),
);
},
separatorBuilder: (BuildContext cxt, int index) => 8.width,
itemCount: 9),
);
},
),
],
);
}),
Container(
width: double.infinity,
padding: const EdgeInsets.only(top: 31),
@ -709,6 +716,14 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
return false;
}
Widget eventActivityWidget(BuildContext context) {
return (context.watch<DashboardProviderModel>().isEventLoadingLoading)
? const MarathonBannerShimmer().paddingOnly(left: 21, right: 21, bottom: 21, top: 0)
: (context.watch<DashboardProviderModel>().eventActivity != null && context.watch<DashboardProviderModel>().eventActivity!.isActive ==true)
? const EventActivityBanner().paddingOnly(left: 21, right: 21, bottom: 21, top: 0)
: const SizedBox();
}
void navigateToDetails(OffersListModel offersListModelObj) {
List<OffersListModel> getOffersDetailList = [];
getOffersDetailList.clear();

@ -0,0 +1,367 @@
import 'dart:math' as math;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/date_uitl.dart';
import 'package:mohem_flutter_app/classes/decorations_helper.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/main.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/countdown_timer_main_screen.dart';
import 'package:mohem_flutter_app/widgets/glowy_borders/glowy_borders.dart';
import 'package:provider/provider.dart';
int dummyTime = DateTime.now().millisecondsSinceEpoch + 8690;
class EventActivityBanner extends StatelessWidget {
const EventActivityBanner({Key? key}) : super(key: key);
Widget getNoUpcomingMarathonWidget(BuildContext context) {
;
return Container(
decoration: MyDecorations.shadowDecoration,
height: isTablet ? MediaQuery.of(context).size.height * 0.17 : MediaQuery.of(context).size.height * 0.11,
clipBehavior: Clip.antiAlias,
child: Stack(
children: <Widget>[
Transform(
alignment: Alignment.center,
transform: Matrix4.rotationY(
AppState().isArabic(context) ? math.pi : 0,
),
child: SvgPicture.asset(
"assets/images/marathon_banner_bg.svg",
fit: BoxFit.fill,
width: double.infinity,
),
),
AppState().isArabic(context)
? Positioned(
right: -15,
top: -10,
child: Transform.rotate(
angle: 10,
child: Container(
width: isTablet ? 70 : 65,
height: isTablet ? 40 : 32,
color: MyColors.darkDigitColor,
),
),
)
: Positioned(
left: -20,
top: -10,
child: Transform.rotate(
angle: 15,
child: Container(
width: isTablet ? 70 : 65,
height: isTablet ? 40 : 32,
color: MyColors.darkDigitColor,
),
),
),
SizedBox(
width: double.infinity,
height: double.infinity,
child: Row(
children: <Widget>[
const Expanded(
flex: 3,
child: SizedBox(
width: double.infinity,
height: double.infinity,
),
),
Expanded(
flex: AppState().isArabic(context) ? 4 : 5,
child: SizedBox(
width: double.infinity,
height: double.infinity,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
AppState().isArabic(context) ? 0.height : 5.height,
Text(
LocaleKeys.noUpcoming.tr(),
style: TextStyle(
fontSize: isTablet ? 20 : 11,
fontStyle: FontStyle.italic,
fontWeight: FontWeight.w600,
color: MyColors.white.withOpacity(0.83),
letterSpacing: -0.4,
),
),
Text(
LocaleKeys.brainMarathon.tr(),
style: TextStyle(
fontStyle: FontStyle.italic,
fontSize: isTablet ? 30 : 19,
fontWeight: FontWeight.bold,
color: MyColors.white.withOpacity(0.83),
height: 32 / 22,
),
),
Text(
LocaleKeys.youCanPlayDemo.tr(),
style: TextStyle(
fontSize: isTablet ? 20 : 11,
fontStyle: FontStyle.italic,
fontWeight: FontWeight.w600,
color: MyColors.white.withOpacity(0.83),
letterSpacing: -0.4,
),
),
],
).paddingOnly(
left: AppState().isArabic(context) ? 12 : 3,
right: AppState().isArabic(context) ? 3 : 12,
)
],
),
),
),
],
),
),
AppState().isArabic(context)
? Align(
alignment: Alignment.topRight,
child: SizedBox(
height: isTablet ? 30 : 20,
width: isTablet ? 45 : 35,
child: Transform.rotate(
angle: math.pi / 4.5,
child: Text(
LocaleKeys.brainMarathon.tr(),
textAlign: TextAlign.center,
maxLines: 2,
style: TextStyle(
color: MyColors.white,
fontWeight: FontWeight.bold,
fontSize: isTablet ? 8 : 6,
height: 1.2,
),
),
),
),
).paddingOnly(top: 5)
: Align(
alignment: Alignment.topLeft,
child: SizedBox(
height: isTablet ? 30 : 20,
width: isTablet ? 45 : 35,
child: Transform.rotate(
angle: -math.pi / 4.5,
child: Text(
LocaleKeys.brainMarathon.tr(),
textAlign: TextAlign.center,
maxLines: 2,
style: TextStyle(
color: MyColors.kWhiteColor,
fontWeight: FontWeight.bold,
fontSize: isTablet ? 8 : 6,
height: 1.2,
),
),
),
),
).paddingOnly(top: 5),
],
),
).onPress(() {
Navigator.pushNamed(context, AppRoutes.marathonIntroScreen);
});
}
@override
Widget build(BuildContext context) {
DashboardProviderModel dashboardProvider = context.read<DashboardProviderModel>();
return SizedBox(
// decoration: BoxDecoration(
// color: MyColors.kWhiteColor,
// borderRadius: BorderRadius.circular(8),
// boxShadow: [
// BoxShadow(
// color: const Color(0xff000000).withOpacity(.05),
// blurRadius: 26,
// offset: const Offset(0, -3),
// ),
// ],
// ),
height: isTablet ? MediaQuery.of(context).size.height * 0.17 : MediaQuery.of(context).size.height * 0.11,
child: AnimatedGradientBorder(
borderSize: 3,
stretchAlongAxis: true,
animationTime: 2,
stretchAxis: Axis.vertical,
gradientColors: const [
Color(0xff0E5A64),
Color(0xff0E5A64),
Color(0xff0E5A64),
Color(0xff91C481),
],
borderRadius: BorderRadius.circular(10),
child: Container(
decoration: BoxDecoration(
color: const Color(0xff0E5A64),
borderRadius: BorderRadius.circular(8),
),
// height: isTablet ? MediaQuery.of(context).size.height * 0.17 : MediaQuery.of(context).size.height * 0.11,
child: Stack(
children: <Widget>[
// Transform(
// alignment: Alignment.center,
// // transform: Matrix4.rotationY(
// // AppState().isArabic(context) ? math.pi : 0,
// // ),
// child:
//
AppState().isArabic(context)
? Positioned(
left: -15,
top: -10,
child: Transform.rotate(
angle: 10,
child: SizedBox(
child: SvgPicture.asset(
"assets/images/light_bulb.svg"),
),
),
)
: Positioned(
right: 0,
top: 10,
child: Opacity(
opacity: .5,
child: SvgPicture.asset(
"assets/images/light_bulb.svg",
),
)),
SizedBox(
width: double.infinity,
height: double.infinity,
child: Row(
children: <Widget>[
Expanded(
flex: 3,
child: Image.network(
dashboardProvider.eventActivity?.shortImageURL ??
"",
fit: BoxFit.cover,
key: UniqueKey()
).paddingAll(5)),
Expanded(
flex: AppState().isArabic(context) ? 4 : 5,
child: SizedBox(
width: double.infinity,
height: double.infinity,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
AppState().isArabic(context) ? 0.height : 5.height,
Flexible(
child: Text(
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: 3,
englishContent: dashboardProvider.eventActivity?.titleEn ?? "",
arabicContent: dashboardProvider.eventActivity?.titleAr ?? "",
),
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontStyle: FontStyle.italic,
fontSize: isTablet ? 25 : 16,
fontWeight: FontWeight.bold,
color: MyColors.white,
height: 32 / 24,
),
),
), Text(
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: 3,
englishContent: dashboardProvider.eventActivity?.shortDescEn ?? "",
arabicContent: dashboardProvider.eventActivity?.shortDescAr ?? "",
),
style: TextStyle(
fontSize: isTablet ? 20 : 11,
fontStyle: FontStyle.italic,
fontWeight: FontWeight.w600,
color: MyColors.white,
letterSpacing: -0.5,
),
),
isTablet ? 15.height : 10.height,
CountdownTimerForMainScreen(
timeToMarathon: DateUtil.convertStringToDateMarathon(dashboardProvider.eventActivity!.startOn!).millisecondsSinceEpoch,
provider: context.read<MarathonProvider>(),
isEvent: true,
),
],
).paddingOnly(
left: AppState().isArabic(context) ? 12 : 3,
right: AppState().isArabic(context) ? 3 : 12,
)
],
),
),
),
],
),
),
!AppState().isArabic(context)
? Positioned(
right: 0,
bottom: 0,
child: RotatedBox(
quarterTurns: 4,
child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.whiteColor),
).paddingAll(isTablet ? 20 : 15),
)
: Positioned(
bottom: 0,
left: 0,
child: RotatedBox(
quarterTurns: 2,
child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.whiteColor),
).paddingAll(isTablet ? 20 : 15),
),
],
).onPress(() async {
// int remainingTimeInMinutes = DateUtil.convertStringToDateMarathon(dashboardProvider.eventActivity!.startOn!).difference(DateTime.now()).inMinutes;
// if (remainingTimeInMinutes < 0) {
Navigator.pushNamed(context, AppRoutes.activityScreen);
//}
// provider.updateLanguageAsPerMarathon(context, provider.isUpComingMarathon ? provider.marathonDetailModel : provider.demoMarathonDetailModel);
})),
),
);
}
}

@ -64,7 +64,7 @@ class _LeaveBalanceState extends State<LeaveBalance> {
context,
title: LocaleKeys.leaveBalance.tr(),
),
body: Column(
body:SingleChildScrollView(child:Column(
children: [
Padding(
padding: const EdgeInsets.all(21.0),
@ -76,8 +76,10 @@ class _LeaveBalanceState extends State<LeaveBalance> {
: (absenceTransList!.isEmpty
? Utils.getNoDataWidget(context).paddingOnly(top: 50)
: ListView(
physics: const BouncingScrollPhysics(),
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
padding: const EdgeInsets.all(21),
children: [
// BalancesDashboardWidget(LocaleKeys.currentLeaveBalance.tr(), true, selectedEmp: employeeId, showLoading: false),
// 12.height,
@ -113,7 +115,7 @@ class _LeaveBalanceState extends State<LeaveBalance> {
],
)),
],
),
)),
floatingActionButton: Container(
height: 54,
width: 54,

@ -59,8 +59,7 @@ class _LoginScreenState extends State<LoginScreen> {
bool? isAppOpenBySystem;
bool isJailBroken = false;
bool isRealDevice = false;
bool isOnExternalStorage = false;
bool isRealDevice = true;
bool isDevelopmentModeEnable = false;
BasicMemberInformationModel? _basicMemberInformation;
@ -78,16 +77,20 @@ class _LoginScreenState extends State<LoginScreen> {
}
}
void checkDeviceSafety() async {
void checkDeviceSafety() {
try {
isJailBroken = await SafeDevice.isJailBroken;
isRealDevice = await SafeDevice.isRealDevice;
SafeDevice.isJailBroken.then((bool value) {
isJailBroken = value;
});
SafeDevice.isRealDevice.then((value) {
isRealDevice = value;
});
if (Platform.isAndroid) {
isOnExternalStorage = await SafeDevice.isOnExternalStorage;
isDevelopmentModeEnable = await SafeDevice.isDevelopmentModeEnable;
}
if (isJailBroken || !isRealDevice || isOnExternalStorage || isDevelopmentModeEnable) {
Navigator.pushNamedAndRemoveUntil(context, AppRoutes.unsafeDeviceScreen, (_) => false);
// isOnExternalStorage = await SafeDevice.isOnExternalStorage;
// SafeDevice.isDevelopmentModeEnable.then((value) {
// isDevelopmentModeEnable = value;
// });
}
} catch (error) {
print(error);
@ -123,7 +126,14 @@ class _LoginScreenState extends State<LoginScreen> {
firebaseToken = "";
}
AppNotifications().init(firebaseToken, context);
checkLoginInfo();
if (isJailBroken || !isRealDevice) {
Utils.hideLoading(context);
Navigator.pushNamedAndRemoveUntil(context, AppRoutes.unsafeDeviceScreen, (_) => false);
} else {
checkLoginInfo();
}
await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
}
// });
@ -201,6 +211,8 @@ class _LoginScreenState extends State<LoginScreen> {
}
Utils.saveStringFromPrefs(SharedPrefsConsts.password, password.text);
} catch (ex) {
print(ex);
print(ex.toString());
Utils.hideLoading(context);
Utils.handleException(ex, context, (msg) {
Utils.confirmDialog(

@ -13,19 +13,15 @@ import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
class CountdownTimerForMainScreen extends StatelessWidget {
final int timeToMarathon;
final MarathonProvider provider;
final bool isEvent;
CountdownTimerForMainScreen({
Key? key,
required this.provider,
required this.timeToMarathon,
this.isEvent =false,
}) : super(key: key);
final TextStyle styleTextHome = TextStyle(
color: MyColors.white.withOpacity(0.45),
fontStyle: FontStyle.italic,
fontWeight: FontWeight.w800,
letterSpacing: -0.4,
);
final TextStyle styleDigitHome = TextStyle(
height: 22 / 27,
@ -75,7 +71,13 @@ class CountdownTimerForMainScreen extends StatelessWidget {
text,
minFontSize: 7,
maxFontSize: 8,
style: styleTextHome,
style: TextStyle(
color: isEvent ? MyColors.white : MyColors.white.withOpacity(0.45),
fontStyle: FontStyle.italic,
fontWeight: FontWeight.w800,
letterSpacing: -0.4,
),
);
}

@ -46,10 +46,17 @@ class _DynamicInputScreenState extends State<DynamicInputScreen> {
void getTransactionsStructure() async {
try {
Utils.showLoading(context);
genericResponseModel = await MyAttendanceApiClient().getEitDffStructure(dynamicParams!.dynamicId, dynamicParams!.selectedEmp);
if (dynamicParams?.pContactRelationshipId == null) {
genericResponseModel = await MyAttendanceApiClient().getEitDffStructure(dynamicParams!.dynamicId, dynamicParams!.selectedEmp);
getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? [];
} else {
genericResponseModel = await MyAttendanceApiClient().getCEIDffStructure(dynamicParams!.dynamicId, null);
getEitDffStructureList = genericResponseModel?.getCEIDFFStructureList ?? [];
}
dESCFLEXCONTEXTCODE = genericResponseModel!.pDESCFLEXCONTEXTCODE ?? "";
descFlexConTextTitle = genericResponseModel!.pDESCFLEXCONTEXTNAME ?? "";
getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? [];
// getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? [];
//getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList();
Utils.hideLoading(context);
setState(() {});
@ -90,11 +97,21 @@ class _DynamicInputScreenState extends State<DynamicInputScreen> {
}).toList();
values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_ACTION", nUMBERVALUE: null, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: "NEW_ROW").toJson());
values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_EXTRA_INFO_ID", nUMBERVALUE: -1, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson());
values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_OBJECT_VERSION_NUMBER", nUMBERVALUE: 0, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson());
genericResponseModel = await MyAttendanceApiClient().validateEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values, empID: dynamicParams!.selectedEmp);
SubmitEITTransactionList submitEITTransactionList = await MyAttendanceApiClient().submitEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values, empID: dynamicParams!.selectedEmp);
if (dynamicParams!.pContactRelationshipId == null) {
values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_EXTRA_INFO_ID", nUMBERVALUE: -1, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson());
values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_OBJECT_VERSION_NUMBER", nUMBERVALUE: 0, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson());
} else {
values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "CONTACT_EXTRA_INFO_ID", nUMBERVALUE: -1, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson());
values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "CEI_OBJECT_VERSION_NUMBER", nUMBERVALUE: 0, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson());
}
SubmitEITTransactionList submitEITTransactionList;
if (dynamicParams!.pContactRelationshipId == null) {
genericResponseModel = await MyAttendanceApiClient().validateEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values, empID: dynamicParams!.selectedEmp);
submitEITTransactionList = await MyAttendanceApiClient().submitEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values, empID: dynamicParams!.selectedEmp);
} else {
submitEITTransactionList = await MyAttendanceApiClient().submitCEITransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values, pContactRelationID: dynamicParams!.pContactRelationshipId);
}
Utils.hideLoading(context);
await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen,
arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submitEITTransactionList.pTRANSACTIONID!, submitEITTransactionList.pITEMKEY!, 'eit',

@ -24,11 +24,13 @@ class DynamicListViewParams {
List<CollectionNotificationEit>? collectionNotificationList;
final String? selectedEmp;
final int? pContactRelationshipId;
DynamicListViewParams(
this.title,
this.dynamicId, {
this.selectedEmp,
this.pContactRelationshipId,
this.uRL = 'GET_EIT_DFF_STRUCTURE',
this.requestID = '',
this.colsURL = '',
@ -59,10 +61,14 @@ class _DynamicListViewScreenState extends State<DynamicListViewScreen> {
super.initState();
}
void getTransactions() async {
void getTransactions({bool isCei = false}) async {
try {
Utils.showLoading(context);
getEITTransactionList = await MyAttendanceApiClient().getEitTransaction(dynamicParams!.dynamicId, dynamicParams!.selectedEmp);
if (isCei) {
getEITTransactionList = await MyAttendanceApiClient().getCeiTransaction(dynamicParams!.dynamicId, dynamicParams!.pContactRelationshipId);
} else {
getEITTransactionList = await MyAttendanceApiClient().getEitTransaction(dynamicParams!.dynamicId, dynamicParams!.selectedEmp);
}
getEITTransactionList?.forEach((element) {
element.collectionTransaction = element.collectionTransaction?.where((elemen) => elemen.dISPLAYFLAG == "Y").toList() ?? [];
});
@ -97,8 +103,13 @@ class _DynamicListViewScreenState extends State<DynamicListViewScreen> {
Widget build(BuildContext context) {
if (dynamicParams == null) {
dynamicParams = ModalRoute.of(context)!.settings.arguments as DynamicListViewParams;
isTicketRequest = dynamicParams!.dynamicId == "HMG_TKT_NEW_EIT_SS";
getTransactions();
if (dynamicParams?.pContactRelationshipId == null) {
isTicketRequest = dynamicParams!.dynamicId == "HMG_TKT_NEW_EIT_SS";
getTransactions();
} else {
isTicketRequest = false;
getTransactions(isCei: true);
}
}
Widget dataWidget = ListView(
physics: const BouncingScrollPhysics(),

@ -64,6 +64,8 @@ class ServicesMenuListScreen extends StatelessWidget {
if (servicesMenuData.list[index].requestType == "EIT") {
Navigator.pushNamed(context, AppRoutes.dynamicScreen,
arguments: DynamicListViewParams(servicesMenuData.list[index].prompt!, servicesMenuData.list[index].functionName!, selectedEmp: servicesMenuData.selectedEmp));
} else if (servicesMenuData.list[index].requestType == "CEI") {
Navigator.pushNamed(context, AppRoutes.childEducation, arguments: servicesMenuData.list[index]);
} else {
if (servicesMenuData.list[index].requestType == "TERMINATION") {
Navigator.pushNamed(context, AppRoutes.endEmploymentScreen,

@ -0,0 +1,58 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/profile_api_client.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/get_employee_contacts.model.dart';
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
class ChildEducationAssistance extends StatelessWidget {
ChildEducationAssistance({Key? key}) : super(key: key);
GetMenuEntriesList? menuEntry;
@override
Widget build(BuildContext context) {
menuEntry ??= ModalRoute.of(context)!.settings.arguments as GetMenuEntriesList;
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBarWidget(context, title: menuEntry!.prompt!),
body: FutureBuilder(
future: ProfileApiClient().getEmployeeContacts(),
builder: (BuildContext cxt, AsyncSnapshot<List<GetEmployeeContactsList>> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
} else if (snapshot.hasData) {
List<GetEmployeeContactsList> empContactList = snapshot.data!;
return ListView.separated(
padding: const EdgeInsets.all(21),
separatorBuilder: (BuildContext cxt, int index) => 12.height,
itemCount: empContactList.length,
itemBuilder: (BuildContext context, int index) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
"${empContactList[index].cONTACTNAME}".toText16(color: MyColors.grey3AColor),
"${LocaleKeys.dateOfBirth.tr()}: ${empContactList[index].dATEOFBIRTH?.split(" ").first ?? ""}".toText14(color: MyColors.grey3AColor, weight: FontWeight.w400),
"${empContactList[index].rELATIONSHIP}".toText11(color: MyColors.textMixColor),
],
).objectContainerView(disablePadding: false, center: false).onPress(() {
Navigator.pushNamed(context, AppRoutes.dynamicScreen,
arguments: DynamicListViewParams(empContactList[index].cONTACTNAME!, menuEntry!.functionName!, pContactRelationshipId: empContactList[index].cONTACTRELATIONSHIPID));
});
});
} else {
return LocaleKeys.noDataAvailable.tr().toText16().center;
}
},
),
);
}
}

@ -0,0 +1,115 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/consts.dart';
import 'package:mohem_flutter_app/classes/decorations_helper.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/main.dart';
import 'package:mohem_flutter_app/models/marathon/marathon_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:provider/provider.dart';
import 'package:shimmer/shimmer.dart';
class ActivityEventDetailsCard extends StatelessWidget {
final DashboardProviderModel model;
const ActivityEventDetailsCard({Key? key, required this.model}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: double.infinity,
decoration: MyDecorations.shadowDecoration,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
CachedNetworkImage(
imageUrl: model.eventActivity!.detailImageURL!,
height: 200,
placeholder: (BuildContext context, String url) => const LinearProgressIndicator(
value: 0.7,
minHeight: 200,
valueColor: AlwaysStoppedAnimation<Color>(Colors.white),
backgroundColor: Color(0xff196D73),
).toShimmer(),
fit: BoxFit.contain,width: double.infinity ,
cacheKey: UniqueKey().toString(),
),
],
),
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 20,),
Text(
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: 3,
englishContent: model.eventActivity?.titleEn ?? "",
arabicContent: model.eventActivity?.titleAr ?? "",
),
style: TextStyle(
fontStyle: FontStyle.italic,
fontSize: isTablet ? 30 : 20,
fontWeight: FontWeight.bold,
color:const Color(0xff3C3838),
// height: 42 / 30,
),
).paddingOnly(left: 10, right: 10, bottom: 2),
Row(children:[
SvgPicture.asset("assets/images/highlight.svg"),
Text(
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: 3,
englishContent: model.eventActivity?.shortDescEn ?? "",
arabicContent: model.eventActivity?.shortDescAr ?? "",
),
style: TextStyle(
fontStyle: FontStyle.italic,
fontSize: isTablet ? 20 : 14,
fontWeight: FontWeight.bold,
color:const Color(0xff2BB8A8),
// height: 32 / 24,
),
).paddingOnly(left: 10, right: 10)
]).paddingOnly(bottom: 25),
LocaleKeys.about.tr().toText16(color: const Color(0xff3C3838)).paddingOnly(bottom: 5),
Text(
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: 3,
englishContent: model.eventActivity?.longDescEn ?? "",
arabicContent: model.eventActivity?.longDescAr ?? "",
),
style: TextStyle(
fontStyle: FontStyle.italic,
fontSize: isTablet ? 18 : 12,
fontWeight: FontWeight.bold,
color:const Color(0xff3C3838),
// height: 32 / 24,
),
).paddingOnly(bottom: 10)
],
)
]);
}
}

@ -0,0 +1,94 @@
// ignore_for_file: always_specify_types
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_countdown_timer/flutter_countdown_timer.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/date_uitl.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/main.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/countdown_timer_main_screen.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
class ActivityEventFooter extends StatelessWidget {
final DashboardProviderModel provider;
const ActivityEventFooter({
Key? key,
required this.provider,
}) : super(key: key);
@override
Widget build(BuildContext context) {
int remainingTime = DateTime.now().millisecondsSinceEpoch + DateUtil.convertStringToDateMarathon(provider.eventActivity!.startOn!).difference(DateTime.now()).inMilliseconds;
return Column(children: [
CountdownTimer(
endTime: remainingTime,
widgetBuilder: (context, time) {
if (time == null) {
return DefaultButton(
LocaleKeys.start.tr(),
() => launchUrl(Uri.parse(provider.eventActivity!.url!)),
color: MyColors.greenColor,
).insideContainer;
}
return Container(
height: 58,
padding: const EdgeInsets.only(
top: 15, bottom: 15, right: 30, left: 30),
margin: const EdgeInsets.only(top: 5, bottom: 5),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6.0),
gradient:
const LinearGradient(
transform: GradientRotation(.83),
begin: Alignment.topRight,
end: Alignment.bottomLeft,
colors: <Color>[
MyColors.gradiantEndColor,
MyColors.gradiantStartColor
],
),
),
child: CountdownTimerForMainScreen(
timeToMarathon: DateUtil
.convertStringToDateMarathon(provider.eventActivity!.startOn!)
.millisecondsSinceEpoch,
provider: context.read<MarathonProvider>(),
isEvent: true,
));
},
onEnd: (){
},
endWidget: DefaultButton(
LocaleKeys.start.tr(),
() => launchUrl(Uri.parse(provider.eventActivity!.url!)),
color: MyColors.greenColor,
).insideContainer,
)
// if (remainingTimeInMinutes < 0)
//
// else
//
//
// ,
]);
}
}

@ -0,0 +1,49 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_details_card.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_footer.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_timer_card.dart';
import 'package:mohem_flutter_app/ui/screens/event_activity/activity_event_card.dart';
import 'package:mohem_flutter_app/ui/screens/event_activity/activity_footer.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:provider/provider.dart';
class EventActivityScreen extends StatelessWidget {
const EventActivityScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
DashboardProviderModel provider = context.read<DashboardProviderModel>();
return Scaffold(
appBar: AppBarWidget(
context,
title: LocaleKeys.details.tr(),
onHomeTapped: () {
Navigator.pop(context);
},
onBackTapped: () {
Navigator.pop(context);
},
),
body: Column(
children: <Widget>[
ListView(
padding: const EdgeInsets.all(21),
children: <Widget>[
ActivityEventDetailsCard(model: provider),
20.height,
],
).expanded,
1.divider,
ActivityEventFooter(provider: provider),
],
),
);
}
}

@ -37,10 +37,10 @@ class _UnsafeDeviceScreenState extends State<UnsafeDeviceScreen> {
.paddingOnly(left: 20.0, right: 20.0),
48.height,
passwordConstraintsUI("The device is not jailbroken or rooted.", true).paddingOnly(left: 24.0, right: 5.0),
8.height,
passwordConstraintsUI("The app is not installed on external storage.", true).paddingOnly(left: 24.0, right: 5.0),
8.height,
passwordConstraintsUI("Development mode is disabled.", true).paddingOnly(left: 24.0, right: 5.0),
// 8.height,
// passwordConstraintsUI("The app is not installed on external storage.", true).paddingOnly(left: 24.0, right: 5.0),
// 8.height,
// passwordConstraintsUI("Development mode is disabled.", true).paddingOnly(left: 24.0, right: 5.0),
21.height,
DefaultButton(LocaleKeys.ok.tr(), () async {
if (Platform.isAndroid) {

@ -69,46 +69,70 @@ class RequestDetailFragment extends StatelessWidget {
);
}
Widget detailView(List<Fields> fields) {
Widget detailView(List<Fields> fieldsF) {
List<Fields> fields = List.from(fieldsF);
bool isOdd = false;
if (fields.length % 2 != 0) {
isOdd = true;
fields.add(new Fields());
}
return GridView.builder(
itemCount: fields.length,
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
if (fields[index].value == null) {
return ItemDetailViewGridItem(
index,
fields[index].title,
fields[index].multipleValue?.join(", ") ?? "",
isNeedToShowEmptyDivider: (fields.length == index + 1)
? isOdd
? true
: false
: false,
type: fields[index].type,
);
}
return ItemDetailViewGridItem(
index,
fields[index].title,
fields[index].value ?? "",
isNeedToShowEmptyDivider: (fields.length == index + 1)
? isOdd
? true
: false
: false,
type: fields[index].type,
);
},
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: (itemWidth / itemHeight),
),
int descriptionFormatIndex = fields.indexWhere((element) => element.title == "Description Format" || element.title == "Description Format"); // todo add arabic in future
Widget? descriptionFormatView;
if (descriptionFormatIndex >= 0) {
Fields descriptionFormat = fields[descriptionFormatIndex];
fields.removeAt(descriptionFormatIndex);
descriptionFormatView = ItemDetailViewGridItem(
2,
descriptionFormat.title,
descriptionFormat.value == null ? (descriptionFormat.multipleValue?.join(", ") ?? "") : descriptionFormat.value ?? "",
type: descriptionFormat.type,
maxLine: 0,
);
}
return Column(
mainAxisSize: MainAxisSize.min,
children: [
GridView.builder(
itemCount: fields.length,
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
if (fields[index].value == null) {
return ItemDetailViewGridItem(
index,
fields[index].title,
fields[index].multipleValue?.join(", ") ?? "",
isNeedToShowEmptyDivider: (fields.length == index + 1)
? isOdd
? true
: false
: false,
type: fields[index].type,
);
}
return ItemDetailViewGridItem(
index,
fields[index].title,
fields[index].value ?? "",
isNeedToShowEmptyDivider: (fields.length == index + 1)
? isOdd
? true
: false
: false,
type: fields[index].type,
);
},
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: (itemWidth / itemHeight),
),
),
if (descriptionFormatView != null) descriptionFormatView,
],
).objectContainerView();
return ListView.separated(
shrinkWrap: true,

@ -142,7 +142,9 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
if (workListData!.iTEMTYPE == "HRSSA") {
if (workListData!.rEQUESTTYPE == "EIT") {
getEitNotificationBody();
} else if (workListData!.rEQUESTTYPE == "PHONE_NUMBERS") {
} else if (workListData!.rEQUESTTYPE == "CEI") {
getCEINotificationBody();
}else if (workListData!.rEQUESTTYPE == "PHONE_NUMBERS") {
getPhonesNotificationBody();
} else if (workListData!.rEQUESTTYPE == "BASIC_DETAILS") {
getBasicDetNtfBody();
@ -760,6 +762,24 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
}
}
void getCEINotificationBody() async {
try {
if (apiCallCount == 0) Utils.showLoading(context);
apiCallCount++;
getEitCollectionNotificationBodyList!.clear();
getEitCollectionNotificationBodyList = await WorkListApiClient().GetCeiNotificationBody(workListData!.nOTIFICATIONID);
apiCallCount--;
if (apiCallCount == 0) {
Utils.hideLoading(context);
setState(() {});
}
} catch (ex) {
apiCallCount--;
Utils.hideLoading(context);
Utils.handleException(ex, context, null);
}
}
void getEitNotificationBody() async {
try {
if (apiCallCount == 0) Utils.showLoading(context);

@ -0,0 +1,150 @@
library glowy_borderspertino.dart;
import 'dart:math' as math;
import 'package:flutter/cupertino.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
class AnimatedGradientBorder extends StatefulWidget {
const AnimatedGradientBorder(
{Key? key,
required this.child,
required this.gradientColors,
required this.borderRadius,
this.animationTime,
this.borderSize,
this.animationProgress,
this.stretchAlongAxis = false,
this.stretchAxis = Axis.horizontal});
final Widget child;
final double? borderSize;
final List<Color> gradientColors;
final BorderRadiusGeometry borderRadius;
final int? animationTime;
final double? animationProgress;
final bool stretchAlongAxis;
final Axis stretchAxis;
@override
State<StatefulWidget> createState() => AnimatedGradientState();
}
class AnimatedGradientState extends State<AnimatedGradientBorder> with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation _angleAnimation;
@override
void initState() {
super.initState();
_controller = AnimationController(vsync: this, duration: Duration(seconds: widget.animationTime ?? 2));
_controller.addListener(() => setState(() {}));
_angleAnimation = Tween<double>(begin: 0.1, end: 2 * math.pi).animate(_controller);
if (widget.animationProgress != null) {
_controller.forward();
} else {
_controller.repeat();
}
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
void didUpdateWidget(covariant AnimatedGradientBorder oldWidget) {
super.didUpdateWidget(oldWidget);
double? animateTo = widget.animationProgress;
if (animateTo != null) {
_controller.animateTo(animateTo);
} else {
_controller.repeat();
}
}
@override
Widget build(BuildContext context) {
double? negativeMargin = -1.0 * (widget.borderSize ?? 0);
return Container(
padding: EdgeInsets.all(widget.borderSize ?? 0),
clipBehavior: Clip.hardEdge,
decoration: BoxDecoration(
color: MyColors.kWhiteColor,
borderRadius: BorderRadius.circular(10),
boxShadow: [
BoxShadow(
color: const Color(0xff000000).withOpacity(.05),
blurRadius: 26,
offset: const Offset(0, -3),
),
],
),
child: Stack(alignment: Alignment.center, clipBehavior: Clip.none, children: [
Positioned(
top: negativeMargin,
left: negativeMargin,
right: negativeMargin,
bottom: negativeMargin,
child: AnimatedGradientContainer(
gradientColors: widget.gradientColors,
borderRadius: widget.borderRadius,
gradientAngle: _angleAnimation.value,
)),
widget.child,
// BackdropFilter(
// filter: ImageFilter.blur(sigmaX: widget.glowSize ?? 0, sigmaY: widget.glowSize ?? 0),
// child: Stack(
// alignment: Alignment.center,
// clipBehavior: Clip.none,
// children: [
// Positioned(
// top: negativeMargin,
// right: negativeMargin,
// left: negativeMargin,
// bottom: negativeMargin,
// child: AnimatedGradientContainer(
// gradientColors: widget.gradientColors,
// borderRadius: widget.borderRadius,
// gradientAngle: _angleAnimation.value,
// )),
// if (widget.stretchAlongAxis)
// SizedBox(
// width: widget.stretchAxis == Axis.horizontal ? double.infinity : null,
// height: widget.stretchAxis == Axis.vertical ? double.infinity : null,
// child: widget.child,
// )
// else
// widget.child,
// ],
// ),
// ),
]),
);
}
}
class AnimatedGradientContainer extends StatelessWidget {
const AnimatedGradientContainer({Key? key, required this.gradientColors, required this.gradientAngle, required this.borderRadius});
final List<Color> gradientColors;
final double gradientAngle;
final BorderRadiusGeometry borderRadius;
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
borderRadius: borderRadius,
gradient: SweepGradient(
colors: [...gradientColors, ...gradientColors.reversed], stops: _generateColorStops([...gradientColors, ...gradientColors.reversed]), transform: GradientRotation(gradientAngle))));
}
List<double> _generateColorStops(List<dynamic> colors) {
return colors.asMap().entries.map((entry) {
double percentageStop = entry.key / colors.length;
return percentageStop;
}).toList();
}
}

@ -52,8 +52,9 @@ class ItemDetailViewGridItem extends StatelessWidget {
final String? value;
final String? type;
final bool isNeedToShowEmptyDivider;
final int maxLine;
ItemDetailViewGridItem(this.index, this.title, this.value, {Key? key, this.isNeedToShowEmptyDivider = false, this.type = ""}) : super(key: key);
ItemDetailViewGridItem(this.index, this.title, this.value, {Key? key, this.isNeedToShowEmptyDivider = false, this.type = "", this.maxLine = 6}) : super(key: key);
@override
Widget build(BuildContext context) {
@ -76,10 +77,11 @@ class ItemDetailViewGridItem extends StatelessWidget {
),
),
child: isNeedToShowEmptyDivider
? Container()
? SizedBox()
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
title != null ? Flexible(child: "$title:".toText12Auto(isBold: true, color: const Color(0xff2BB8A6))) : Container(),
4.width,
@ -87,7 +89,7 @@ class ItemDetailViewGridItem extends StatelessWidget {
? type!.toLowerCase() == "table"
? getStringFromJSON(value!)
// : Flexible(child: (value!.isEmpty ? "--" : value).toString().toText12Auto(color: MyColors.normalTextColor, maxLine: 5))
: (value!.isEmpty ? "--" : value).toString().toText12Auto(color: MyColors.normalTextColor, maxLine: 6)
: (value!.isEmpty ? "--" : value).toString().toText12Auto(color: MyColors.normalTextColor, maxLine: maxLine)
: Container(),
],
),

@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
#version: 3.3.01+300040
version: 3.7.96+1
version: 3.7.94+1
environment:
sdk: ">=2.16.0 <3.0.0"

Loading…
Cancel
Save