Merge branch 'master' into fatima

merge-requests/10/head
Fatimah Alshammari 3 years ago
commit 53dabdd853

@ -44,7 +44,7 @@ android {
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "hmg.cloudSolutions.mohem" applicationId "com.cloudSolutions.mohemmtest"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 32 targetSdkVersion 32
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()

@ -10,7 +10,7 @@
"client_info": { "client_info": {
"mobilesdk_app_id": "1:679409052782:android:dba155ac0859d7fea78a7f", "mobilesdk_app_id": "1:679409052782:android:dba155ac0859d7fea78a7f",
"android_client_info": { "android_client_info": {
"package_name": "hmg.cloudSolutions.mohem" "package_name": "com.cloudSolutions.mohemmtest"
} }
}, },
"oauth_client": [ "oauth_client": [

@ -1,7 +1,7 @@
{ {
"mohemm": "Mohemm", "mohemm": "Mohemm",
"english": "English", "english": "English",
"arabic": "Arabic", "arabic": "عربي",
"login": "تسجيل الدخول", "login": "تسجيل الدخول",
"pleaseEnterLoginDetails": "الرجاء إدخال التفاصيل أدناه لتسجيل الدخول", "pleaseEnterLoginDetails": "الرجاء إدخال التفاصيل أدناه لتسجيل الدخول",
"username": "اسم المستخدم", "username": "اسم المستخدم",

@ -1,7 +1,7 @@
{ {
"mohemm": "Mohemm", "mohemm": "Mohemm",
"english": "English", "english": "English",
"arabic": "Arabic", "arabic": "عربي",
"login": "Login", "login": "Login",
"pleaseEnterLoginDetails": "Please enter the detail below to login", "pleaseEnterLoginDetails": "Please enter the detail below to login",
"username": "Username", "username": "Username",

@ -91,7 +91,7 @@ class LoginApiClient {
AppState().postParamsObject?.pSelectedEmployeeNumber = AppState().getUserName; AppState().postParamsObject?.pSelectedEmployeeNumber = AppState().getUserName;
AppState().postParamsObject?.setPLegislationCode = responseData.basicMemberInformation!.pLEGISLATIONCODE; AppState().postParamsObject?.setPLegislationCode = responseData.basicMemberInformation!.pLEGISLATIONCODE;
AppState().postParamsObject?.setPayrollCodeStr = responseData.memberInformationList!.first.pAYROLLCODE; AppState().postParamsObject?.setPayrollCodeStr = responseData.memberInformationList!.first.pAYROLLCODE;
AppState().setBusinessCardPrivilege = responseData.businessCardPrivilege ?? false;
return responseData; return responseData;
}, url, postParams); }, url, postParams);
} }

@ -37,7 +37,7 @@ class MyAttendanceApiClient {
}, url, postParams); }, url, postParams);
} }
Future<ESERVICESVS> getValueSetValues(String pSegmentName, String pDescFlexContextCode, String pDescFlexName, List<Map<String, dynamic>> list) async { Future<List<ESERVICESVS>> getValueSetValues(String pSegmentName, String pDescFlexContextCode, String pDescFlexName, List<Map<String, dynamic>> list) async {
String url = "${ApiConsts.erpRest}GET_VALUE_SET_VALUES"; String url = "${ApiConsts.erpRest}GET_VALUE_SET_VALUES";
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {
"P_SELECTED_RESP_ID": -999, "P_SELECTED_RESP_ID": -999,
@ -53,7 +53,7 @@ class MyAttendanceApiClient {
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json); GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData.getValueSetValuesList!.first; return responseData.getValueSetValuesList ?? [];
}, url, postParams); }, url, postParams);
} }

@ -1,5 +1,3 @@
import 'package:mohem_flutter_app/api/api_client.dart'; import 'package:mohem_flutter_app/api/api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.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/consts.dart';
@ -19,7 +17,6 @@ class MyTeamApiClient {
factory MyTeamApiClient() => _instance; factory MyTeamApiClient() => _instance;
Future<List<GetEmployeeSubordinatesList>> getEmployeeSubordinates(String searchEmpEmail, String searchEmpName, String searchEmpNo) async { Future<List<GetEmployeeSubordinatesList>> getEmployeeSubordinates(String searchEmpEmail, String searchEmpName, String searchEmpNo) async {
String url = "${ApiConsts.erpRest}GET_EMPLOYEE_SUBORDINATES"; String url = "${ApiConsts.erpRest}GET_EMPLOYEE_SUBORDINATES";
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {
@ -72,7 +69,6 @@ class MyTeamApiClient {
}, url, postParams); }, url, postParams);
} }
Future<GetAttendanceTracking?> getAttendanceTracking(String? empID) async { Future<GetAttendanceTracking?> getAttendanceTracking(String? empID) async {
String url = "${ApiConsts.erpRest}GET_Attendance_Tracking"; String url = "${ApiConsts.erpRest}GET_Attendance_Tracking";
Map<String, dynamic> postParams = {}; Map<String, dynamic> postParams = {};
@ -104,10 +100,7 @@ class MyTeamApiClient {
Future<List<GetMenuEntriesList>> employeeSubordinatesRequest(String? empID) async { Future<List<GetMenuEntriesList>> employeeSubordinatesRequest(String? empID) async {
String url = "${ApiConsts.erpRest}GET_MENU_ENTRIES"; String url = "${ApiConsts.erpRest}GET_MENU_ENTRIES";
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {"P_MENU_TYPE": "M", "P_SELECTED_RESP_ID": -999};
"P_MENU_TYPE": "M",
"P_SELECTED_RESP_ID": -999,
};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
@ -118,8 +111,7 @@ class MyTeamApiClient {
Future<List<GetFavoriteReplacements>?> getFavoriteReplacement() async { Future<List<GetFavoriteReplacements>?> getFavoriteReplacement() async {
String url = "${ApiConsts.erpRest}Mohemm_GetFavoriteReplacements"; String url = "${ApiConsts.erpRest}Mohemm_GetFavoriteReplacements";
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {};
};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json); GenericResponseModel responseData = GenericResponseModel.fromJson(json);
@ -138,7 +130,7 @@ class MyTeamApiClient {
}; };
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {
"Mohemm_ChangeReplacementsInputList": [postParamsObj], "Mohemm_ChangeReplacementsInputList": [postParamsObj],
//postParams["Mohemm_ChangeReplacementsInputList"] = list; //postParams["Mohemm_ChangeReplacementsInputList"] = list;
}; };
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
@ -151,7 +143,7 @@ class MyTeamApiClient {
String url = "${ApiConsts.erpRest}GET_SUBORDINATES_LEAVES_TOTAL_VACATIONS"; String url = "${ApiConsts.erpRest}GET_SUBORDINATES_LEAVES_TOTAL_VACATIONS";
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {
"P_DATE_FROM": dateFrom, "P_DATE_FROM": dateFrom,
"P_DATE_TO": dateTo, "P_DATE_TO": dateTo,
}; };
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
@ -160,4 +152,3 @@ class MyTeamApiClient {
}, url, postParams); }, url, postParams);
} }
} }

@ -296,7 +296,39 @@ class WorkListApiClient {
"RequestType": requestType, "RequestType": requestType,
"TaskID": taskId, "TaskID": taskId,
"ItemID": itemId, "ItemID": itemId,
"EmployeeNumber": "15153", "EmployeeNumber": employeeNumber,
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
ItgFormsModel responseData = ItgFormsModel.fromJson(json);
return responseData.itgRequest;
}, url, postParams);
}
Future<ITGRequest?> rejectITGRequest(String requestType, int taskId, int itemId, String employeeNumber, String comments) async {
String url = "${ApiConsts.cocRest}ITGRejectRequest";
Map<String, dynamic> postParams = {
"RequestType": requestType,
"TaskID": taskId,
"ItemID": itemId,
"EmployeeNumber": employeeNumber,
"Comments": comments,
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
ItgFormsModel responseData = ItgFormsModel.fromJson(json);
return responseData.itgRequest;
}, url, postParams);
}
Future<ITGRequest?> approveITGRequest(String requestType, int taskId, int itemId, String employeeNumber, String comments) async {
String url = "${ApiConsts.cocRest}ITGApproveRequest";
Map<String, dynamic> postParams = {
"RequestType": requestType,
"TaskID": taskId,
"ItemID": itemId,
"EmployeeNumber": employeeNumber,
"Comments": comments,
}; };
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {

@ -25,6 +25,12 @@ class AppState {
bool? get getIsLogged => isLogged; bool? get getIsLogged => isLogged;
bool businessCardPrivilege = false;
set setBusinessCardPrivilege(bool v) => businessCardPrivilege = v;
bool? get getBusinessCardPrivilege => businessCardPrivilege;
String? forgetPasswordTokenID; String? forgetPasswordTokenID;
set setForgetPasswordTokenID(token) => forgetPasswordTokenID = token; set setForgetPasswordTokenID(token) => forgetPasswordTokenID = token;

@ -17,7 +17,7 @@ class CodegenLoader extends AssetLoader{
static const Map<String,dynamic> ar_SA = { static const Map<String,dynamic> ar_SA = {
"mohemm": "Mohemm", "mohemm": "Mohemm",
"english": "English", "english": "English",
"arabic": "Arabic", "arabic": "عربي",
"login": "تسجيل الدخول", "login": "تسجيل الدخول",
"pleaseEnterLoginDetails": "الرجاء إدخال التفاصيل أدناه لتسجيل الدخول", "pleaseEnterLoginDetails": "الرجاء إدخال التفاصيل أدناه لتسجيل الدخول",
"username": "اسم المستخدم", "username": "اسم المستخدم",
@ -469,7 +469,7 @@ class CodegenLoader extends AssetLoader{
static const Map<String,dynamic> en_US = { static const Map<String,dynamic> en_US = {
"mohemm": "Mohemm", "mohemm": "Mohemm",
"english": "English", "english": "English",
"arabic": "Arabic", "arabic": "عربي",
"login": "Login", "login": "Login",
"pleaseEnterLoginDetails": "Please enter the detail below to login", "pleaseEnterLoginDetails": "Please enter the detail below to login",
"username": "Username", "username": "Username",

@ -10,7 +10,7 @@ class GetAccrualBalancesList {
}); });
double? accrualNetEntitlement; double? accrualNetEntitlement;
int? accrualUsedEntitlement; num? accrualUsedEntitlement; //Todo: Add function
dynamic accrualYearlyEntitlement; dynamic accrualYearlyEntitlement;
String? accuralPlanName; String? accuralPlanName;
String? endDate; String? endDate;

@ -44,22 +44,22 @@ class POHeader {
String? cOMMENTS; String? cOMMENTS;
String? cREATIONDATE; String? cREATIONDATE;
String? cURRENCYNAME; String? cURRENCYNAME;
int? cUSTOMDUTY; num? cUSTOMDUTY;
int? dISCOUNTAMOUNT; num? dISCOUNTAMOUNT;
int? gROSSAMOUNT; num? gROSSAMOUNT;
String? lOCCUR; String? lOCCUR;
int? lOCCURTOTPOAMT; num? lOCCURTOTPOAMT;
int? oTHERCHARGES; num? oTHERCHARGES;
String? pAYMENTTERMS; String? pAYMENTTERMS;
String? pONUMBER; String? pONUMBER;
String? pREPARER; String? pREPARER;
String? qUOTATIONDATE; String? qUOTATIONDATE;
String? qUOTATIONNUMBER; String? qUOTATIONNUMBER;
int? sALESTAX; num? sALESTAX;
int? sHIPHANDLE; num? sHIPHANDLE;
String? sHIPTOLOCATIONNAME; String? sHIPTOLOCATIONNAME;
int? tOTALPODISCOUNT; num? tOTALPODISCOUNT;
int? tOTPOAMT; num? tOTPOAMT;
String? tOTPOAMTWORD; String? tOTPOAMTWORD;
String? vENDORNAME; String? vENDORNAME;
String? vENDORSITECODE; String? vENDORSITECODE;

@ -4,7 +4,7 @@ import 'package:mohem_flutter_app/models/itg_forms_models/wf_history_model.dart'
class ITGRequest { class ITGRequest {
List<AllowedActions>? allowedActions; List<AllowedActions>? allowedActions;
Null? attachments; List<dynamic>? attachments;
List<FieldGoups>? fieldGoups; List<FieldGoups>? fieldGoups;
Null? grantFields; Null? grantFields;
List<WFHistory>? wFHistory; List<WFHistory>? wFHistory;

@ -1,10 +1,10 @@
class GetDeductionsList { class GetDeductionsList {
int? aMOUNT; num? aMOUNT;
String? eLEMENTNAME; String? eLEMENTNAME;
int? fROMROWNUM; num? fROMROWNUM;
int? nOOFROWS; num? nOOFROWS;
int? rOWNUM; num? rOWNUM;
int? tOROWNUM; num? tOROWNUM;
GetDeductionsList( GetDeductionsList(
{this.aMOUNT, {this.aMOUNT,

@ -1,10 +1,10 @@
class GetEarningsList { class GetEarningsList {
int? aMOUNT; num? aMOUNT;
String? eLEMENTNAME; String? eLEMENTNAME;
int? fROMROWNUM; num? fROMROWNUM;
int? nOOFROWS; num? nOOFROWS;
int? rOWNUM; num? rOWNUM;
int? tOROWNUM; num? tOROWNUM;
GetEarningsList( GetEarningsList(
{this.aMOUNT, {this.aMOUNT,

@ -1,10 +1,10 @@
class GetSummaryOfPaymentList { class GetSummaryOfPaymentList {
int? tOTALDEDUCTIONSAMOUNT; num? tOTALDEDUCTIONSAMOUNT;
int? tOTALDEDUCTIONSPERCENTAGE; num? tOTALDEDUCTIONSPERCENTAGE;
int? tOTALEARNINGSAMOUNT; num? tOTALEARNINGSAMOUNT;
int? tOTALEARNINGSPERCENTAGE; num? tOTALEARNINGSPERCENTAGE;
int? tOTALPAYAMOUNT; num? tOTALPAYAMOUNT;
int? tOTALPAYPERCENTAGE; num? tOTALPAYPERCENTAGE;
GetSummaryOfPaymentList( GetSummaryOfPaymentList(
{this.tOTALDEDUCTIONSAMOUNT, {this.tOTALDEDUCTIONSAMOUNT,

@ -72,6 +72,33 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
return true; return true;
} }
void initProvider() {
isAttendanceTrackingLoading = true;
endTime = 0;
isTimeRemainingInSeconds = 0;
progress = 0.0;
attendanceTracking = null;
isWorkListLoading = true;
workListCounter = 0;
isMissingSwipeLoading = true;
missingSwipeCounter = 0;
isLeaveTicketBalanceLoading = true;
accrualList = null;
leaveBalanceAccrual = null;
ticketBalance = 0;
isServicesMenusLoading = true;
homeMenus = null;
getMenuEntriesList = null;
isOffersLoading = true;
getOffersList = [];
notifyListeners();
}
int calculateSeconds(String time) { int calculateSeconds(String time) {
int hour = int.parse(time.split(":")[0]); int hour = int.parse(time.split(":")[0]);
int mints = int.parse(time.split(":")[1]); int mints = int.parse(time.split(":")[1]);
@ -81,12 +108,6 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
void update(context) { void update(context) {
fetchAttendanceTracking(context); fetchAttendanceTracking(context);
// isAttendanceTrackingLoading = !isAttendanceTrackingLoading;
// isWorkListLoading = !isWorkListLoading;
// attendanceTracking?.pSwipeIn = "a";
// isTimeRemainingInSeconds = calculateSeconds("00:10:30");
// endTime = DateTime.now().millisecondsSinceEpoch + Duration(seconds: isTimeRemainingInSeconds).inMilliseconds;
// notifyListeners();
} }
ItgFormsModel? itgFormsModel; ItgFormsModel? itgFormsModel;

@ -23,6 +23,7 @@ import 'package:mohem_flutter_app/widgets/mark_attendance_widget.dart';
import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart'; import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart';
import 'package:mohem_flutter_app/widgets/shimmer/offers_shimmer_widget.dart'; import 'package:mohem_flutter_app/widgets/shimmer/offers_shimmer_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
class DashboardScreen extends StatefulWidget { class DashboardScreen extends StatefulWidget {
DashboardScreen({Key? key}) : super(key: key); DashboardScreen({Key? key}) : super(key: key);
@ -37,12 +38,24 @@ class _DashboardScreenState extends State<DashboardScreen> {
late DashboardProviderModel data; late DashboardProviderModel data;
final GlobalKey<ScaffoldState> _scaffoldState = GlobalKey(); final GlobalKey<ScaffoldState> _scaffoldState = GlobalKey();
final RefreshController _refreshController = RefreshController(initialRefresh: false);
int currentIndex = 0; int currentIndex = 0;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
data = Provider.of<DashboardProviderModel>(context, listen: false); data = Provider.of<DashboardProviderModel>(context, listen: false);
_onRefresh();
}
@override
void dispose() {
super.dispose();
}
void _onRefresh() async {
data.initProvider();
data.fetchListMenu(); data.fetchListMenu();
data.fetchAttendanceTracking(context); data.fetchAttendanceTracking(context);
data.fetchWorkListCounter(context); data.fetchWorkListCounter(context);
@ -50,11 +63,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
data.fetchLeaveTicketBalance(context, DateTime.now()); data.fetchLeaveTicketBalance(context, DateTime.now());
data.fetchMenuEntries(); data.fetchMenuEntries();
data.getCategoryOffersListAPI(context); data.getCategoryOffersListAPI(context);
} _refreshController.refreshCompleted();
@override
void dispose() {
super.dispose();
} }
@override @override
@ -122,236 +131,243 @@ class _DashboardScreenState extends State<DashboardScreen> {
], ],
).paddingOnly(left: 21, right: 21, top: 48, bottom: 7), ).paddingOnly(left: 21, right: 21, top: 48, bottom: 7),
Expanded( Expanded(
child: SingleChildScrollView( child: SmartRefresher(
child: Column( enablePullDown: true,
children: [ enablePullUp: false,
Column( header: const MaterialClassicHeader(color: MyColors.gradiantEndColor,),
crossAxisAlignment: CrossAxisAlignment.start, controller: _refreshController,
children: [ onRefresh: _onRefresh,
LocaleKeys.goodMorning.tr().toText14(color: MyColors.grey77Color), child: SingleChildScrollView(
(AppState().memberInformationList!.eMPLOYEENAME ?? "").toText24(isBold: true), child: Column(
16.height, children: [
Row( Column(
children: [ crossAxisAlignment: CrossAxisAlignment.start,
Expanded( children: [
child: AspectRatio( LocaleKeys.goodMorning.tr().toText14(color: MyColors.grey77Color),
aspectRatio: 159 / 159, (AppState().memberInformationList!.eMPLOYEENAME ?? "").toText24(isBold: true),
child: Consumer<DashboardProviderModel>( 16.height,
builder: (context, model, child) { Row(
return (model.isAttendanceTrackingLoading children: [
? GetAttendanceTrackingShimmer() Expanded(
: Container( child: AspectRatio(
decoration: BoxDecoration( aspectRatio: 159 / 159,
borderRadius: BorderRadius.circular(15), child: Consumer<DashboardProviderModel>(
gradient: const LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [ builder: (context, model, child) {
MyColors.gradiantEndColor, return (model.isAttendanceTrackingLoading
MyColors.gradiantStartColor, ? GetAttendanceTrackingShimmer()
]), : Container(
), decoration: BoxDecoration(
child: Stack( borderRadius: BorderRadius.circular(15),
alignment: Alignment.center, gradient: const LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [
children: [ MyColors.gradiantEndColor,
if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"), MyColors.gradiantStartColor,
Column( ]),
crossAxisAlignment: CrossAxisAlignment.start, ),
children: [ child: Stack(
Expanded( alignment: Alignment.center,
child: Column( children: [
mainAxisSize: MainAxisSize.min, if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"),
crossAxisAlignment: CrossAxisAlignment.start, Column(
children: [ crossAxisAlignment: CrossAxisAlignment.start,
LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true), children: [
if (model.isTimeRemainingInSeconds == 0) "01-02-2022".toText12(color: Colors.white), Expanded(
if (model.isTimeRemainingInSeconds != 0) child: Column(
Column( mainAxisSize: MainAxisSize.min,
mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, children: [
children: [ LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true),
9.height, if (model.isTimeRemainingInSeconds == 0) "01-02-2022".toText12(color: Colors.white),
CountdownTimer( if (model.isTimeRemainingInSeconds != 0)
endTime: model.endTime, Column(
onEnd: null, mainAxisSize: MainAxisSize.min,
endWidget: "00:00:00".toText14(color: Colors.white, isBold: true), crossAxisAlignment: CrossAxisAlignment.start,
textStyle: TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold),
),
LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white),
9.height,
ClipRRect(
borderRadius: BorderRadius.all(
Radius.circular(20),
),
child: LinearProgressIndicator(
value: model.progress,
minHeight: 8,
valueColor: const AlwaysStoppedAnimation<Color>(Colors.white),
backgroundColor: const Color(0xff196D73),
),
),
],
),
],
).paddingOnly(top: 12, right: 15, left: 12),
),
Row(
children: [ children: [
Expanded( 9.height,
child: Column( CountdownTimer(
mainAxisSize: MainAxisSize.min, endTime: model.endTime,
crossAxisAlignment: CrossAxisAlignment.start, onEnd: null,
children: [ endWidget: "00:00:00".toText14(color: Colors.white, isBold: true),
LocaleKeys.checkIn.tr().toText12(color: Colors.white), textStyle: TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold),
(model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn)
.toString()
.toText14(color: Colors.white, isBold: true),
4.height,
],
).paddingOnly(left: 12),
), ),
Container( LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white),
width: 45, 9.height,
height: 45, ClipRRect(
padding: const EdgeInsets.only(left: 14, right: 14), borderRadius: BorderRadius.all(
decoration: const BoxDecoration( Radius.circular(20),
color: Color(0xff259EA4),
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(15),
),
), ),
child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/play.svg" : "assets/images/stop.svg"), child: LinearProgressIndicator(
).onPress(() { value: model.progress,
showMyBottomSheet(context, child: MarkAttendanceWidget(model)); minHeight: 8,
}), valueColor: const AlwaysStoppedAnimation<Color>(Colors.white),
backgroundColor: const Color(0xff196D73),
),
),
], ],
), ),
], ],
).paddingOnly(top: 12, right: 15, left: 12),
),
Row(
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LocaleKeys.checkIn.tr().toText12(color: Colors.white),
(model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn)
.toString()
.toText14(color: Colors.white, isBold: true),
4.height,
],
).paddingOnly(left: 12),
), ),
Container(
width: 45,
height: 45,
padding: const EdgeInsets.only(left: 14, right: 14),
decoration: const BoxDecoration(
color: Color(0xff259EA4),
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(15),
),
),
child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/play.svg" : "assets/images/stop.svg"),
).onPress(() {
showMyBottomSheet(context, child: MarkAttendanceWidget(model));
}),
], ],
), ),
).onPress( ],
() { ),
Navigator.pushNamed(context, AppRoutes.todayAttendance); ],
}, ),
)) ).onPress(
.animatedSwither(); () {
}, Navigator.pushNamed(context, AppRoutes.todayAttendance);
},
))
.animatedSwither();
},
),
), ),
), ),
), 9.width,
9.width,
Expanded(
child: MenusWidget(),
),
],
),
],
).paddingOnly(left: 21, right: 21, top: 7),
ServicesWidget(),
// 8.height,
Container(
width: double.infinity,
padding: const EdgeInsets.only(top: 31),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: const BorderRadius.only(topRight: Radius.circular(50), topLeft: Radius.circular(50)),
border: Border.all(color: MyColors.lightGreyEDColor, width: 1),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded( Expanded(
child: Column( child: MenusWidget(),
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: (context, model, child) { ).paddingOnly(left: 21, right: 21, top: 7),
return SizedBox( ServicesWidget(),
height: 103 + 33, // 8.height,
child: ListView.separated( Container(
shrinkWrap: true, width: double.infinity,
physics: const BouncingScrollPhysics(), padding: const EdgeInsets.only(top: 31),
padding: const EdgeInsets.only(left: 21, right: 21, top: 13), decoration: BoxDecoration(
scrollDirection: Axis.horizontal, color: Colors.white,
itemBuilder: (cxt, index) { borderRadius: const BorderRadius.only(topRight: Radius.circular(50), topLeft: Radius.circular(50)),
return model.isOffersLoading border: Border.all(color: MyColors.lightGreyEDColor, width: 1),
? const OffersShimmerWidget() ),
: InkWell( child: Column(
onTap: () { mainAxisSize: MainAxisSize.min,
navigateToDetails(data.getOffersList[index]); children: [
}, Row(
child: SizedBox( crossAxisAlignment: CrossAxisAlignment.center,
width: 73, children: [
child: Column( Expanded(
crossAxisAlignment: CrossAxisAlignment.center, child: Column(
children: [ crossAxisAlignment: CrossAxisAlignment.start,
Container( mainAxisSize: MainAxisSize.min,
width: 73, children: [
height: 73, LocaleKeys.offers.tr().toText12(),
decoration: BoxDecoration( Row(
borderRadius: const BorderRadius.all( children: [
Radius.circular(100), LocaleKeys.discounts.tr().toText24(isBold: true),
), 6.width,
border: Border.all(color: MyColors.lightGreyE3Color, width: 1), Container(
), padding: const EdgeInsets.only(left: 8, right: 8),
child: ClipRRect( decoration: BoxDecoration(
borderRadius: const BorderRadius.all( color: MyColors.yellowColor,
Radius.circular(50), borderRadius: BorderRadius.circular(10),
), ),
child: Hero( child: LocaleKeys.newString.tr().toText10(isBold: true)),
tag: "ItemImage" + data.getOffersList[index].rowID!, ],
transitionOnUserGestures: true, ),
child: Image.network( ],
data.getOffersList[index].bannerImage!, ),
fit: BoxFit.contain, ),
), LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true).onPress(() {
), Navigator.pushNamed(context, AppRoutes.offersAndDiscounts);
), })
],
).paddingOnly(left: 21, right: 21),
Consumer<DashboardProviderModel>(
builder: (context, model, 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: (cxt, 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(
borderRadius: const BorderRadius.all(
Radius.circular(100),
), ),
4.height, border: Border.all(color: MyColors.lightGreyE3Color, width: 1),
Expanded( ),
child: AppState().isArabic(context) child: ClipRRect(
? data.getOffersList[index].titleAR!.toText12(isCenter: true, maxLine: 1) borderRadius: const BorderRadius.all(
: data.getOffersList[index].title!.toText12(isCenter: true, maxLine: 1), Radius.circular(50),
), ),
], child: Hero(
tag: "ItemImage" + data.getOffersList[index].rowID!,
transitionOnUserGestures: true,
child: Image.network(
data.getOffersList[index].bannerImage!,
fit: BoxFit.contain,
),
),
),
), ),
), 4.height,
); Expanded(
}, child: AppState().isArabic(context)
separatorBuilder: (cxt, index) => 8.width, ? data.getOffersList[index].titleAR!.toText12(isCenter: true, maxLine: 1)
itemCount: 6), : data.getOffersList[index].title!.toText12(isCenter: true, maxLine: 1),
); ),
}, ],
), ),
], ),
), );
) },
], separatorBuilder: (cxt, index) => 8.width,
itemCount: 6),
);
},
),
],
),
)
],
),
), ),
), ),
) )
@ -424,9 +440,13 @@ class _DashboardScreenState extends State<DashboardScreen> {
selectedIconTheme: const IconThemeData(color: MyColors.grey3AColor, size: 28), selectedIconTheme: const IconThemeData(color: MyColors.grey3AColor, size: 28),
unselectedIconTheme: const IconThemeData(color: MyColors.grey98Color, size: 28), unselectedIconTheme: const IconThemeData(color: MyColors.grey98Color, size: 28),
onTap: (int index) { onTap: (int index) {
// currentIndex = index; if (index == 1) {
// setState(() {}); Navigator.pushNamed(context, AppRoutes.mowadhafhi);
Navigator.pushNamed(context, AppRoutes.itemsForSale); } else if (index == 2) {
Navigator.pushNamed(context, AppRoutes.workList);
} else if (index == 3) {
Navigator.pushNamed(context, AppRoutes.itemsForSale);
}
}, },
), ),
), ),

@ -16,7 +16,6 @@ import 'package:mohem_flutter_app/ui/dialogs/id/business_card_dialog.dart';
import 'package:mohem_flutter_app/ui/dialogs/id/employee_digital_id_dialog.dart'; import 'package:mohem_flutter_app/ui/dialogs/id/employee_digital_id_dialog.dart';
import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart'; import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
class AppDrawer extends StatefulWidget { class AppDrawer extends StatefulWidget {
@override @override
@ -85,7 +84,8 @@ class _AppDrawerState extends State<AppDrawer> {
}); });
}), }),
menuItem("assets/images/drawer/employee_id.svg", LocaleKeys.employeeDigitalID.tr(), "", closeDrawer: false, onPress: () => showMDialog(context, child: EmployeeDigitialIdDialog())), menuItem("assets/images/drawer/employee_id.svg", LocaleKeys.employeeDigitalID.tr(), "", closeDrawer: false, onPress: () => showMDialog(context, child: EmployeeDigitialIdDialog())),
menuItem("assets/images/drawer/view_business_card.svg", LocaleKeys.viewBusinessCard.tr(), "", closeDrawer: false, onPress: () => showMDialog(context, child: BusinessCardDialog())), if (AppState().businessCardPrivilege)
menuItem("assets/images/drawer/view_business_card.svg", LocaleKeys.viewBusinessCard.tr(), "", closeDrawer: false, onPress: () => showMDialog(context, child: BusinessCardDialog())),
menuItem("assets/images/drawer/logout.svg", LocaleKeys.logout.tr(), "", color: MyColors.redA3Color, closeDrawer: false, onPress: performLogout), menuItem("assets/images/drawer/logout.svg", LocaleKeys.logout.tr(), "", color: MyColors.redA3Color, closeDrawer: false, onPress: performLogout),
// menuItem("assets/images/drawer/logout.svg", LocaleKeys.logout.tr(), "", color: MyColors.redA3Color, closeDrawer: false, onPress: () {Navigator.pushNamed(context, AppRoutes.survey,); // menuItem("assets/images/drawer/logout.svg", LocaleKeys.logout.tr(), "", color: MyColors.redA3Color, closeDrawer: false, onPress: () {Navigator.pushNamed(context, AppRoutes.survey,);
], ],
@ -124,7 +124,7 @@ class _AppDrawerState extends State<AppDrawer> {
9.width, 9.width,
title.toText14(color: color).expanded title.toText14(color: color).expanded
], ],
).paddingOnly(left: 21, top: 10, bottom: 10).onPress(closeDrawer ).paddingOnly(left: 21, top: 10, bottom: 10, right: 21).onPress(closeDrawer
? () async { ? () async {
Navigator.pop(context); Navigator.pop(context);
Future.delayed(const Duration(microseconds: 200), onPress); Future.delayed(const Duration(microseconds: 200), onPress);

@ -1,6 +1,7 @@
import 'package:easy_localization/src/public_ext.dart'; import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/string_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/extensions/widget_extensions.dart';
@ -43,7 +44,11 @@ class MenusWidget extends StatelessWidget {
Expanded( Expanded(
child: data.workListCounter.toString().toText16(color: Colors.white, isBold: true, maxlines: 1), child: data.workListCounter.toString().toText16(color: Colors.white, isBold: true, maxlines: 1),
), ),
SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white) RotatedBox(
quarterTurns: AppState().isArabic(context) ? 2:4,
child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)
),
], ],
) )
], ],
@ -70,7 +75,10 @@ class MenusWidget extends StatelessWidget {
Expanded( Expanded(
child: data.missingSwipeCounter.toString().toText16(color: Colors.white, isBold: true, maxlines: 1), child: data.missingSwipeCounter.toString().toText16(color: Colors.white, isBold: true, maxlines: 1),
), ),
SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white) RotatedBox(
quarterTurns: AppState().isArabic(context) ? 2:4,
child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)
),
], ],
) )
], ],
@ -97,7 +105,10 @@ class MenusWidget extends StatelessWidget {
Expanded( Expanded(
child: data.leaveBalance.toString().toText16(color: Colors.white, isBold: true, maxlines: 1), child: data.leaveBalance.toString().toText16(color: Colors.white, isBold: true, maxlines: 1),
), ),
SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white) RotatedBox(
quarterTurns: AppState().isArabic(context) ? 2:4,
child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)
),
], ],
) )
], ],
@ -124,7 +135,10 @@ class MenusWidget extends StatelessWidget {
Expanded( Expanded(
child: data.ticketBalance.toString().toText16(color: Colors.white, isBold: true, maxlines: 1), child: data.ticketBalance.toString().toText16(color: Colors.white, isBold: true, maxlines: 1),
), ),
SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white) RotatedBox(
quarterTurns: AppState().isArabic(context) ? 2:4,
child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)
),
], ],
) )
], ],

@ -1,6 +1,7 @@
import 'package:easy_localization/src/public_ext.dart'; import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.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/string_extensions.dart';
@ -22,10 +23,10 @@ class ServicesWidget extends StatelessWidget {
"assets/images/monthly_attendance.svg", "assets/images/monthly_attendance.svg",
"assets/images/ticket_request.svg", "assets/images/ticket_request.svg",
"assets/images/ticket_request.svg", "assets/images/ticket_request.svg",
"assets/images/dynamic_screens.svg", "assets/images/ticket_request.svg",
"assets/images/dynamic_screens.svg", "assets/images/ticket_request.svg",
"assets/images/dynamic_screens.svg", "assets/images/ticket_request.svg",
"assets/images/dynamic_screens.svg" "assets/images/ticket_request.svg"
]; ];
return Consumer<DashboardProviderModel>( return Consumer<DashboardProviderModel>(
@ -73,9 +74,13 @@ class ServicesWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
Expanded( Expanded(
child: data.homeMenus![parentIndex].menuEntiesList[index].prompt!.toText11(isBold: true), child: data.homeMenus![parentIndex].menuEntiesList[index].prompt!.toText10(isBold: true),
), ),
SvgPicture.asset("assets/images/arrow_next.svg").paddingOnly(bottom: 4) RotatedBox(
quarterTurns: AppState().isArabic(context) ? 2:4,
child: SvgPicture.asset("assets/images/arrow_next.svg").paddingOnly(bottom: 4)
),
], ],
) )
], ],

@ -113,7 +113,7 @@ class _LoginScreenState extends State<LoginScreen> {
} }
Utils.hideLoading(context); Utils.hideLoading(context);
if (_autoLogin) { if (_autoLogin) {
Navigator.pushNamed(context, AppRoutes.verifyLastLogin, arguments: loginInfo); Navigator.pushReplacementNamed(context, AppRoutes.verifyLastLogin, arguments: loginInfo);
} else { } else {
Navigator.pushNamed(context, AppRoutes.verifyLogin, arguments: "$firebaseToken"); Navigator.pushNamed(context, AppRoutes.verifyLogin, arguments: "$firebaseToken");
} }

@ -20,6 +20,7 @@ import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/basic_member_information_model.dart'; import 'package:mohem_flutter_app/models/basic_member_information_model.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart'; import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart';
import 'package:mohem_flutter_app/ui/dialogs/id/business_card_dialog.dart';
import 'package:mohem_flutter_app/ui/dialogs/id/employee_digital_id_dialog.dart'; import 'package:mohem_flutter_app/ui/dialogs/id/employee_digital_id_dialog.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart'; import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart';
@ -58,15 +59,23 @@ class _VerifyLastLoginScreenState extends State<VerifyLastLoginScreen> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
mobileLoginInfoListModel ??= ModalRoute.of(context)!.settings.arguments as GetMobileLoginInfoListModel; mobileLoginInfoListModel ??= ModalRoute.of(context)!.settings.arguments as GetMobileLoginInfoListModel;
String empName = AppState().isArabic(context) ? AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr! : AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn!; String empName = AppState().isArabic(context) ? AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr! : AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn!;
print("selectedFlag1: " + mobileLoginInfoListModel!.loginType.toString());
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
// leading: IconButton( automaticallyImplyLeading: false,
// icon: const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor), title: (mobileLoginInfoListModel?.businessCardPrivilege ?? false)
// onPressed: () => Navigator.pop(context), ? LocaleKeys.viewBusinessCard.tr().toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {
// ), showMDialog(context, child: BusinessCardDialog());
actions: [Center(child: "Employee Digital ID".toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {showMDialog(context, child: EmployeeDigitialIdDialog());})), 21.width], })
: null,
actions: [
Center(
child: LocaleKeys.employeeDigitalID.tr().toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {
showMDialog(context, child: EmployeeDigitialIdDialog());
})),
21.width
],
), ),
body: Column( body: Column(
children: [ children: [
@ -224,7 +233,6 @@ class _VerifyLastLoginScreenState extends State<VerifyLastLoginScreen> {
Widget _loginOptionButton(String _title, String _icon, int _flag, int? _loginIndex) { Widget _loginOptionButton(String _title, String _icon, int _flag, int? _loginIndex) {
bool isDisable = ((_flag == 3 && !checkBiometricIsAvailable(BiometricType.face)) || (_flag == 4 && !checkBiometricIsAvailable(BiometricType.fingerprint))); bool isDisable = ((_flag == 3 && !checkBiometricIsAvailable(BiometricType.face)) || (_flag == 4 && !checkBiometricIsAvailable(BiometricType.fingerprint)));
print("$_title:$isDisable");
return InkWell( return InkWell(
onTap: isDisable onTap: isDisable
? null ? null

@ -67,7 +67,7 @@ class _RequestSubmitScreenState extends State<RequestSubmitScreen> {
} }
void submitRequest() async { void submitRequest() async {
try { // try {
Utils.showLoading(context); Utils.showLoading(context);
List<Map<String, dynamic>> list = []; List<Map<String, dynamic>> list = [];
if (attachmentFiles.isNotEmpty) { if (attachmentFiles.isNotEmpty) {
@ -134,10 +134,10 @@ class _RequestSubmitScreenState extends State<RequestSubmitScreen> {
Utils.showToast(LocaleKeys.yourRequestHasBeenSubmittedForApprovals.tr(), longDuration: true); Utils.showToast(LocaleKeys.yourRequestHasBeenSubmittedForApprovals.tr(), longDuration: true);
Navigator.of(context).popUntil((route) => route.settings.name == AppRoutes.dashboard); Navigator.of(context).popUntil((route) => route.settings.name == AppRoutes.dashboard);
Navigator.pushNamed(context, AppRoutes.workList); Navigator.pushNamed(context, AppRoutes.workList);
} catch (ex) { // } catch (ex) {
Utils.hideLoading(context); // Utils.hideLoading(context);
Utils.handleException(ex, context, null); // Utils.handleException(ex, context, null);
} // }
} }
@override @override

@ -104,26 +104,26 @@ class _DynamicInputScreenState extends State<DynamicInputScreen> {
Future calGetValueSetValues(GetEITDFFStructureList structureList) async { Future calGetValueSetValues(GetEITDFFStructureList structureList) async {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
String segmentId = structureList.cHILDSEGMENTSVS!; String segmentId = structureList.cHILDSEGMENTSVS!;
if (dESCFLEXCONTEXTCODE.isEmpty) dESCFLEXCONTEXTCODE = structureList.dESCFLEXCONTEXTCODE!; if (dESCFLEXCONTEXTCODE.isEmpty) dESCFLEXCONTEXTCODE = structureList.dESCFLEXCONTEXTCODE!;
List<GetEITDFFStructureList> filteredList = getEitDffStructureList?.where((element) => element.cHILDSEGMENTSVS == segmentId).toList() ?? []; List<GetEITDFFStructureList> filteredList = getEitDffStructureList?.where((element) => element.cHILDSEGMENTSVS == segmentId).toList() ?? [];
List<Map<String, dynamic>> values = filteredList List<Map<String, dynamic>> values = filteredList
.map((e) => GetSetValuesRequestModel( .map((e) => GetSetValuesRequestModel(
sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME)
.toJson()) .toJson())
.toList(); .toList();
ESERVICESVS eServicesResponseModel = await MyAttendanceApiClient().getValueSetValues(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); List<ESERVICESVS> eServicesResponseModel = await MyAttendanceApiClient().getValueSetValues(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values);
List<GetEITDFFStructureList> abc = genericResponseModel?.getEITDFFStructureList ?? []; List<GetEITDFFStructureList> abc = genericResponseModel?.getEITDFFStructureList ?? [];
getEitDffStructureList = abc; getEitDffStructureList = abc;
int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS); int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS);
getEitDffStructureList![index].eSERVICESVS!.clear(); getEitDffStructureList![index].eSERVICESVS!.clear();
getEitDffStructureList![index].eSERVICESVS!.add(eServicesResponseModel); if (eServicesResponseModel.isNotEmpty) getEitDffStructureList![index].eSERVICESVS!.addAll(eServicesResponseModel);
// getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? []; // getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? [];
//getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList();
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { } catch (ex) {
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.handleException(ex, context, null); Utils.handleException(ex, context, null);

@ -60,45 +60,51 @@ class _DynamicListViewScreenState extends State<DynamicListViewScreen> {
super.dispose(); super.dispose();
} }
late bool isTicketRequest;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (dynamicParams == null) { if (dynamicParams == null) {
dynamicParams = ModalRoute.of(context)!.settings.arguments as DynamicListViewParams; dynamicParams = ModalRoute.of(context)!.settings.arguments as DynamicListViewParams;
isTicketRequest = dynamicParams!.dynamicId == "HMG_TKT_NEW_EIT_SS";
getTransactions(); getTransactions();
} }
Widget dataWidget = ListView(
physics: const BouncingScrollPhysics(),
shrinkWrap: true,
padding: const EdgeInsets.all(21),
children: [
// HMG_TKT_NEW_EIT_SS Id used for ticket balance dashboard
if (isTicketRequest) ...[const BalancesDashboardWidget("Current Ticket Balance", false), 12.height],
getEITTransactionList == null
? const SizedBox()
: (getEITTransactionList!.isEmpty
? Utils.getNoDataWidget(context).paddingOnly(top: isTicketRequest ? 50 : 0)
: ListView.separated(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (cxt, int parentIndex) => getEITTransactionList![parentIndex].collectionTransaction!.isEmpty
? const SizedBox()
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
for (int t = 0; t < (getEITTransactionList![parentIndex].collectionTransaction ?? []).length; t++)
if (getEITTransactionList![parentIndex].collectionTransaction![t].dISPLAYFLAG == "Y")
ItemDetailView(getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTPROMPT!,
getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTVALUEDSP ?? ""),
],
).objectContainerView(),
separatorBuilder: (cxt, index) => 12.height,
itemCount: getEITTransactionList!.length)),
],
);
return Scaffold( return Scaffold(
backgroundColor: Colors.white, backgroundColor: Colors.white,
appBar: AppBarWidget(context, title: dynamicParams!.title), appBar: AppBarWidget(context, title: dynamicParams!.title),
body: ListView( body: isTicketRequest ? dataWidget : dataWidget.center,
physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.all(21),
children: [
// HMG_TKT_NEW_EIT_SS Id used for ticket balance dashboard
if (dynamicParams!.dynamicId == "HMG_TKT_NEW_EIT_SS") ...[const BalancesDashboardWidget("Current Ticket Balance", false), 12.height],
getEITTransactionList == null
? const SizedBox()
: (getEITTransactionList!.isEmpty
? Utils.getNoDataWidget(context)
: ListView.separated(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (cxt, int parentIndex) => getEITTransactionList![parentIndex].collectionTransaction!.isEmpty
? const SizedBox()
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
for (int t = 0; t < (getEITTransactionList![parentIndex].collectionTransaction ?? []).length; t++)
if (getEITTransactionList![parentIndex].collectionTransaction![t].dISPLAYFLAG == "Y")
ItemDetailView(getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTPROMPT!,
getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTVALUEDSP ?? ""),
],
).objectContainerView(),
separatorBuilder: (cxt, index) => 12.height,
itemCount: getEITTransactionList!.length)),
],
),
floatingActionButton: Container( floatingActionButton: Container(
height: 54, height: 54,
width: 54, width: 54,

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.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/colors.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
@ -39,7 +40,7 @@ class ServicesMenuListScreen extends StatelessWidget {
? Utils.getNoDataWidget(context) ? Utils.getNoDataWidget(context)
: ListView.separated( : ListView.separated(
padding: const EdgeInsets.all(21), padding: const EdgeInsets.all(21),
itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", servicesMenuData.list[index].prompt!).onPress(() { itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", servicesMenuData.list[index].prompt!, context).onPress(() {
if (servicesMenuData.list[index].parentMenuName == "MBL_PERINFO_SS") { if (servicesMenuData.list[index].parentMenuName == "MBL_PERINFO_SS") {
if (servicesMenuData.list[index].requestType == "BASIC_DETAILS") { if (servicesMenuData.list[index].requestType == "BASIC_DETAILS") {
Navigator.pushNamed(context, AppRoutes.basicDetails); Navigator.pushNamed(context, AppRoutes.basicDetails);
@ -51,8 +52,10 @@ class ServicesMenuListScreen extends StatelessWidget {
Navigator.pushNamed(context, AppRoutes.familyMembers); Navigator.pushNamed(context, AppRoutes.familyMembers);
} }
return; return;
} else if (servicesMenuData.list[index].requestType == "ABSENCE") {
Navigator.pushNamed(context, AppRoutes.leaveBalance);
return;
} }
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(servicesMenuData.list[index].prompt!, servicesMenuData.list[index].functionName!)); Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(servicesMenuData.list[index].prompt!, servicesMenuData.list[index].functionName!));
}), }),
separatorBuilder: (cxt, index) => 12.height, separatorBuilder: (cxt, index) => 12.height,
@ -61,15 +64,15 @@ class ServicesMenuListScreen extends StatelessWidget {
); );
} }
Widget itemView(String icon, String title) { Widget itemView(String icon, String title, context) {
return Row( return Row(
children: [ children: [
(title).toText16().expanded, (title).toText16().expanded,
12.width, 12.width,
SvgPicture.asset( RotatedBox(
"assets/images/arrow_next.svg", quarterTurns: AppState().isArabic(context) ? 2 : 4,
color: MyColors.darkIconColor, child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.darkIconColor),
) ),
], ],
).objectContainerView(); ).objectContainerView();
} }

@ -1,5 +1,3 @@
import 'dart:ui';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
@ -12,32 +10,34 @@ import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_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/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/dashboard/menu_entries.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/my_team/get_employee_subordinates_list.dart'; import 'package:mohem_flutter_app/models/my_team/get_employee_subordinates_list.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_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/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
class CreateRequest extends StatefulWidget { class CreateRequest extends StatefulWidget {
const CreateRequest ({Key? key}) : super(key: key); const CreateRequest({Key? key}) : super(key: key);
@override @override
_CreateRequestState createState() => _CreateRequestState(); _CreateRequestState createState() => _CreateRequestState();
} }
class _CreateRequestState extends State<CreateRequest> { class _CreateRequestState extends State<CreateRequest> {
String searchEmpEmail =""; String searchEmpEmail = "";
String searchEmpName =""; String searchEmpName = "";
String searchEmpNo = ""; String searchEmpNo = "";
String? empId; String? empId;
List<GetEmployeeSubordinatesList> getEmployeeSubordinatesList = []; List<GetEmployeeSubordinatesList> getEmployeeSubordinatesList = [];
// late DashboardProviderModel data; // late DashboardProviderModel data;
List<GetMenuEntriesList> getMenuEntriesList = []; List<GetMenuEntriesList> getMenuEntriesList = [];
GetEmployeeSubordinatesList? getEmployeeSubordinates; GetEmployeeSubordinatesList? getEmployeeSubordinates;
List<Menus>? homeMenus;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
// data.fetchMenuEntries();
employeeSubRequest(); employeeSubRequest();
} }
@ -46,6 +46,7 @@ class _CreateRequestState extends State<CreateRequest> {
Utils.showLoading(context); Utils.showLoading(context);
getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString()); getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString());
getMenuEntriesList = await MyTeamApiClient().employeeSubordinatesRequest(getEmployeeSubordinates?.eMPLOYEENUMBER); getMenuEntriesList = await MyTeamApiClient().employeeSubordinatesRequest(getEmployeeSubordinates?.eMPLOYEENUMBER);
homeMenus = parseMenus(getMenuEntriesList);
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { } catch (ex) {
@ -54,42 +55,65 @@ class _CreateRequestState extends State<CreateRequest> {
} }
} }
List<Menus> parseMenus(List<GetMenuEntriesList> getMenuEntriesList) {
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()));
}
}
return menus;
}
void handleOnPress(context, Menus menu) {
if (menu.menuEntry.menuEntryType == "FUNCTION") {
if (menu.menuEntry.requestType == "EIT") {
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(menu.menuEntry.prompt!, menu.menuEntry.functionName!));
} else {}
} else {
Navigator.pushNamed(context, AppRoutes.servicesMenuListScreen, arguments: ServicesMenuListScreenParams(menu.menuEntry.prompt!, menu.menuEntiesList));
}
return;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList; getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList;
print(getMenuEntriesList.length);
return Scaffold( return Scaffold(
backgroundColor: Colors.white, backgroundColor: Colors.white,
appBar: AppBarWidget( appBar: AppBarWidget(
context, context,
title: LocaleKeys.createRequest.tr(), title: LocaleKeys.createRequest.tr(),
), ),
body: SizedBox( body: SizedBox(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
child: getMenuEntriesList.isEmpty child: homeMenus == null
? Utils.getNoDataWidget(context) ? const SizedBox()
: ListView.separated( : (homeMenus!.isEmpty
padding: const EdgeInsets.all(21), ? Utils.getNoDataWidget(context)
itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", getMenuEntriesList[index].prompt!, index).onPress(() { : ListView.separated(
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(getMenuEntriesList[index].prompt!, getMenuEntriesList[index].functionName!)); padding: const EdgeInsets.all(21),
}), itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", homeMenus![index].menuEntry.prompt!, index).onPress(() {
separatorBuilder: (cxt, index) => 12.height, handleOnPress(context, homeMenus![index]);
itemCount: getMenuEntriesList.length), }),
), separatorBuilder: (cxt, index) => 12.height,
itemCount: homeMenus!.length)),
),
); );
} }
Widget itemView(String icon, String title, index) { Widget itemView(String icon, String title, index) {
return getMenuEntriesList[index].parentMenuName !=""? Row( return Row(
children: [ children: [
(title).toText16().expanded, 12.width, (title).toText16().expanded,
12.width,
SvgPicture.asset( SvgPicture.asset(
"assets/images/arrow_next.svg", "assets/images/arrow_next.svg",
color: MyColors.darkIconColor, color: MyColors.darkIconColor,
) )
], ],
).objectContainerView() : SizedBox(); ).objectContainerView();
} }
} }

@ -40,7 +40,7 @@ class _MonthlyPaySlipScreenState extends State<MonthlyPaySlipScreen> {
} }
void getData() async { void getData() async {
try { // try {
Utils.showLoading(context); Utils.showLoading(context);
paySlipList = await MonthlyPaySlipApiClient().getPaySlip(); paySlipList = await MonthlyPaySlipApiClient().getPaySlip();
if (paySlipList.isNotEmpty) { if (paySlipList.isNotEmpty) {
@ -49,14 +49,14 @@ class _MonthlyPaySlipScreenState extends State<MonthlyPaySlipScreen> {
} }
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { // } catch (ex) {
Utils.hideLoading(context); // Utils.hideLoading(context);
Utils.handleException(ex, context, null); // Utils.handleException(ex, context, null);
} // }
} }
Future getDataByActionContextID(int actionContextID, {bool showLoading = false}) async { Future getDataByActionContextID(int actionContextID, {bool showLoading = false}) async {
try { // try {
if (showLoading) { if (showLoading) {
Utils.showLoading(context); Utils.showLoading(context);
} }
@ -74,12 +74,12 @@ class _MonthlyPaySlipScreenState extends State<MonthlyPaySlipScreen> {
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} }
} catch (ex) { // } catch (ex) {
if (showLoading) { // if (showLoading) {
Utils.hideLoading(context); // Utils.hideLoading(context);
} // }
Utils.handleException(ex, context, null); // Utils.handleException(ex, context, null);
} // }
} }
@override @override

@ -16,15 +16,10 @@ import 'package:mohem_flutter_app/models/dyanmic_forms/validate_eit_transaction_
import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart';
import 'package:mohem_flutter_app/models/get_employee_address_model.dart'; import 'package:mohem_flutter_app/models/get_employee_address_model.dart';
import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart';
import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart';
import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart';
import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart';
import 'package:mohem_flutter_app/models/profile/get_address_dff_structure_list.dart'; import 'package:mohem_flutter_app/models/profile/get_address_dff_structure_list.dart';
import 'package:mohem_flutter_app/models/profile/get_countries_list_model.dart'; import 'package:mohem_flutter_app/models/profile/get_countries_list_model.dart';
import 'package:mohem_flutter_app/models/profile/submit_address_transaction.dart'; import 'package:mohem_flutter_app/models/profile/submit_address_transaction.dart';
import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart'; import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart';
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
@ -60,6 +55,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreenAddress> {
String dESCFLEXCONTEXTCODE = ""; String dESCFLEXCONTEXTCODE = "";
String countryCode = 'SA'; String countryCode = 'SA';
String effectiveDate = ''; String effectiveDate = '';
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -116,10 +112,10 @@ class _DynamicInputScreenState extends State<DynamicInputScreenAddress> {
sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME)
.toJson()) .toJson())
.toList(); .toList();
ESERVICESVS genericResponseModel = await MyAttendanceApiClient().getValueSetValues(structureList.cHILDSEGMENTSVS!, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); List<ESERVICESVS> genericResponseModel = await MyAttendanceApiClient().getValueSetValues(structureList.cHILDSEGMENTSVS!, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values);
int index = getAddressDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS); int index = getAddressDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS);
getAddressDffStructureList![index].eSERVICESVS!.add(genericResponseModel); if (genericResponseModel.isNotEmpty) getAddressDffStructureList![index].eSERVICESVS!.addAll(genericResponseModel);
// getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? []; // getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? [];
//getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList();
Utils.hideLoading(context); Utils.hideLoading(context);
@ -325,8 +321,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreenAddress> {
), ),
); );
} else { } else {
DateTime? picked = DateTime? picked = await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101));
await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101));
if (picked != null && picked != selectedDate) { if (picked != null && picked != selectedDate) {
time = picked; time = picked;
} }

@ -8,7 +8,6 @@ import 'package:mohem_flutter_app/api/profile_api_client.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.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/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/dyanmic_forms/get_set_values_request_model.dart'; import 'package:mohem_flutter_app/models/dyanmic_forms/get_set_values_request_model.dart';
@ -16,12 +15,10 @@ import 'package:mohem_flutter_app/models/dyanmic_forms/validate_eit_transaction_
import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart';
import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart';
import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart';
import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart';
import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart';
import 'package:mohem_flutter_app/models/profile/submit_basic_details_transaction_model.dart'; import 'package:mohem_flutter_app/models/profile/submit_basic_details_transaction_model.dart';
import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart'; import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart';
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
@ -55,6 +52,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreenProfile> {
DynamicProfileParams? dynamicParams; DynamicProfileParams? dynamicParams;
String dESCFLEXCONTEXTCODE = ""; String dESCFLEXCONTEXTCODE = "";
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -102,12 +100,10 @@ class _DynamicInputScreenState extends State<DynamicInputScreenProfile> {
sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME)
.toJson()) .toJson())
.toList(); .toList();
ESERVICESVS genericResponseModel = await MyAttendanceApiClient().getValueSetValues(structureList.cHILDSEGMENTSVS!, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); List<ESERVICESVS> genericResponseModel = await MyAttendanceApiClient().getValueSetValues(structureList.cHILDSEGMENTSVS!, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values);
int index = getBasicDetDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS); int index = getBasicDetDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS);
getBasicDetDffStructureList![index].eSERVICESVS!.add(genericResponseModel); if (genericResponseModel.isNotEmpty) getBasicDetDffStructureList![index].eSERVICESVS!.addAll(genericResponseModel);
// getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? [];
//getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList();
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { } catch (ex) {
@ -336,8 +332,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreenProfile> {
), ),
); );
} else { } else {
DateTime? picked = DateTime? picked = await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101));
await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101));
if (picked != null && picked != selectedDate) { if (picked != null && picked != selectedDate) {
time = picked; time = picked;
} }

@ -190,9 +190,10 @@ class _AddItemDetailsFragmentState extends State<AddItemDetailsFragment> {
6.width, 6.width,
SimpleButton(LocaleKeys.add.tr(), () { SimpleButton(LocaleKeys.add.tr(), () {
ImageOptions.showImageOptionsNew(context, (String image, File file) { ImageOptions.showImageOptionsNew(context, (String image, File file) {
// setState(() { setState(() {
// images.add(image); images.add(image);
// }); Navigator.of(context).pop();
});
}); });
}, fontSize: 14), }, fontSize: 14),
], ],
@ -243,41 +244,43 @@ class _AddItemDetailsFragmentState extends State<AddItemDetailsFragment> {
Future<void> getAdDetails() async { Future<void> getAdDetails() async {
// todo need to change this method later , its not a good approach to do it like this. // todo need to change this method later , its not a good approach to do it like this.
String details = await Utils.getStringFromPrefs(SharedPrefsConsts.editItemForSale); String details = await Utils.getStringFromPrefs(SharedPrefsConsts.editItemForSale);
var body = json.decode(details); if(details.isNotEmpty) {
var body = json.decode(details);
GetRegionsList selectedRegionAd = GetRegionsList(); GetRegionsList selectedRegionAd = GetRegionsList();
GetSaleCategoriesList selectedSaleCategoryAd = GetSaleCategoriesList(); GetSaleCategoriesList selectedSaleCategoryAd = GetSaleCategoriesList();
itemTitle = body["itemTitle"]; itemTitle = body["itemTitle"];
itemDescription = body["itemDescription"]; itemDescription = body["itemDescription"];
selectedItemCondition = body["itemCondition"].toString().toLowerCase(); selectedItemCondition = body["itemCondition"].toString().toLowerCase();
selectedRegionAd.regionID = body["selectedRegion"]["regionID"]; selectedRegionAd.regionID = body["selectedRegion"]["regionID"];
selectedRegionAd.regionName = body["selectedRegion"]["regionName"]; selectedRegionAd.regionName = body["selectedRegion"]["regionName"];
selectedRegion = selectedRegionAd; selectedRegion = selectedRegionAd;
itemPrice = body["itemPrice"]; itemPrice = body["itemPrice"];
selectedSaleCategoryAd.categoryID = body["selectedSaleCategory"]["categoryID"]; selectedSaleCategoryAd.categoryID = body["selectedSaleCategory"]["categoryID"];
selectedSaleCategoryAd.title = body["selectedSaleCategory"]["title"]; selectedSaleCategoryAd.title = body["selectedSaleCategory"]["title"];
if (body["itemPhotos"].length != 0) { if (body["itemPhotos"].length != 0) {
images.add(body["itemPhotos"][0]); images.add(body["itemPhotos"][0]);
} }
ItemReviewModel itemReviewModel = ItemReviewModel itemReviewModel =
ItemReviewModel(body["itemTitle"], body["itemDescription"], body["itemCondition"].toString().toLowerCase(), selectedRegionAd, body["itemPrice"], images, selectedSaleCategoryAd); ItemReviewModel(body["itemTitle"], body["itemDescription"], body["itemCondition"].toString().toLowerCase(), selectedRegionAd, body["itemPrice"], images, selectedSaleCategoryAd);
AddItemDetailsFragment.itemReviewModel = itemReviewModel; AddItemDetailsFragment.itemReviewModel = itemReviewModel;
SelectCategoryFragment.selectedSaleCategory = selectedSaleCategoryAd; SelectCategoryFragment.selectedSaleCategory = selectedSaleCategoryAd;
}
} }
void getRegions() async { void getRegions() async {
try { // try {
Utils.showLoading(context); Utils.showLoading(context);
getRegionsList = await ItemsForSaleApiClient().getRegions(); getRegionsList = await ItemsForSaleApiClient().getRegions();
await getAdDetails(); await getAdDetails();
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { // } catch (ex) {
Utils.hideLoading(context); // Utils.hideLoading(context);
Utils.handleException(ex, context, null); // Utils.handleException(ex, context, null);
} // }
} }
} }

@ -25,6 +25,7 @@ class _ItemsForSaleFragmentState extends State<ItemsForSaleFragment> {
List<GetSaleCategoriesList> getSaleCategoriesList = []; List<GetSaleCategoriesList> getSaleCategoriesList = [];
List<GetItemsForSaleList> getItemsForSaleList = []; List<GetItemsForSaleList> getItemsForSaleList = [];
List<GetItemsForSaleList> _foundItemsForSaleList = [];
ScrollController gridScrollController = ScrollController(); ScrollController gridScrollController = ScrollController();
int currentPageNo = 1; int currentPageNo = 1;
@ -61,20 +62,10 @@ class _ItemsForSaleFragmentState extends State<ItemsForSaleFragment> {
isInputTypeNum: false, isInputTypeNum: false,
isReadOnly: false, isReadOnly: false,
onChange: (String value) { onChange: (String value) {
// _runFilter(value); _runFilter(value);
}, },
).paddingOnly(left: 21, right: 21, top: 21), ).paddingOnly(left: 21, right: 21, top: 21),
Row( LocaleKeys.browseCategories.tr().toText17().paddingOnly(left: 21, right: 21, top: 21),
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
LocaleKeys.browseCategories.tr().toText17(),
// todo @haroon define the purpose of this icon button
IconButton(
icon: const Icon(Icons.filter_alt_sharp, color: MyColors.darkIconColor, size: 28.0),
onPressed: () => Navigator.pop(context),
),
],
).paddingOnly(left: 21, right: 21),
SizedBox( SizedBox(
height: 105.0, height: 105.0,
child: getSaleCategoriesList.isNotEmpty child: getSaleCategoriesList.isNotEmpty
@ -132,10 +123,22 @@ class _ItemsForSaleFragmentState extends State<ItemsForSaleFragment> {
); );
} }
void _runFilter(String enteredKeyword) {
List<GetItemsForSaleList> results = [];
if (enteredKeyword.isEmpty) {
results = getItemsForSaleList;
} else {
results = getItemsForSaleList.where((offer) => offer.title!.toLowerCase().contains(enteredKeyword.toLowerCase())).toList();
}
setState(() {
_foundItemsForSaleList = results;
});
}
List<Widget> getItemsForSaleWidgets() { List<Widget> getItemsForSaleWidgets() {
List<Widget> itemsList = []; List<Widget> itemsList = [];
getItemsForSaleList.forEach((element) { _foundItemsForSaleList.forEach((element) {
itemsList.add(getItemCard(element)); itemsList.add(getItemCard(element));
}); });
@ -167,7 +170,7 @@ class _ItemsForSaleFragmentState extends State<ItemsForSaleFragment> {
), ),
10.height, 10.height,
getItemsForSaleList.title!.toText16(maxlines: 1), getItemsForSaleList.title!.toText16(maxlines: 1),
getItemsForSaleList.description!.toText12(maxLine: 3, color: MyColors.grey57Color).expanded, getItemsForSaleList.description!.toText12(maxLine: 2, color: MyColors.grey57Color).expanded,
// 8.height, // 8.height,
getItemsForSaleList.status!.toText14(color: getItemsForSaleList.status == 'Approved' ? MyColors.greenColor : MyColors.yellowColor), getItemsForSaleList.status!.toText14(color: getItemsForSaleList.status == 'Approved' ? MyColors.greenColor : MyColors.yellowColor),
Row( Row(
@ -200,6 +203,7 @@ class _ItemsForSaleFragmentState extends State<ItemsForSaleFragment> {
getItemsForSaleListLocal.clear(); getItemsForSaleListLocal.clear();
getItemsForSaleListLocal = await ItemsForSaleApiClient().getItemsForSale(itgPageNo, itgCategoryID); getItemsForSaleListLocal = await ItemsForSaleApiClient().getItemsForSale(itgPageNo, itgCategoryID);
getItemsForSaleList.addAll(getItemsForSaleListLocal); getItemsForSaleList.addAll(getItemsForSaleListLocal);
_foundItemsForSaleList = getItemsForSaleList;
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { } catch (ex) {

@ -2,6 +2,7 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:mohem_flutter_app/api/mowadhafhi/mowadhafhi_api_client.dart'; import 'package:mohem_flutter_app/api/mowadhafhi/mowadhafhi_api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
@ -53,44 +54,44 @@ class _MowadhafhiHomeState extends State<MowadhafhiHome> {
body: Column( body: Column(
children: [ children: [
(getTicketsByEmployeeList == null (getTicketsByEmployeeList == null
? const SizedBox() ? const SizedBox()
: (getTicketsByEmployeeList!.isEmpty) : (getTicketsByEmployeeList!.isEmpty)
? Utils.getNoDataWidget(context) ? Utils.getNoDataWidget(context)
: ListView.separated( : ListView.separated(
physics: const BouncingScrollPhysics(), physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.all(21), padding: const EdgeInsets.all(21),
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return InkWell( return InkWell(
onTap: () { onTap: () {
Navigator.pushNamed(context, AppRoutes.mowadhafhiDetails, arguments: getTicketsByEmployeeList![index].ticketId); Navigator.pushNamed(context, AppRoutes.mowadhafhiDetails, arguments: getTicketsByEmployeeList![index].ticketId);
}, },
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Row( Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
getTicketsByEmployeeList![index].ticketTypeName!.toText14(color: MyColors.darkTextColor).expanded, getTicketsByEmployeeList![index].ticketTypeName!.toText14(color: MyColors.darkTextColor).expanded,
getTicketsByEmployeeList![index].created!.split(" ")[0].toText12(color: MyColors.grey70Color), getTicketsByEmployeeList![index].created!.split(" ")[0].toText12(color: MyColors.grey70Color),
], ],
), ),
getTicketsByEmployeeList![index].description!.toText12(color: MyColors.grey57Color), getTicketsByEmployeeList![index].description!.toText12(color: MyColors.grey57Color),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
getTicketsByEmployeeList![index].ticketStatusInternalName!.toText14(color: MyColors.textMixColor), getTicketsByEmployeeList![index].ticketStatusInternalName!.toText14(color: MyColors.textMixColor),
SvgPicture.asset( RotatedBox(
"assets/images/arrow_next.svg", quarterTurns: AppState().isArabic(context) ? 2 : 4,
color: MyColors.darkIconColor, child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.darkIconColor),
) ),
], ],
), ),
], ],
).objectContainerView(), ).objectContainerView(),
); );
}, },
separatorBuilder: (BuildContext context, int index) => 12.height, separatorBuilder: (BuildContext context, int index) => 12.height,
itemCount: getTicketsByEmployeeList!.length)) itemCount: getTicketsByEmployeeList!.length))
.expanded, .expanded,
DefaultButton(LocaleKeys.createRequest.tr(), () async { DefaultButton(LocaleKeys.createRequest.tr(), () async {
await Navigator.pushNamed(context, AppRoutes.mowadhafhiHRRequest); await Navigator.pushNamed(context, AppRoutes.mowadhafhiHRRequest);

@ -25,6 +25,7 @@ class OffersAndDiscountsHome extends StatefulWidget {
class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> { class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
List<GetCategoriesList> getCategoriesList = []; List<GetCategoriesList> getCategoriesList = [];
List<OffersListModel> getOffersList = []; List<OffersListModel> getOffersList = [];
List<OffersListModel> _foundOffersList = [];
int currentCategoryID = 0; int currentCategoryID = 0;
@ -54,18 +55,10 @@ class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
isInputTypeNum: false, isInputTypeNum: false,
isReadOnly: false, isReadOnly: false,
onChange: (String value) { onChange: (String value) {
// _runFilter(value); _runFilter(value);
}, },
).paddingOnly(left: 21, right: 21, top: 21), ).paddingOnly(left: 21, right: 21, top: 21),
Row( LocaleKeys.browseCategories.tr().toText17().paddingOnly(left: 21, right: 21, top: 21),
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
LocaleKeys.browseCategories.tr().toText17(),
const Icon(Icons.filter_alt_sharp, color: MyColors.darkIconColor, size: 28.0).onPress(() {
Navigator.pop(context);
}),
],
).paddingOnly(left: 21, right: 21, top: 21),
SizedBox( SizedBox(
height: 110.0, height: 110.0,
child: getCategoriesList.isNotEmpty child: getCategoriesList.isNotEmpty
@ -81,6 +74,7 @@ class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
onTap: () { onTap: () {
setState(() { setState(() {
currentCategoryID = getCategoriesList[index].id!; currentCategoryID = getCategoriesList[index].id!;
getCategoryOffersListAPI();
// getItemsForSaleList.clear(); // getItemsForSaleList.clear();
// currentPageNo = 1; // currentPageNo = 1;
// getItemsForSale(currentPageNo, currentCategoryID); // getItemsForSale(currentPageNo, currentCategoryID);
@ -146,7 +140,7 @@ class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
List<Widget> getItemsForSaleWidgets() { List<Widget> getItemsForSaleWidgets() {
List<Widget> itemsList = []; List<Widget> itemsList = [];
for (var element in getOffersList) { for (var element in _foundOffersList) {
itemsList.add(getItemCard(element)); itemsList.add(getItemCard(element));
} }
@ -213,6 +207,18 @@ class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
); );
} }
void _runFilter(String enteredKeyword) {
List<OffersListModel> results = [];
if (enteredKeyword.isEmpty) {
results = getOffersList;
} else {
results = getOffersList.where((offer) => offer.title!.toLowerCase().contains(enteredKeyword.toLowerCase())).toList();
}
setState(() {
_foundOffersList = results;
});
}
void navigateToDetails(OffersListModel offersListModelObj) { void navigateToDetails(OffersListModel offersListModelObj) {
List<OffersListModel> getOffersDetailList = []; List<OffersListModel> getOffersDetailList = [];
getOffersDetailList.clear(); getOffersDetailList.clear();
@ -258,6 +264,7 @@ class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
getOffersList = await OffersAndDiscountsApiClient().getOffersList(currentCategoryID, 100); getOffersList = await OffersAndDiscountsApiClient().getOffersList(currentCategoryID, 100);
_foundOffersList = getOffersList;
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { } catch (ex) {

@ -45,7 +45,8 @@ class _PendingTransactionsState extends State<PendingTransactions> {
), ),
body: Column( body: Column(
children: [ children: [
Column( ListView(
padding: const EdgeInsets.all(21),
children: [ children: [
PopupMenuButton( PopupMenuButton(
child: DynamicTextFieldWidget( child: DynamicTextFieldWidget(
@ -86,7 +87,7 @@ class _PendingTransactionsState extends State<PendingTransactions> {
}, },
) )
], ],
).objectContainerView().expanded, ).expanded,
DefaultButton( DefaultButton(
LocaleKeys.submit.tr(), LocaleKeys.submit.tr(),
selectedFunction == null selectedFunction == null

@ -11,8 +11,6 @@ import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_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/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/get_notification_buttons_list_model.dart';
import 'package:mohem_flutter_app/models/itg_forms_models/allowed_actions_model.dart'; import 'package:mohem_flutter_app/models/itg_forms_models/allowed_actions_model.dart';
import 'package:mohem_flutter_app/models/itg_forms_models/itg_request_model.dart'; import 'package:mohem_flutter_app/models/itg_forms_models/itg_request_model.dart';
import 'package:mohem_flutter_app/models/itg_forms_models/request_detail_model.dart'; import 'package:mohem_flutter_app/models/itg_forms_models/request_detail_model.dart';
@ -20,7 +18,7 @@ import 'package:mohem_flutter_app/ui/work_list/itg_fragments/approval_level_frag
import 'package:mohem_flutter_app/ui/work_list/itg_fragments/request_detail_fragment.dart'; import 'package:mohem_flutter_app/ui/work_list/itg_fragments/request_detail_fragment.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dialogs/accept_reject_input_dialog.dart'; import 'package:mohem_flutter_app/widgets/dialogs/itg_comments_dialog.dart';
class ItgDetailScreen extends StatefulWidget { class ItgDetailScreen extends StatefulWidget {
ItgDetailScreen({Key? key}) : super(key: key); ItgDetailScreen({Key? key}) : super(key: key);
@ -58,12 +56,11 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
void getItgData() async { void getItgData() async {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
itgRequest = await WorkListApiClient().getITGFormDetails(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, ""); itgRequest = await WorkListApiClient().getITGFormDetails(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "");
allowedActionList = itgRequest?.allowedActions ?? []; allowedActionList = itgRequest?.allowedActions ?? [];
if (allowedActionList.isNotEmpty) { if (allowedActionList.isNotEmpty) {
isCloseAvailable = allowedActionList.any((element) => element.action == "CLOSE"); isCloseAvailable = allowedActionList.any((element) => element.action == "CLOSE");
isApproveAvailable = itgRequest!.allowedActions!.any((element) => element.action == "Approve"); isApproveAvailable = itgRequest!.allowedActions!.any((element) => element.action == "Approve");
// isAnswerAvailable = itgRequest!.allowedActions!.any((element) => element.action == "Answer");
isRejectAvailable = itgRequest!.allowedActions!.any((element) => element.action == "Reject"); isRejectAvailable = itgRequest!.allowedActions!.any((element) => element.action == "Reject");
} }
Utils.hideLoading(context); Utils.hideLoading(context);
@ -341,34 +338,39 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
void performAction(String actionMode) { void performAction(String actionMode) {
showDialog( showDialog(
context: context, context: context,
builder: (cxt) => AcceptRejectInputDialog( builder: (cxt) => ITGCommentsDialog(
message: LocaleKeys.requestedItems.tr(), message: LocaleKeys.writeComment.tr(),
// notificationGetRespond: notificationNoteInput,
onTap: (note) { onTap: (note) {
Map<String, dynamic> payload = { if (actionMode == "APPROVED") {
"P_ACTION_MODE": actionMode, performApproveAction(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", note);
"P_APPROVER_INDEX": null, } else {
"P_COMMENTS": "", performRejectAction(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", note);
"P_FORWARD_TO_USER_NAME": "", }
// "P_NOTIFICATION_ID": workListData!.nOTIFICATIONID!,
"RespondAttributeList": [
// if (notificationNoteInput != null) {notificationNoteInput!.attributeName: note}
],
};
performNotificationAction(payload);
}, },
), ),
); );
} }
void performNotificationAction(Map<String, dynamic> payload) async { void performRejectAction(String requestType, int taskId, int itemId, String employeeNumber, String comments) async {
try {
Utils.showLoading(context);
ITGRequest? itgRequest = await WorkListApiClient().rejectITGRequest(requestType, taskId, itemId, employeeNumber, comments);
Utils.hideLoading(context);
Utils.showToast(LocaleKeys.yourChangeHasBeenSavedSuccessfully.tr());
Navigator.pop(context, "delegate_reload");
} catch (ex) {
Utils.hideLoading(context);
Utils.handleException(ex, context, null);
}
}
void performApproveAction(String requestType, int taskId, int itemId, String employeeNumber, String comments) async {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
GenericResponseModel model = await WorkListApiClient().postNotificationActions(payload); ITGRequest? itgRequest = await WorkListApiClient().approveITGRequest(requestType, taskId, itemId, employeeNumber, comments);
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.showToast(LocaleKeys.yourChangeHasBeenSavedSuccessfully.tr()); Utils.showToast(LocaleKeys.yourChangeHasBeenSavedSuccessfully.tr());
Navigator.pop(context, true); Navigator.pop(context, "delegate_reload");
} catch (ex) { } catch (ex) {
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.handleException(ex, context, null); Utils.handleException(ex, context, null);

@ -32,17 +32,45 @@ class WorkListScreen extends StatefulWidget {
class _WorkListScreenState extends State<WorkListScreen> { class _WorkListScreenState extends State<WorkListScreen> {
List<WorkListItemTypeModelData> workListItemTypes = [ List<WorkListItemTypeModelData> workListItemTypes = [
WorkListItemTypeModelData( WorkListItemTypeModelData(
value: 0, name: 'HR', fullName: LocaleKeys.humanResource.tr(), active: false, color: [Color(0xff32D892), Color(0xff1AB170)], icon: "assets/images/miss_swipe.svg", key: 'HRSSA', disable: false), value: 0,
name: 'HR',
fullName: LocaleKeys.humanResource.tr(),
active: false,
color: [Color(0xff32D892), Color(0xff1AB170)],
icon: "assets/images/miss_swipe.svg",
key: 'HRSSA',
disable: false),
WorkListItemTypeModelData( WorkListItemTypeModelData(
value: 0, name: 'MO', 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( WorkListItemTypeModelData(
value: 0, name: 'PR', fullName: LocaleKeys.purchaseRequisition.tr(), active: false, color: [Color(0xff48EACF), Color(0xff3DCAB3)], icon: "assets/images/miss_swipe.svg", key: 'REQAPPRV', disable: false), value: 0,
name: 'PR',
fullName: LocaleKeys.purchaseRequisition.tr(),
active: false,
color: [Color(0xff48EACF), Color(0xff3DCAB3)],
icon: "assets/images/miss_swipe.svg",
key: 'REQAPPRV',
disable: false),
WorkListItemTypeModelData( WorkListItemTypeModelData(
value: 0, name: 'PO', fullName: LocaleKeys.purchaseOrder.tr(), active: false, color: [Color(0xff5099E3), Color(0xff3670AA)], icon: "assets/images/miss_swipe.svg", key: 'POAPPRV', disable: false), value: 0,
name: 'PO',
fullName: LocaleKeys.purchaseOrder.tr(),
active: false,
color: [Color(0xff5099E3), Color(0xff3670AA)],
icon: "assets/images/miss_swipe.svg",
key: 'POAPPRV',
disable: false),
WorkListItemTypeModelData( 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( WorkListItemTypeModelData(
value: 0, name: 'IC', fullName: LocaleKeys.itemCreation.tr(), active: false, color: [Color(0xff32D892), Color(0xff1AB170)], icon: "assets/images/miss_swipe.svg", key: 'INVITEM', disable: false), value: 0,
name: 'IC',
fullName: LocaleKeys.itemCreation.tr(),
active: false,
color: [Color(0xff32D892), Color(0xff1AB170)],
icon: "assets/images/miss_swipe.svg",
key: 'INVITEM',
disable: false),
WorkListItemTypeModelData( 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),
]; ];
@ -232,6 +260,7 @@ class _WorkListScreenState extends State<WorkListScreen> {
var shouldReloadData = await Navigator.pushNamed(context, AppRoutes.itgDetail); var shouldReloadData = await Navigator.pushNamed(context, AppRoutes.itgDetail);
if (shouldReloadData != null) { if (shouldReloadData != null) {
if (shouldReloadData.toString() == "delegate_reload") { if (shouldReloadData.toString() == "delegate_reload") {
providerData.itgFormsModel!.totalCount = providerData.itgFormsModel!.totalCount! - 1;
calculateCounter(); calculateCounter();
getWorkList(); getWorkList();
} }
@ -292,10 +321,10 @@ class _WorkListScreenState extends State<WorkListScreen> {
Row( Row(
children: [ 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,
SvgPicture.asset( RotatedBox(
"assets/images/arrow_next.svg", quarterTurns: AppState().isArabic(context) ? 2:4,
color: MyColors.darkIconColor, child: SvgPicture.asset("assets/images/arrow_next.svg", color:MyColors.darkIconColor)
) ),
], ],
), ),
], ],
@ -374,10 +403,11 @@ class _WorkListScreenState extends State<WorkListScreen> {
Row( Row(
children: [ 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,
SvgPicture.asset( RotatedBox(
"assets/images/arrow_next.svg", quarterTurns: AppState().isArabic(context) ? 2:4,
color: MyColors.darkIconColor, child: SvgPicture.asset("assets/images/arrow_next.svg", color:MyColors.darkIconColor)
) ),
], ],
), ),
], ],

@ -209,6 +209,7 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
workListData: workListData, workListData: workListData,
itemCreationHeader: getItemCreationNtfBody?.itemCreationHeader ?? [], itemCreationHeader: getItemCreationNtfBody?.itemCreationHeader ?? [],
getStampMsNotifications: getStampMsNotifications, getStampMsNotifications: getStampMsNotifications,
getStampNsNotifications: getStampNsNotifications,
getEitCollectionNotificationBodyList: getEitCollectionNotificationBodyList, getEitCollectionNotificationBodyList: getEitCollectionNotificationBodyList,
getPhonesNotificationBodyList: getPhonesNotificationBodyList, getPhonesNotificationBodyList: getPhonesNotificationBodyList,
getBasicDetNtfBodyList: getBasicDetNtfBodyList, getBasicDetNtfBodyList: getBasicDetNtfBodyList,
@ -222,8 +223,8 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
poLinesList: getPoNotificationBody?.pOLines ?? [], poLinesList: getPoNotificationBody?.pOLines ?? [],
itemCreationLines: getItemCreationNtfBody?.itemCreationLines ?? [], itemCreationLines: getItemCreationNtfBody?.itemCreationLines ?? [],
), ),
ActionsFragment(workListData!.nOTIFICATIONID, actionHistoryList), actionHistoryList.isEmpty ? Utils.getNoDataWidget(context) : ActionsFragment(workListData!.nOTIFICATIONID, actionHistoryList),
AttachmentsFragment(getAttachmentList), getAttachmentList.isEmpty ? Utils.getNoDataWidget(context) : AttachmentsFragment(getAttachmentList),
], ],
).expanded, ).expanded,
if (isApproveAvailable || isRejectAvailable || isCloseAvailable) if (isApproveAvailable || isRejectAvailable || isCloseAvailable)
@ -232,10 +233,7 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
decoration: const BoxDecoration( decoration: const BoxDecoration(
color: Colors.white, color: Colors.white,
border: Border( border: Border(
top: BorderSide( top: BorderSide(color: MyColors.lightGreyEFColor, width: 1.0),
color: MyColors.lightGreyEFColor,
width: 1.0,
),
), ),
), ),
child: Row( child: Row(
@ -244,29 +242,20 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
DefaultButton( DefaultButton(
LocaleKeys.reject.tr(), LocaleKeys.reject.tr(),
() => performAction("REJECTED"), () => performAction("REJECTED"),
colors: const [ colors: const [Color(0xffE47A7E), Color(0xffDE6D71)],
Color(0xffE47A7E),
Color(0xffDE6D71),
],
).expanded, ).expanded,
if (isApproveAvailable && isRejectAvailable) 8.width, if (isApproveAvailable && isRejectAvailable) 8.width,
if (isApproveAvailable) if (isApproveAvailable)
DefaultButton( DefaultButton(
LocaleKeys.approve.tr(), LocaleKeys.approve.tr(),
() => performAction("APPROVED"), () => performAction("APPROVED"),
colors: const [ colors: const [Color(0xff28C884), Color(0xff1BB271)],
Color(0xff28C884),
Color(0xff1BB271),
],
).expanded, ).expanded,
if (isCloseAvailable) if (isCloseAvailable)
DefaultButton( DefaultButton(
LocaleKeys.ok.tr(), LocaleKeys.ok.tr(),
() => performAction("CLOSE"), () => performAction("CLOSE"),
colors: const [ colors: const [Color(0xff32D892), Color(0xff1AB170)],
Color(0xff32D892),
Color(0xff1AB170),
],
).expanded, ).expanded,
8.width, 8.width,
Container( Container(
@ -487,10 +476,13 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
"P_FORWARD_TO_USER_NAME": "", "P_FORWARD_TO_USER_NAME": "",
"P_NOTIFICATION_ID": workListData!.nOTIFICATIONID, "P_NOTIFICATION_ID": workListData!.nOTIFICATIONID,
"RespondAttributeList": [ "RespondAttributeList": [
if (notificationNoteInput != null) {notificationNoteInput!.attributeName: note} if (notificationNoteInput != null)
{
"ATTRIBUTE_NAME": notificationNoteInput!.attributeName,
if (notificationNoteInput!.attributeType == "number") "ATTRIBUTE_NUMBER_VALUE": note else if (notificationNoteInput!.attributeType == "VARCHAR2") "ATTRIBUTE_TEXT_VALUE": note
}
], ],
}; };
performNotificationAction(payload); performNotificationAction(payload);
}, },
), ),

@ -28,9 +28,9 @@ class AttachmentsFragment extends StatelessWidget {
(getAttachmentList[index].fILENAME?.capitalizeFirstofEach ?? "").toText16().expanded, (getAttachmentList[index].fILENAME?.capitalizeFirstofEach ?? "").toText16().expanded,
], ],
).objectContainerView().onPress(() async { ).objectContainerView().onPress(() async {
print("calling"); // print("calling");
String path = await _createFileFromString(getAttachmentList[index].fILEDATA ?? "", getAttachmentList[index].fILECONTENTTYPE ?? ""); // String path = await _createFileFromString(getAttachmentList[index].fILEDATA ?? "", getAttachmentList[index].fILECONTENTTYPE ?? "");
OpenFile.open(path); // OpenFile.open(path);
}); });
}, },
separatorBuilder: (BuildContext context, int index) => 12.height, separatorBuilder: (BuildContext context, int index) => 12.height,

@ -43,12 +43,12 @@ class _DetailFragmentState extends State<DetailFragment> {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
ItemDetailView(LocaleKeys.employeeNumber.tr(), widget.memberInformationListModel!.eMPLOYEENUMBER ?? ""), ItemDetailView(LocaleKeys.employeeNumber.tr(), widget.memberInformationListModel!.eMPLOYEENUMBER ?? ""),
ItemDetailView(LocaleKeys.employeeName.tr(), (AppState().isArabic(context) ? widget.memberInformationListModel!.eMPLOYEENAMEAr : widget.memberInformationListModel!.eMPLOYEENAMEEn) ?? ""), ItemDetailView(LocaleKeys.name.tr(), (AppState().isArabic(context) ? widget.memberInformationListModel!.eMPLOYEENAMEAr : widget.memberInformationListModel!.eMPLOYEENAMEEn) ?? ""),
ItemDetailView(LocaleKeys.jobTitle.tr(), makePositionName(widget.memberInformationListModel!.pOSITIONNAME ?? "")), ItemDetailView(LocaleKeys.jobTitle.tr(), makePositionName(widget.memberInformationListModel!.pOSITIONNAME ?? "")),
ItemDetailView(LocaleKeys.grade.tr(), widget.memberInformationListModel!.gRADENAME ?? ""), ItemDetailView(LocaleKeys.grade.tr(), widget.memberInformationListModel!.gRADENAME ?? ""),
ItemDetailView(LocaleKeys.jobCategory.tr(), makePositionName(widget.memberInformationListModel!.pOSITIONNAME ?? "")), ItemDetailView(LocaleKeys.jobCategory.tr(), makePositionName(widget.memberInformationListModel!.pOSITIONNAME ?? "")),
ItemDetailView(LocaleKeys.category.tr(), widget.memberInformationListModel!.eMPLOYMENTCATEGORYMEANING ?? ""), ItemDetailView(LocaleKeys.category.tr(), widget.memberInformationListModel!.eMPLOYMENTCATEGORYMEANING ?? ""),
ItemDetailView(LocaleKeys.employeeEmailAddress.tr(), widget.memberInformationListModel!.eMPLOYEEEMAILADDRESS ?? ""), ItemDetailView(LocaleKeys.email.tr(), widget.memberInformationListModel!.eMPLOYEEEMAILADDRESS ?? ""),
ItemDetailView(LocaleKeys.payrollBranch.tr(), widget.memberInformationListModel!.pAYROLLNAME ?? ""), ItemDetailView(LocaleKeys.payrollBranch.tr(), widget.memberInformationListModel!.pAYROLLNAME ?? ""),
], ],
).objectContainerView(), ).objectContainerView(),

@ -114,7 +114,7 @@ class InfoFragment extends StatelessWidget {
ItemDetailView(LocaleKeys.totalPOAmountInWords.tr(), poHeaderList[index].tOTPOAMTWORD ?? ""), ItemDetailView(LocaleKeys.totalPOAmountInWords.tr(), poHeaderList[index].tOTPOAMTWORD ?? ""),
], ],
).objectContainerView(), ).objectContainerView(),
separatorBuilder: (cxt, index) => 4.height, separatorBuilder: (cxt, index) => 1.divider,
itemCount: poHeaderList.length); itemCount: poHeaderList.length);
} }
@ -150,7 +150,7 @@ class InfoFragment extends StatelessWidget {
ItemDetailView(LocaleKeys.approvedSwipeEndReason.tr(), list[index].aPPROVEDENDREASONDESC.toString()), ItemDetailView(LocaleKeys.approvedSwipeEndReason.tr(), list[index].aPPROVEDENDREASONDESC.toString()),
], ],
), ),
separatorBuilder: (cxt, index) => 18.height, separatorBuilder: (cxt, index) => 1.divider.paddingOnly(top: 8, bottom: 8),
itemCount: list.length); itemCount: list.length);
} }
@ -163,11 +163,11 @@ class InfoFragment extends StatelessWidget {
children: [ children: [
ItemDetailView(LocaleKeys.employeeNumber.tr(), list[index].eMPLOYEENUMBER.toString()), ItemDetailView(LocaleKeys.employeeNumber.tr(), list[index].eMPLOYEENUMBER.toString()),
ItemDetailView(LocaleKeys.assignmentNumber.tr(), list[index].aSSIGNMENTNUMBER.toString()), ItemDetailView(LocaleKeys.assignmentNumber.tr(), list[index].aSSIGNMENTNUMBER.toString()),
ItemDetailView(LocaleKeys.employeeName.tr(), list[index].eMPLOYEENAME.toString()), ItemDetailView(LocaleKeys.name.tr(), list[index].eMPLOYEENAME.toString()),
ItemDetailView(LocaleKeys.scheduleDate.tr(), DateUtil.formatDateToDate(DateUtil.convertStringToDate(list[index].sCHEDULEDATE.toString()), false)), ItemDetailView(LocaleKeys.scheduleDate.tr(), DateUtil.formatDateToDate(DateUtil.convertStringToDate(list[index].sCHEDULEDATE.toString()), false)),
], ],
), ),
separatorBuilder: (cxt, index) => 18.height, separatorBuilder: (cxt, index) => 1.divider.paddingOnly(top: 8, bottom: 8),
itemCount: list.length); itemCount: list.length);
} }

@ -26,9 +26,9 @@ class AttachmentOptions extends StatelessWidget {
padding: const EdgeInsets.only(top: 21, bottom: 14), padding: const EdgeInsets.only(top: 21, bottom: 14),
shrinkWrap: true, shrinkWrap: true,
children: [ children: [
itemView("open_camera.svg", "Open\nCamera"), itemView("open_camera.svg", "Open\nCamera", onCameraTap),
itemView("gallery.svg", "Upload from\nGallery"), itemView("gallery.svg", "Upload from\nGallery", onGalleryTap),
itemView("files.svg", "Upload from\nFiles"), itemView("files.svg", "Upload from\nFiles", onFilesTap),
], ],
) )
], ],
@ -36,19 +36,22 @@ class AttachmentOptions extends StatelessWidget {
); );
} }
Widget itemView(String icon, String title) { Widget itemView(String icon, String title, VoidCallback onTap) {
return Column( return InkWell(
crossAxisAlignment: CrossAxisAlignment.start, onTap: onTap,
mainAxisAlignment: MainAxisAlignment.spaceBetween, child: Column(
children: [ crossAxisAlignment: CrossAxisAlignment.start,
SvgPicture.asset("assets/images/$icon"), mainAxisAlignment: MainAxisAlignment.spaceBetween,
title.toText11(isBold: true), children: [
], SvgPicture.asset("assets/images/$icon"),
).paddingOnly(left: 13, right: 13, top: 16, bottom: 12).expanded.objectContainerBorderView( title.toText11(isBold: true),
disablePadding: true, ],
radius: 10, ).paddingOnly(left: 13, right: 13, top: 16, bottom: 12).expanded.objectContainerBorderView(
color: MyColors.greyF7Color.withOpacity(.48), disablePadding: true,
borderColor: MyColors.lightGreyE5Color.withOpacity(.48), radius: 10,
); color: MyColors.greyF7Color.withOpacity(.48),
borderColor: MyColors.lightGreyE5Color.withOpacity(.48),
),
);
} }
} }

@ -66,6 +66,7 @@ class AcceptRejectInputDialog extends StatelessWidget {
notificationGetRespond!.attributeDisplayName!, notificationGetRespond!.attributeDisplayName!,
TextEditingController(), TextEditingController(),
isBackgroundEnable: true, isBackgroundEnable: true,
isInputTypeNum: notificationGetRespond!.attributeType == "number",
lines: 3, lines: 3,
onChange: (String note) { onChange: (String note) {
this.note = note; this.note = note;

@ -0,0 +1,102 @@
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/input_widget.dart';
class ITGCommentsDialog extends StatelessWidget {
final String? title;
final String? message;
final String? okTitle;
final Function(String) onTap;
ITGCommentsDialog({Key? key, this.title, @required this.message, this.okTitle, required this.onTap}) : super(key: key);
String note = "";
@override
Widget build(BuildContext context) {
return Dialog(
backgroundColor: Colors.white,
shape: const RoundedRectangleBorder(),
insetPadding: const EdgeInsets.only(left: 21, right: 21),
child: Padding(
padding: const EdgeInsets.only(left: 20, right: 20, top: 18, bottom: 28),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.only(top: 16.0),
child: Text(
title ?? LocaleKeys.confirm.tr(),
style: const TextStyle(fontSize: 24, fontWeight: FontWeight.w600, color: Color(0xff2B353E), height: 35 / 24, letterSpacing: -0.96),
),
),
),
IconButton(
padding: EdgeInsets.zero,
icon: const Icon(Icons.close),
color: const Color(0xff2B353E),
constraints: const BoxConstraints(),
onPressed: () {
Navigator.pop(context);
},
)
],
),
Text(
message ?? "",
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff808080), letterSpacing: -0.48),
),
// if (notificationGetRespond != null) ...[
14.height,
InputWidget(
"Enter a Note",
LocaleKeys.comments.tr(),
TextEditingController(),
isBackgroundEnable: true,
isInputTypeNum: false,
lines: 3,
onChange: (String note) {
this.note = note;
},
),
// ],
28.height,
Row(
children: [
DefaultButton(
LocaleKeys.cancel.tr(),
() => Navigator.pop(context),
colors: const [MyColors.lightGreyEAColor, MyColors.lightGreyEAColor],
textColor: MyColors.darkTextColor,
).expanded,
10.width,
DefaultButton(
LocaleKeys.ok.tr(),
() {
Navigator.pop(context);
onTap(note);
},
colors: const [
Color(0xff28C884),
Color(0xff1BB271),
],
).expanded,
],
),
],
),
),
);
}
}

@ -15,9 +15,31 @@ class ImageOptions {
context, context,
child: AttachmentOptions( child: AttachmentOptions(
onCameraTap: () async { onCameraTap: () async {
PickedFile? path = await ImagePicker.platform.pickImage(source: ImageSource.camera, imageQuality: 20); if (Platform.isAndroid) {
cameraImageAndroid(image);
} else {
File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.camera, imageQuality: 20))?.path ?? "");
String fileName = _image.path;
var bytes = File(fileName).readAsBytesSync();
String base64Encode = base64.encode(bytes);
if (base64Encode != null) {
image(base64Encode, _image);
}
}
},
onGalleryTap: () async {
if (Platform.isAndroid) {
galleryImageAndroid(image);
} else {
File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 20))?.path ?? "");
String fileName = _image.path;
var bytes = File(fileName).readAsBytesSync();
String base64Encode = base64.encode(bytes);
if (base64Encode != null) {
image(base64Encode, _image);
}
}
}, },
onGalleryTap: () {},
onFilesTap: () async { onFilesTap: () async {
FilePickerResult? result = await FilePicker.platform.pickFiles(); FilePickerResult? result = await FilePicker.platform.pickFiles();
}, },

@ -75,6 +75,7 @@ dependencies:
url_launcher: ^6.0.15 url_launcher: ^6.0.15
share: 2.0.4 share: 2.0.4
flutter_rating_bar: ^4.0.1 flutter_rating_bar: ^4.0.1
pull_to_refresh: ^2.0.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

Loading…
Cancel
Save