Merge branch 'master' into development_aamir

merge-requests/41/head
Aamir Muhammad 3 years ago
commit 235dc6b1f4

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20.527" height="19.358" viewBox="0 0 20.527 19.358">
<path id="winner" d="M8.828,34.936H14.18v6.547H8V35.763A.829.829,0,0,1,8.828,34.936ZM25.106,22.124a1.353,1.353,0,1,1-1.353,1.353A1.353,1.353,0,0,1,25.106,22.124Zm0,3.068a2.678,2.678,0,0,1,2.558,1.884.612.612,0,0,1-.585.793H23.133a.612.612,0,0,1-.584-.793,2.678,2.678,0,0,1,2.558-1.884Zm-6.842-.661a1.353,1.353,0,1,1-1.353,1.353A1.353,1.353,0,0,1,18.264,24.532Zm0,3.068a2.678,2.678,0,0,1,2.558,1.884.612.612,0,0,1-.584.793H16.291a.612.612,0,0,1-.584-.793A2.678,2.678,0,0,1,18.264,27.6Zm-6.842-.661a1.353,1.353,0,1,1-1.353,1.353A1.353,1.353,0,0,1,11.421,26.939Zm0,3.068a2.678,2.678,0,0,1,2.558,1.884.612.612,0,0,1-.584.793H9.448a.612.612,0,0,1-.584-.793A2.678,2.678,0,0,1,11.421,30.008Zm11.091.269H27.7a.829.829,0,0,1,.828.828V41.482H21.685V31.1A.829.829,0,0,1,22.513,30.277Zm-1.49,2.408H15.67a.829.829,0,0,0-.828.828v7.97h6.18Z" transform="translate(-8 -22.124)" fill="#2e303a" fill-rule="evenodd"/>
</svg>

After

Width:  |  Height:  |  Size: 1008 B

@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="195.225" height="49.742" viewBox="0 0 195.225 49.742">
<g id="ribbon" transform="translate(0 -280.776)">
<g id="Group_8895" data-name="Group 8895" transform="translate(0 280.776)">
<path id="Path_14052" data-name="Path 14052" d="M.125,280.776l12.038,25.168L0,330.518H97.613l20.923-22.538-20.923-27.2Z" transform="translate(0 -280.776)" fill="#1fa269"/>
</g>
<g id="Group_8896" data-name="Group 8896" transform="translate(97.613 280.776)">
<path id="Path_14054" data-name="Path 14054" d="M341.49,305.762l12.074-24.986H256v49.742h97.613Z" transform="translate(-256 -280.776)" fill="#1a8959"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 687 B

@ -423,6 +423,7 @@
"skip": "يتخطى", "skip": "يتخطى",
"typeCurrentPasswordBelow": "اكتب كلمة المرور الحاليه", "typeCurrentPasswordBelow": "اكتب كلمة المرور الحاليه",
"currentPassword": "كلمة المرور الحاليه", "currentPassword": "كلمة المرور الحاليه",
"concurrentReports": "التقارير المتزامنه",
"profile": { "profile": {
"reset_password": { "reset_password": {
"label": "Reset Password", "label": "Reset Password",

@ -423,6 +423,7 @@
"skip": "Skip", "skip": "Skip",
"typeCurrentPasswordBelow": "Type Your Current password below", "typeCurrentPasswordBelow": "Type Your Current password below",
"currentPassword": "Current password", "currentPassword": "Current password",
"concurrentReports": "Concurrent Reports",
"profile": { "profile": {
"reset_password": { "reset_password": {
"label": "Reset Password", "label": "Reset Password",

@ -0,0 +1 @@
{"v":"5.8.1","fr":30,"ip":0,"op":60,"w":300,"h":300,"nm":"loading_6","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":60,"s":[360]}],"ix":10},"p":{"a":0,"k":[150.00000000000003,150.00000000000003,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[30.000000000000004,30.000000000000004,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[300,300],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.12941176470588237,0.7411764705882353,0.7764705882352941,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[0]},{"t":60,"s":[99]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[1]},{"t":50,"s":[100]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":60,"s":[3]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.00000000000003,150.00000000000003,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[30.000000000000004,30.000000000000004,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[300,300],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.7450980392156863,0.9254901960784314,0.9372549019607843,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"bm":0}],"markers":[]}

@ -6,6 +6,7 @@ import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart';
import 'package:mohem_flutter_app/models/my_requests/get_ccp_dff_structure_model.dart'; import 'package:mohem_flutter_app/models/my_requests/get_ccp_dff_structure_model.dart';
import 'package:mohem_flutter_app/models/my_requests/get_ccp_output_model.dart'; import 'package:mohem_flutter_app/models/my_requests/get_ccp_output_model.dart';
import 'package:mohem_flutter_app/models/my_requests/get_ccp_transactions_model.dart'; import 'package:mohem_flutter_app/models/my_requests/get_ccp_transactions_model.dart';
import 'package:mohem_flutter_app/models/my_requests/get_ccp_transations_list_model.dart';
import 'package:mohem_flutter_app/models/my_requests/get_concurrent_programs_model.dart'; import 'package:mohem_flutter_app/models/my_requests/get_concurrent_programs_model.dart';
class MyRequestsApiClient { class MyRequestsApiClient {
@ -59,4 +60,38 @@ class MyRequestsApiClient {
}, url, postParams); }, url, postParams);
} }
Future<SubmitCcpTransactionList?> getSubmitNewRequest(List<Map<String, dynamic>> list) async
{
String url = "${ApiConsts.erpRest}SUBMIT_CCP_TRANSACTION";
Map<String, dynamic> postParams = {
"P_MENU_TYPE": "E",
"P_SELECTED_RESP_ID": -999,
"P_DESC_FLEX_NAME": "HMG_EMP_BUS_TRIP_SET_SS",
};
postParams.addAll(AppState().postParamsJson);
postParams["EITTransactionTBL"] = list;
return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData.submitCcpTransactionList;
}, url, postParams);
}
Future<List<GetCCPTransactionsModel>> getCcpTransactions(List<Map<String, dynamic>> list) async
{
String url = "${ApiConsts.erpRest}GET_CCP_TRANSACTIONS";
Map<String, dynamic> postParams = {
"P_MENU_TYPE": "E",
"P_SELECTED_RESP_ID": -999,
"P_DESC_FLEX_NAME": "HMG_EMP_BUS_TRIP_SET_SS",
};
postParams.addAll(AppState().postParamsJson);
postParams["EITTransactionTBL"] = list;
return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData.getCCPTransactionsModel ?? [];
}, url, postParams);
}
} }

@ -97,7 +97,7 @@ class ProfileApiClient {
Future<GenericResponseModel> getDffStructure(String pFunctionName, String uRL, String requestType) async { Future<GenericResponseModel> getDffStructure(String pFunctionName, String uRL, String requestType) async {
String url = ApiConsts.erpRest + uRL; String url = ApiConsts.erpRest + uRL;
Map<String, dynamic> postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E", "P_REQUEST_TYPE": pFunctionName, "P_COUNTRY_CODE": "SA"}; Map<String, dynamic> postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E", "P_REQUEST_TYPE": pFunctionName, "P_FUNCTION_NAME": pFunctionName, "P_COUNTRY_CODE": "SA"};
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);

@ -14,9 +14,12 @@ class MyDecorations {
], ],
); );
static Decoration answerContainerDecoration = BoxDecoration( static Decoration getContainersDecoration(Color color) {
borderRadius: BorderRadius.circular(10), Decoration answerContainerDecoration = BoxDecoration(
color: MyColors.greyF7Color, borderRadius: BorderRadius.circular(10),
border: Border.all(width: 1, color: MyColors.lightGreyEFColor), color: color,
); border: Border.all(width: 1, color: MyColors.lightGreyEFColor),
);
return answerContainerDecoration;
}
} }

@ -17,6 +17,8 @@ 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/widgets/dialogs/confirm_dialog.dart'; import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart';
import 'package:mohem_flutter_app/widgets/loading_dialog.dart'; import 'package:mohem_flutter_app/widgets/loading_dialog.dart';
import 'package:nfc_manager/nfc_manager.dart';
import 'package:nfc_manager/platform_tags.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
// ignore_for_file: avoid_annotating_with_dynamic // ignore_for_file: avoid_annotating_with_dynamic
@ -287,7 +289,9 @@ class Utils {
String formattedDate; String formattedDate;
if (date.isNotEmpty) { if (date.isNotEmpty) {
formattedDate = date.split('T')[0]; formattedDate = date.split('T')[0];
formattedDate = formattedDate + ' 00:00:00'; if(!formattedDate.contains("00:00:00")) {
formattedDate = formattedDate + ' 00:00:00';
}
} else { } else {
formattedDate = date; formattedDate = date;
} }
@ -321,4 +325,22 @@ class Utils {
} }
return selectedDate; return selectedDate;
} }
static void readNFc({required Function(String) onRead}) {
NfcManager.instance.startSession(onDiscovered: (NfcTag tag) async {
print(tag.data);
var f;
if (Platform.isAndroid) {
f = MifareUltralight(tag: tag, identifier: tag.data["nfca"]["identifier"], type: 2, maxTransceiveLength: 252, timeout: 22);
} else {
f = MifareUltralight(tag: tag, identifier: tag.data["mifare"]["identifier"], type: 2, maxTransceiveLength: 252, timeout: 22);
}
String identifier = f.identifier.map((e) => e.toRadixString(16).padLeft(2, '0')).join('');
NfcManager.instance.stopSession();
onRead(identifier);
}).catchError((err) {
print(err);
});
}
} }

@ -8,6 +8,7 @@ import 'package:mohem_flutter_app/ui/chat/chat_home.dart';
import 'package:mohem_flutter_app/ui/landing/dashboard_screen.dart'; import 'package:mohem_flutter_app/ui/landing/dashboard_screen.dart';
import 'package:mohem_flutter_app/ui/landing/itg/survey_screen.dart'; import 'package:mohem_flutter_app/ui/landing/itg/survey_screen.dart';
import 'package:mohem_flutter_app/ui/landing/today_attendance_screen.dart'; import 'package:mohem_flutter_app/ui/landing/today_attendance_screen.dart';
import 'package:mohem_flutter_app/ui/landing/today_attendance_screen2.dart';
import 'package:mohem_flutter_app/ui/leave_balance/add_leave_balance_screen.dart'; import 'package:mohem_flutter_app/ui/leave_balance/add_leave_balance_screen.dart';
import 'package:mohem_flutter_app/ui/leave_balance/leave_balance_screen.dart'; import 'package:mohem_flutter_app/ui/leave_balance/leave_balance_screen.dart';
import 'package:mohem_flutter_app/ui/login/change_password_screen.dart'; import 'package:mohem_flutter_app/ui/login/change_password_screen.dart';
@ -193,7 +194,7 @@ class AppRoutes {
subMenuScreen: (BuildContext context) => SubMenuScreen(), subMenuScreen: (BuildContext context) => SubMenuScreen(),
newPassword: (BuildContext context) => NewPasswordScreen(), newPassword: (BuildContext context) => NewPasswordScreen(),
forgotPassword: (BuildContext context) => ForgotPasswordScreen(), forgotPassword: (BuildContext context) => ForgotPasswordScreen(),
todayAttendance: (BuildContext context) => TodayAttendanceScreen(), todayAttendance: (BuildContext context) => TodayAttendanceScreen2(),
//eit //eit
addEitScreen: (BuildContext context) => AddEITScreen(), addEitScreen: (BuildContext context) => AddEITScreen(),

@ -74,7 +74,7 @@ extension EmailValidator on String {
this, this,
textAlign: isCenter ? TextAlign.center : null, textAlign: isCenter ? TextAlign.center : null,
maxLines: (maxLine > 0) ? maxLine : null, maxLines: (maxLine > 0) ? maxLine : null,
minFontSize: 8, minFontSize: 5,
style: TextStyle( style: TextStyle(
fontSize: fontSize, fontSize: fontSize,
fontWeight: isBold ? FontWeight.bold : FontWeight.w600, fontWeight: isBold ? FontWeight.bold : FontWeight.w600,

@ -12,21 +12,14 @@ extension WidgetExtensions on Widget {
Widget get center => Center(child: this); Widget get center => Center(child: this);
Widget circle(double _value) => Widget circle(double _value) => ClipRRect(borderRadius: BorderRadius.circular(_value), child: this);
ClipRRect(borderRadius: BorderRadius.circular(_value), child: this);
Widget paddingAll(double _value) => Widget paddingAll(double _value) => Padding(padding: EdgeInsets.all(_value), child: this);
Padding(padding: EdgeInsets.all(_value), child: this);
Widget paddingOnly( Widget paddingOnly({double left = 0.0, double right = 0.0, double top = 0.0, double bottom = 0.0}) =>
{double left = 0.0, Padding(padding: EdgeInsets.only(left: left, right: right, top: top, bottom: bottom), child: this);
double right = 0.0,
double top = 0.0, Widget toExpanded({int flex = 1}) => Expanded(flex: flex, child: this);
double bottom = 0.0}) =>
Padding(
padding: EdgeInsets.only(
left: left, right: right, top: top, bottom: bottom),
child: this);
Widget toShimmer({bool isShow = true}) => isShow Widget toShimmer({bool isShow = true}) => isShow
? Shimmer.fromColors( ? Shimmer.fromColors(
@ -51,15 +44,9 @@ extension WidgetExtensions on Widget {
child: this, child: this,
); );
Widget objectContainerView( Widget objectContainerView({String title = "", String note = "", bool disablePadding = false, double radius = 15}) {
{String title = "",
String note = "",
bool disablePadding = false,
double radius = 15}) {
return Container( return Container(
padding: disablePadding padding: disablePadding ? EdgeInsets.zero : const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14),
? EdgeInsets.zero
: const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(radius), borderRadius: BorderRadius.circular(radius),
@ -95,9 +82,7 @@ extension WidgetExtensions on Widget {
bool disableWidth = false, bool disableWidth = false,
bool isAlignment = false}) { bool isAlignment = false}) {
return Container( return Container(
padding: disablePadding padding: disablePadding ? EdgeInsets.zero : const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14),
? EdgeInsets.zero
: const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(radius), borderRadius: BorderRadius.circular(radius),
color: color, color: color,

@ -439,6 +439,7 @@ class CodegenLoader extends AssetLoader{
"skip": "يتخطى", "skip": "يتخطى",
"typeCurrentPasswordBelow": "اكتب كلمة المرور الحاليه", "typeCurrentPasswordBelow": "اكتب كلمة المرور الحاليه",
"currentPassword": "كلمة المرور الحاليه", "currentPassword": "كلمة المرور الحاليه",
"concurrentReports": "التقارير المتزامنه",
"profile": { "profile": {
"reset_password": { "reset_password": {
"label": "Reset Password", "label": "Reset Password",
@ -935,6 +936,7 @@ static const Map<String,dynamic> en_US = {
"skip": "Skip", "skip": "Skip",
"typeCurrentPasswordBelow": "Type Your Current password below", "typeCurrentPasswordBelow": "Type Your Current password below",
"currentPassword": "Current password", "currentPassword": "Current password",
"concurrentReports": "Concurrent Reports",
"profile": { "profile": {
"reset_password": { "reset_password": {
"label": "Reset Password", "label": "Reset Password",

@ -424,6 +424,7 @@ abstract class LocaleKeys {
static const skip = 'skip'; static const skip = 'skip';
static const typeCurrentPasswordBelow = 'typeCurrentPasswordBelow'; static const typeCurrentPasswordBelow = 'typeCurrentPasswordBelow';
static const currentPassword = 'currentPassword'; static const currentPassword = 'currentPassword';
static const concurrentReports = 'concurrentReports';
static const profile_reset_password_label = 'profile.reset_password.label'; static const profile_reset_password_label = 'profile.reset_password.label';
static const profile_reset_password_username = 'profile.reset_password.username'; static const profile_reset_password_username = 'profile.reset_password.username';
static const profile_reset_password_password = 'profile.reset_password.password'; static const profile_reset_password_password = 'profile.reset_password.password';

@ -28,9 +28,7 @@ Logger logger = Logger(
class MyHttpOverrides extends HttpOverrides { class MyHttpOverrides extends HttpOverrides {
@override @override
HttpClient createHttpClient(SecurityContext? context) { HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context) return super.createHttpClient(context)..badCertificateCallback = (X509Certificate cert, String host, int port) => true;
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
} }
} }
@ -86,11 +84,9 @@ class MyApp extends StatelessWidget {
DeviceType deviceType, DeviceType deviceType,
) { ) {
PostParamsModel? obj = AppState().postParamsObject; PostParamsModel? obj = AppState().postParamsObject;
obj?.languageID = obj?.languageID = EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2;
EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2;
AppState().setPostParamsModel(obj!); AppState().setPostParamsModel(obj!);
List<LocalizationsDelegate<dynamic>> delegates = List<LocalizationsDelegate<dynamic>> delegates = context.localizationDelegates;
context.localizationDelegates;
// delegates.add(GlobalMaterialLocalizations.delegate); // delegates.add(GlobalMaterialLocalizations.delegate);
delegates.add( delegates.add(
MonthYearPickerLocalizations.delegate, MonthYearPickerLocalizations.delegate,

@ -61,6 +61,7 @@ import 'package:mohem_flutter_app/models/mowadhafhi/get_tickets_list.dart';
import 'package:mohem_flutter_app/models/my_requests/get_ccp_dff_structure_model.dart'; import 'package:mohem_flutter_app/models/my_requests/get_ccp_dff_structure_model.dart';
import 'package:mohem_flutter_app/models/my_requests/get_ccp_output_model.dart'; import 'package:mohem_flutter_app/models/my_requests/get_ccp_output_model.dart';
import 'package:mohem_flutter_app/models/my_requests/get_ccp_transactions_model.dart'; import 'package:mohem_flutter_app/models/my_requests/get_ccp_transactions_model.dart';
import 'package:mohem_flutter_app/models/my_requests/get_ccp_transations_list_model.dart';
import 'package:mohem_flutter_app/models/my_requests/get_concurrent_programs_model.dart'; import 'package:mohem_flutter_app/models/my_requests/get_concurrent_programs_model.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/models/my_team/get_subordinates_leaves_total_vacations_list_model.dart'; import 'package:mohem_flutter_app/models/my_team/get_subordinates_leaves_total_vacations_list_model.dart';
@ -342,7 +343,7 @@ class GenericResponseModel {
SubmitAddressTransaction? submitAddressTransactionList; SubmitAddressTransaction? submitAddressTransactionList;
SubmitBasicDetailsTransactionList? submitBasicDetTransactionList; SubmitBasicDetailsTransactionList? submitBasicDetTransactionList;
String? submitCEITransactionList; String? submitCEITransactionList;
String? submitCcpTransactionList; SubmitCcpTransactionList? submitCcpTransactionList;
SubmitContactTransactionList? submitContactTransactionList; SubmitContactTransactionList? submitContactTransactionList;
SubmitEITTransactionList? submitEITTransactionList; SubmitEITTransactionList? submitEITTransactionList;
String? submitHrTransactionList; String? submitHrTransactionList;
@ -1298,7 +1299,10 @@ class GenericResponseModel {
submitAddressTransactionList = json['SubmitAddressTransactionList'] != null ? SubmitAddressTransaction.fromJson(json['SubmitAddressTransactionList']) : null; submitAddressTransactionList = json['SubmitAddressTransactionList'] != null ? SubmitAddressTransaction.fromJson(json['SubmitAddressTransactionList']) : null;
submitBasicDetTransactionList = json['SubmitBasicDetTransactionList'] != null ? SubmitBasicDetailsTransactionList.fromJson(json['SubmitBasicDetTransactionList']) : null; submitBasicDetTransactionList = json['SubmitBasicDetTransactionList'] != null ? SubmitBasicDetailsTransactionList.fromJson(json['SubmitBasicDetTransactionList']) : null;
submitCEITransactionList = json['SubmitCEITransactionList']; submitCEITransactionList = json['SubmitCEITransactionList'];
submitCcpTransactionList = json['SubmitCcpTransactionList']; submitCcpTransactionList = json['SubmitCcpTransactionList'] != null
? new SubmitCcpTransactionList.fromJson(
json['SubmitCcpTransactionList'])
: null;
submitContactTransactionList = json['SubmitContactTransactionList'] != null ? SubmitContactTransactionList.fromJson(json['SubmitContactTransactionList']) : null; submitContactTransactionList = json['SubmitContactTransactionList'] != null ? SubmitContactTransactionList.fromJson(json['SubmitContactTransactionList']) : null;
submitEITTransactionList = json['SubmitEITTransactionList'] != null ? SubmitEITTransactionList.fromJson(json['SubmitEITTransactionList']) : null; submitEITTransactionList = json['SubmitEITTransactionList'] != null ? SubmitEITTransactionList.fromJson(json['SubmitEITTransactionList']) : null;
@ -1753,7 +1757,10 @@ class GenericResponseModel {
} }
data['SubmitCEITransactionList'] = this.submitCEITransactionList; data['SubmitCEITransactionList'] = this.submitCEITransactionList;
data['SubmitCcpTransactionList'] = this.submitCcpTransactionList; if (this.submitCcpTransactionList != null) {
data['SubmitCcpTransactionList'] =
this.submitCcpTransactionList!.toJson();
}
data['SubmitContactTransactionList'] = this.submitContactTransactionList; data['SubmitContactTransactionList'] = this.submitContactTransactionList;
if (this.submitEITTransactionList != null) { if (this.submitEITTransactionList != null) {

@ -168,7 +168,7 @@ class ItemCreationLines {
int? tOROWNUM; int? tOROWNUM;
int? tRANSACTIONHEADERID; int? tRANSACTIONHEADERID;
int? tRANSACTIONLINEID; int? tRANSACTIONLINEID;
int? uNITPRICE; num? uNITPRICE;
String? uSERMANUFACTURERNAME; String? uSERMANUFACTURERNAME;
String? uSERMFGPARTNUM; String? uSERMFGPARTNUM;

@ -7,11 +7,11 @@ class GetPoItemHistoryList {
int? dISCOUNTPERCENTAGE; int? dISCOUNTPERCENTAGE;
int? fROMROWNUM; int? fROMROWNUM;
int? iTEMID; int? iTEMID;
int? nETPRICE; num? nETPRICE;
int? nOOFROWS; int? nOOFROWS;
String? oUNAME; String? oUNAME;
String? pONUMBER; String? pONUMBER;
int? pURCHASEPRICE; num? pURCHASEPRICE;
int? qUANTITYORDERED; int? qUANTITYORDERED;
int? qUANTITYRECEIVED; int? qUANTITYRECEIVED;
int? rEVISIONNUM; int? rEVISIONNUM;

@ -160,11 +160,11 @@ class POLines {
int? pOHEADERID; int? pOHEADERID;
String? pROMISEDDATE; String? pROMISEDDATE;
String? pRNUM; String? pRNUM;
int? qUANTITY; num? qUANTITY;
String? rEQUESTOR; String? rEQUESTOR;
int? rOWNUM; int? rOWNUM;
int? tOROWNUM; int? tOROWNUM;
int? uNITPRICE; num? uNITPRICE;
String? uOM; String? uOM;
POLines( POLines(

@ -8,8 +8,8 @@ class GetQuotationAnalysisList {
int? qUOTLINETOTAL; int? qUOTLINETOTAL;
String? qUOTMFGPARTNUM; String? qUOTMFGPARTNUM;
String? qUOTNUM; String? qUOTNUM;
int? qUOTQTY; num? qUOTQTY;
int? qUOTUNITPRICE; num? qUOTUNITPRICE;
String? qUOTUOM; String? qUOTUOM;
String? rFQNUM; String? rFQNUM;
int? rFQQTY; int? rFQQTY;

@ -0,0 +1,21 @@
class ITGWorkListTableModel {
String? label;
String? isTable;
String? textvalue;
ITGWorkListTableModel({this.label, this.isTable, this.textvalue});
ITGWorkListTableModel.fromJson(Map<String, dynamic> json) {
label = json['label'];
isTable = json['isTable'];
textvalue = json['textvalue'];
}
Map<String, dynamic> toJson() {
Map<String, dynamic> data = new Map<String, dynamic>();
data['label'] = this.label;
data['isTable'] = this.isTable;
data['textvalue'] = this.textvalue;
return data;
}
}

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

@ -19,6 +19,7 @@ import 'package:mohem_flutter_app/models/dashboard/mohemm_itg_pending_task_respo
import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart'; import 'package:mohem_flutter_app/models/itg/itg_response_model.dart';
import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart'; import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart';
import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart';
/// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for the devtool /// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for the devtool
// ignore: prefer_mixin // ignore: prefer_mixin
@ -102,7 +103,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
DrawerMenuItem("assets/images/drawer/performance_evaluation.svg", LocaleKeys.performanceEvaluation.tr(), AppRoutes.performanceEvaluation), DrawerMenuItem("assets/images/drawer/performance_evaluation.svg", LocaleKeys.performanceEvaluation.tr(), AppRoutes.performanceEvaluation),
DrawerMenuItem("assets/images/drawer/mowadhafi.svg", LocaleKeys.mowadhafhi.tr(), AppRoutes.mowadhafhi), DrawerMenuItem("assets/images/drawer/mowadhafi.svg", LocaleKeys.mowadhafhi.tr(), AppRoutes.mowadhafhi),
DrawerMenuItem("assets/images/drawer/pending_trasactions.svg", LocaleKeys.pendingTransactions.tr(), AppRoutes.pendingTransactions), DrawerMenuItem("assets/images/drawer/pending_trasactions.svg", LocaleKeys.pendingTransactions.tr(), AppRoutes.pendingTransactions),
DrawerMenuItem("assets/images/drawer/pending_trasactions.svg", LocaleKeys.brainMarathon.tr(), AppRoutes.marathonIntroScreen), DrawerMenuItem("assets/images/drawer/drawer_marathon.svg", LocaleKeys.brainMarathon.tr(), AppRoutes.marathonIntroScreen),
DrawerMenuItem("assets/images/drawer/change_password.svg", LocaleKeys.changePassword.tr(), AppRoutes.changePassword), DrawerMenuItem("assets/images/drawer/change_password.svg", LocaleKeys.changePassword.tr(), AppRoutes.changePassword),
]; ];
@ -151,7 +152,18 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
logger.wtf(ex); logger.wtf(ex);
if (showLoading) Utils.hideLoading(context); if (showLoading) Utils.hideLoading(context);
notifyListeners(); notifyListeners();
Utils.handleException(ex, context, null); Utils.handleException(ex, context, (err) {
Utils.hideLoading(context);
showDialog(
context: context,
builder: (cxt) => ConfirmDialog(
message: err,
onTap: () {
Navigator.pushNamedAndRemoveUntil(cxt, AppRoutes.login, (Route<dynamic> route) => false);
},
),
);
});
} }
} }

@ -430,6 +430,7 @@ class _AddVacationRuleScreenState extends State<AddVacationRuleScreen> {
onTap: () { onTap: () {
showMyBottomSheet( showMyBottomSheet(
context, context,
callBackFunc: (){},
child: SearchEmployeeBottomSheet( child: SearchEmployeeBottomSheet(
title: LocaleKeys.searchForEmployee.tr(), title: LocaleKeys.searchForEmployee.tr(),
apiMode: LocaleKeys.delegate.tr(), apiMode: LocaleKeys.delegate.tr(),

@ -160,6 +160,7 @@ class _ChatHomeScreenState extends State<ChatHomeScreen> {
// .getChatMemberFromSearch("aamir.muhammad", 36239); // .getChatMemberFromSearch("aamir.muhammad", 36239);
showMyBottomSheet( showMyBottomSheet(
context, context,
callBackFunc: (){},
child: SearchEmployeeBottomSheet( child: SearchEmployeeBottomSheet(
title: LocaleKeys.searchForEmployee.tr(), title: LocaleKeys.searchForEmployee.tr(),
apiMode: LocaleKeys.delegate.tr(), apiMode: LocaleKeys.delegate.tr(),

@ -1,10 +1,10 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
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_countdown_timer/flutter_countdown_timer.dart'; import 'package:flutter_countdown_timer/flutter_countdown_timer.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:mohem_flutter_app/api/dashboard_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/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';
@ -13,17 +13,13 @@ 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/itg/itg_response_model.dart';
import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart'; import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/dialogs/success_dialog.dart';
import 'package:mohem_flutter_app/ui/landing/itg/video_page.dart';
import 'package:mohem_flutter_app/ui/landing/widget/app_drawer.dart'; import 'package:mohem_flutter_app/ui/landing/widget/app_drawer.dart';
import 'package:mohem_flutter_app/ui/landing/widget/menus_widget.dart'; import 'package:mohem_flutter_app/ui/landing/widget/menus_widget.dart';
import 'package:mohem_flutter_app/ui/landing/widget/services_widget.dart'; import 'package:mohem_flutter_app/ui/landing/widget/services_widget.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_banner.dart'; import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_banner.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart';
import 'package:mohem_flutter_app/widgets/mark_attendance_widget.dart'; 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';
@ -268,10 +264,11 @@ class _DashboardScreenState extends State<DashboardScreen> {
bottomLeft: AppState().isArabic(context) ? Radius.circular(15) : Radius.circular(0), bottomLeft: AppState().isArabic(context) ? Radius.circular(15) : Radius.circular(0),
), ),
), ),
child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/play.svg" : "assets/images/stop.svg"), child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/attendance.svg" : "assets/images/attendance.svg"),
).onPress(() { ).onPress(() {
showMyBottomSheet( showMyBottomSheet(
context, context,
callBackFunc: (){},
child: MarkAttendanceWidget(model, isFromDashboard: true), child: MarkAttendanceWidget(model, isFromDashboard: true),
); );
}), }),

@ -95,64 +95,76 @@ class _TodayAttendanceScreenState extends State<TodayAttendanceScreen> {
? Center(child: CircularProgressIndicator()) ? Center(child: CircularProgressIndicator())
: Column( : Column(
children: [ children: [
Container( Expanded(
width: double.infinity, flex: 2,
color: MyColors.backgroundBlackColor, child: Container(
padding: EdgeInsets.only(top: 4, left: 21, right: 21, bottom: 21), width: double.infinity,
child: Column( color: MyColors.backgroundBlackColor,
crossAxisAlignment: CrossAxisAlignment.start, padding: EdgeInsets.only(top: 4, left: 21, right: 21, bottom: 21),
children: [ child: Column(
DateUtil.getWeekDayMonthDayYearDateFormatted(DateTime.now(), "en").toText24(isBold: true, color: Colors.white), crossAxisAlignment: CrossAxisAlignment.start,
LocaleKeys.timeLeftToday.tr().toText16(color: Color(0xffACACAC)), children: [
//21.height, DateUtil.getWeekDayMonthDayYearDateFormatted(DateTime.now(), "en").toText24(isBold: true, color: Colors.white),
Center( LocaleKeys.timeLeftToday.tr().toText16(color: Color(0xffACACAC)),
child: AspectRatio( Center(
aspectRatio: 265 / 265, child: AspectRatio(
child: CircularStepProgressBar( aspectRatio: 265 / 265,
totalSteps: 16 * 4, child: CircularStepProgressBar(
currentStep: (model.progress * 100).toInt(), totalSteps: 16 * 4,
//width: 216, currentStep: (model.progress * 100).toInt(),
// height: 216, selectedColor: MyColors.gradiantEndColor,
selectedColor: MyColors.gradiantEndColor, unselectedColor: MyColors.grey70Color,
unselectedColor: MyColors.grey70Color, child: Center(
child: Center( child: Padding(
child: Column( padding: const EdgeInsets.all(21.0),
mainAxisSize: MainAxisSize.min, child: Column(
children: [ mainAxisSize: MainAxisSize.min,
CountdownTimer( children: [
endTime: model.endTime, CountdownTimer(
onEnd: null, endTime: model.endTime,
endWidget: "00:00:00".toText32(color: Colors.white, isBold: true), widgetBuilder: (context, v) {
textStyle: TextStyle(color: Colors.white, fontSize: 32, letterSpacing: -1.92, fontWeight: FontWeight.bold, height: 1), return AutoSizeText(
getValue(v?.hours) + " : " + getValue(v?.min) + " : " + getValue(v?.sec),
maxLines: 1,
style: TextStyle(color: Colors.white, fontSize: 42, letterSpacing: -1.92, fontWeight: FontWeight.bold, height: 1),
);
},
onEnd: null,
endWidget: "00:00:00".toTextAuto(color: Colors.white, isBold: true, fontSize: 30, letterSpacing: -1.92),
textStyle: TextStyle(color: Colors.white, fontSize: 30, letterSpacing: -1.92, fontWeight: FontWeight.bold, height: 1),
).center.expanded,
LocaleKeys.shiftTime.tr().tr().toTextAuto(color: MyColors.greyACColor, fontSize: 18, maxLine: 1),
(model.attendanceTracking!.pShtName ?? "00:00:00").toString().toTextAuto(color: Colors.white, isBold: true, fontSize: 26, maxLine: 1),
],
), ),
19.height, ),
LocaleKeys.shiftTime.tr().tr().toText12(color: MyColors.greyACColor),
(model.attendanceTracking!.pShtName ?? "00:00:00").toString().toText22(color: Colors.white, isBold: true),
],
), ),
), ),
), ).paddingAll(12),
).paddingAll(21), ).expanded,
).expanded, ],
),
],
), ),
).expanded, ),
Center( Center(
child: Container( child: Container(
// color: MyColors.backgroundBlackColor,
decoration: const BoxDecoration( decoration: const BoxDecoration(
borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)),
gradient: LinearGradient(transform: GradientRotation(.64), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [ gradient: LinearGradient(
MyColors.gradiantEndColor, transform: GradientRotation(.64),
MyColors.gradiantStartColor, begin: Alignment.topRight,
]), end: Alignment.bottomLeft,
colors: [
MyColors.gradiantEndColor,
MyColors.gradiantStartColor,
],
),
), ),
child: Column( child: Column(
children: [ children: [
Container( Container(
//height: 187, //height: 187,
padding: const EdgeInsets.only(left: 31, right: 31, top: 31, bottom: 16), padding: const EdgeInsets.only(left: 21, right: 21, top: 21, bottom: 16),
decoration: const BoxDecoration( decoration: const BoxDecoration(
borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)),
gradient: LinearGradient(transform: GradientRotation(.64), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [ gradient: LinearGradient(transform: GradientRotation(.64), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [
@ -179,80 +191,7 @@ class _TodayAttendanceScreenState extends State<TodayAttendanceScreen> {
), ),
), //.expanded, ), //.expanded,
MarkAttendanceWidget(model, topPadding: 24), MarkAttendanceWidget(model, topPadding: 21),
// Container(
// width: double.infinity,
// decoration: BoxDecoration(borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), color: Colors.white),
// // margin: EdgeInsets.only(top: 187 - 31),
// padding: EdgeInsets.only(left: 21, right: 21, top: 24, bottom: 24),
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// mainAxisSize: MainAxisSize.min,
// children: [
// LocaleKeys.markAttendance.tr().toSectionHeading(),
// LocaleKeys.selectMethodOfAttendance.tr().tr().toText11(color: Color(0xff535353)),
// 24.height,
// GridView(
// physics: const NeverScrollableScrollPhysics(),
// shrinkWrap: true,
// padding: EdgeInsets.zero,
// gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 1 / 1, crossAxisSpacing: 8, mainAxisSpacing: 8),
// children: <Widget>[
// if (isNfcEnabled)
// attendanceMethod("NFC", "assets/images/nfc.svg", isNfcEnabled, () {
// if (isNfcLocationEnabled) {
// Location.getCurrentLocation((LatLng? latlng) {
// performNfcAttendance(model, lat: latlng?.latitude.toString() ?? "", lng: latlng?.longitude.toString() ?? "");
// });
// } else {
// performNfcAttendance(model);
// }
// }),
// if (isWifiEnabled)
// attendanceMethod("Wifi", "assets/images/wufu.svg", isWifiEnabled, () {
// if (isWifiLocationEnabled) {
// Location.getCurrentLocation((LatLng? latlng) {
// performWifiAttendance(model, lat: latlng?.latitude.toString() ?? "", lng: latlng?.longitude.toString() ?? "");
// });
// } else {
// performWifiAttendance(model);
// }
// // connectWifi();
// }),
// if (isQrEnabled)
// attendanceMethod("QR", "assets/images/ic_qr.svg", isQrEnabled, () async {
// if (isQrLocationEnabled) {
// Location.getCurrentLocation((LatLng? latlng) {
// performQrCodeAttendance(model, lat: latlng?.latitude.toString() ?? "", lng: latlng?.longitude.toString() ?? "");
// });
// } else {
// performQrCodeAttendance(model);
// }
// // performQrCodeAttendance(model);
// }),
// ],
// )
// ],
// ),
// ),
// Positioned(
// top: 187 - 21,
// child: Container(
// padding: EdgeInsets.only(left: 31, right: 31, top: 31, bottom: 16),
// decoration: BoxDecoration(borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), color: Colors.white),
// child: Column(
// children: [
// Row(
// children: [commonStatusView("Check In", "09:27"), commonStatusView("Check Out", "- - : - -")],
// ),
// 21.height,
// Row(
// children: [commonStatusView("Late In", "00:27"), commonStatusView("Regular", "08:00")],
// ),
// ],
// ),
// ),
// ),
], ],
), ),
), ),
@ -265,60 +204,6 @@ class _TodayAttendanceScreenState extends State<TodayAttendanceScreen> {
); );
} }
// Future<void> performNfcAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async {
// if (isNfcLocationEnabled) {
// print("nfc location enabled");
// } else {
// print("nfc not location enabled");
// }
//
// showNfcReader(context, onNcfScan: (String? nfcId) async {
// print(nfcId);
// Utils.showLoading(context);
// try {
// GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 2, nfcValue: nfcId ?? "", isGpsRequired: isNfcLocationEnabled, lat: lat, long: lng);
// bool status = await model.fetchAttendanceTracking(context);
// Utils.hideLoading(context);
// } catch (ex) {
// print(ex);
// Utils.hideLoading(context);
// Utils.handleException(ex, context, (msg) {
// Utils.confirmDialog(context, msg);
// });
// }
// });
// }
//
// Future<void> performWifiAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async {
// if (isWifiLocationEnabled) {
// print("wifi location enabled");
// } else {
// print("wifi not location enabled");
// }
//
// bool v = await WiFiForIoTPlugin.connect(AppState().mohemmWifiSSID ?? "", password: AppState().mohemmWifiPassword ?? "", joinOnce: true, security: NetworkSecurity.WPA, withInternet: false);
// if (v) {
// await WiFiForIoTPlugin.forceWifiUsage(true);
// print("connected");
// Utils.showLoading(context);
// try {
// GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 3, nfcValue: "", isGpsRequired: isWifiLocationEnabled, lat: lat, long: lng);
// bool status = await model.fetchAttendanceTracking(context);
// Utils.hideLoading(context);
// await closeWifiRequest();
// } catch (ex) {
// print(ex);
// await closeWifiRequest();
// Utils.hideLoading(context);
// Utils.handleException(ex, context, (msg) {
// Utils.confirmDialog(context, msg);
// });
// }
// } else {
// Utils.confirmDialog(context, LocaleKeys.comeNearHMGWifi.tr());
// }
// }
String getValue(int? v) { String getValue(int? v) {
if (v == null) { if (v == null) {
return "00"; return "00";
@ -335,63 +220,6 @@ class _TodayAttendanceScreenState extends State<TodayAttendanceScreen> {
return v; return v;
} }
// Future<void> performQrCodeAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async {
// var qrCodeValue = await Navigator.of(context).push(
// MaterialPageRoute(
// builder: (context) => QrScannerDialog(),
// ),
// );
// if (qrCodeValue != null) {
// print("qrCode: " + qrCodeValue);
// Utils.showLoading(context);
// try {
// GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 1, isGpsRequired: isQrLocationEnabled, lat: lat, long: lng, QRValue: qrCodeValue);
// bool status = await model.fetchAttendanceTracking(context);
// Utils.hideLoading(context);
// } catch (ex) {
// print(ex);
// Utils.hideLoading(context);
// Utils.handleException(ex, context, (msg) {
// Utils.confirmDialog(context, msg);
// });
// }
// }
// }
//
// Widget attendanceMethod(String title, String image, bool isEnabled, VoidCallback onPress) => Container(
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(15),
// gradient: const LinearGradient(transform: GradientRotation(.64), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [
// MyColors.gradiantEndColor,
// MyColors.gradiantStartColor,
// ]),
// ),
// clipBehavior: Clip.antiAlias,
// child: Stack(
// children: [
// Container(
// padding: const EdgeInsets.only(left: 10, right: 10, top: 14, bottom: 14),
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// SvgPicture.asset(
// image,
// color: Colors.white,
// ).expanded,
// title.toText17(isBold: true, color: Colors.white),
// ],
// ),
// ),
// if (!isEnabled)
// Container(
// width: double.infinity,
// height: double.infinity,
// color: Colors.grey.withOpacity(0.7),
// )
// ],
// ),
// ).onPress(onPress);
Widget commonStatusView(String title, String time) => Expanded( Widget commonStatusView(String title, String time) => Expanded(
child: Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ child: Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [
title.toText12(color: Colors.white.withOpacity(.69)), title.toText12(color: Colors.white.withOpacity(.69)),

@ -0,0 +1,214 @@
import 'package:auto_size_text/auto_size_text.dart';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'package:flutter_countdown_timer/flutter_countdown_timer.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/date_uitl.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/widgets/circular_step_progress_bar.dart';
import 'package:mohem_flutter_app/widgets/mark_attendance_widget.dart';
import 'package:nfc_manager/nfc_manager.dart';
import 'package:provider/provider.dart';
import 'package:wifi_iot/wifi_iot.dart';
class TodayAttendanceScreen2 extends StatefulWidget {
TodayAttendanceScreen2({Key? key}) : super(key: key);
@override
_TodayAttendanceScreenState createState() {
return _TodayAttendanceScreenState();
}
}
class _TodayAttendanceScreenState extends State<TodayAttendanceScreen2> {
ValueNotifier<dynamic> result = ValueNotifier(null);
late DashboardProviderModel data;
@override
void initState() {
super.initState();
data = Provider.of<DashboardProviderModel>(context, listen: false);
}
@override
void dispose() {
super.dispose();
// Stop Session
NfcManager.instance.stopSession();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: MyColors.backgroundBlackColor,
leading: IconButton(
icon: const Icon(Icons.arrow_back_ios, color: Colors.white),
onPressed: () => Navigator.pop(context),
),
actions: [
IconButton(
onPressed: () {
data.fetchAttendanceTracking(context);
},
icon: const Icon(
Icons.ac_unit,
color: Colors.white,
),
)
],
),
backgroundColor: MyColors.backgroundBlackColor,
body: Consumer<DashboardProviderModel>(
builder: (context, model, child) {
return (model.isAttendanceTrackingLoading
? Center(child: CircularProgressIndicator())
: Column(
children: [
Container(
width: double.infinity,
color: MyColors.backgroundBlackColor,
padding: EdgeInsets.only(top: 1, left: 21, right: 21, bottom: 21),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
DateUtil.getWeekDayMonthDayYearDateFormatted(DateTime.now(), "en").toText24(isBold: true, color: Colors.white),
LocaleKeys.timeLeftToday.tr().toText16(color: Color(0xffACACAC)),
Center(
child: Container(
margin: EdgeInsets.only(left: 21, right: 21, top: 18),
child: AspectRatio(
aspectRatio: 1,
child: CircularStepProgressBar(
totalSteps: 16 * 4,
currentStep: (model.progress * 100).toInt(),
selectedColor: MyColors.gradiantEndColor,
unselectedColor: MyColors.grey70Color,
child: Center(
child: Padding(
padding: const EdgeInsets.all(21.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Expanded(
flex: 1,
child: CountdownTimer(
endTime: model.endTime,
widgetBuilder: (context, v) {
return AutoSizeText(
getValue(v?.hours) + " : " + getValue(v?.min) + " : " + getValue(v?.sec),
maxLines: 1,
style: const TextStyle(color: Colors.white, fontSize: 42, letterSpacing: -1.92, fontWeight: FontWeight.bold, height: 1),
);
},
onEnd: null,
endWidget: "00:00:00".toTextAuto(color: Colors.white, isBold: true, fontSize: 30, letterSpacing: -1.92),
textStyle: const TextStyle(color: Colors.white, fontSize: 30, letterSpacing: -1.92, fontWeight: FontWeight.bold, height: 1),
).center,
),
Expanded(
flex: 1,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
LocaleKeys.shiftTime.tr().tr().toTextAuto(color: MyColors.greyACColor, fontSize: 18, maxLine: 1).paddingOnly(left: 21,right: 21),
(model.attendanceTracking!.pShtName ?? "00:00:00").toString().toTextAuto(color: Colors.white, isBold: true, fontSize: 26, maxLine: 1),
],
),
)
],
),
),
),
),
),
),
).expanded,
],
),
).toExpanded(flex: 2),
Center(
child: Container(
decoration: const BoxDecoration(
borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)),
gradient: LinearGradient(
transform: GradientRotation(.64),
begin: Alignment.topRight,
end: Alignment.bottomLeft,
colors: [
MyColors.gradiantEndColor,
MyColors.gradiantStartColor,
],
),
),
child: Column(
children: [
Container(
padding: const EdgeInsets.only(left: 21, right: 21, top: 21, bottom: 16),
decoration: const BoxDecoration(
borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)),
gradient: LinearGradient(transform: GradientRotation(.64), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [
MyColors.gradiantEndColor,
MyColors.gradiantStartColor,
]),
),
child: Column(
children: [
Row(
children: [
commonStatusView(LocaleKeys.checkIn.tr(), (model.attendanceTracking!.pSwipeIn) ?? "- - : - -"),
commonStatusView(LocaleKeys.checkOut.tr(), (model.attendanceTracking!.pSwipeOut) ?? "- - : - -")
],
),
21.height,
Row(
children: [
commonStatusView(LocaleKeys.lateIn.tr(), (model.attendanceTracking!.pLateInHours) ?? "- - : - -"),
commonStatusView(LocaleKeys.regular.tr(), (model.attendanceTracking!.pScheduledHours) ?? "- - : - -")
],
),
],
),
), //.expanded,
MarkAttendanceWidget(model, topPadding: 21),
],
),
),
)
],
))
.animatedSwither();
},
),
);
}
String getValue(int? v) {
if (v == null) {
return "00";
} else if (v.toString().length == 1) {
return "0" + v.toString();
} else {
return v.toString();
}
}
Future<bool> closeWifiRequest() async {
await WiFiForIoTPlugin.forceWifiUsage(false);
bool v = await WiFiForIoTPlugin.disconnect();
return v;
}
Widget commonStatusView(String title, String time) => Expanded(
child: Column(mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [
title.toText12(color: Colors.white.withOpacity(.69)),
time.toText22(color: Colors.white, isBold: true),
]),
);
}

@ -221,6 +221,7 @@ class _AddLeaveBalanceScreenState extends State<AddLeaveBalanceScreen> {
onTap: () { onTap: () {
showMyBottomSheet( showMyBottomSheet(
context, context,
callBackFunc: (){},
child: SearchEmployeeBottomSheet( child: SearchEmployeeBottomSheet(
title: LocaleKeys.searchForEmployee.tr(), title: LocaleKeys.searchForEmployee.tr(),
apiMode: LocaleKeys.delegate.tr(), apiMode: LocaleKeys.delegate.tr(),

@ -11,7 +11,7 @@ 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/ui/marathon/marathon_provider.dart'; import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/countdown_timer.dart'; import 'package:mohem_flutter_app/ui/marathon/widgets/countdown_timer.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_header.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:provider/provider.dart'; import 'package:provider/provider.dart';
@ -24,18 +24,20 @@ class MarathonIntroScreen extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
MarathonProvider provider = context.watch<MarathonProvider>(); MarathonProvider provider = context.watch<MarathonProvider>();
return Scaffold( return Scaffold(
appBar: AppBarWidget(context, title: LocaleKeys.brainMarathon.tr()),
body: Stack( body: Stack(
children: <Widget>[ children: <Widget>[
SingleChildScrollView( SingleChildScrollView(
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
const MarathonHeader(),
MarathonDetailsCard(provider: provider).paddingAll(15), MarathonDetailsCard(provider: provider).paddingAll(15),
MarathonTimerCard( MarathonTimerCard(
provider: provider, provider: provider,
timeToMarathon: dummyEndTime, timeToMarathon: dummyEndTime,
).paddingOnly(left: 15, right: 15, bottom: 15), ).paddingOnly(left: 15, right: 15, bottom: 15),
const SizedBox(height: 100,), const SizedBox(
height: 100,
),
], ],
), ),
), ),
@ -52,8 +54,7 @@ class MarathonIntroScreen extends StatelessWidget {
class MarathonDetailsCard extends StatelessWidget { class MarathonDetailsCard extends StatelessWidget {
final MarathonProvider provider; final MarathonProvider provider;
const MarathonDetailsCard({Key? key, required this.provider}) const MarathonDetailsCard({Key? key, required this.provider}) : super(key: key);
: super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -68,17 +69,12 @@ class MarathonDetailsCard extends StatelessWidget {
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
LocaleKeys.contestTopicAbout LocaleKeys.contestTopicAbout.tr().toText16(color: MyColors.grey77Color),
.tr() "Saudi Arabia".toText20(color: MyColors.textMixColor, isBold: true),
.toText16(color: MyColors.grey77Color),
"Saudi Arabia"
.toText20(color: MyColors.textMixColor, isBold: true),
Row( Row(
children: <Widget>[ children: <Widget>[
Flexible( Flexible(
child: child: "Nam suscipit turpis in pharetra euismsdef. Duis rutrum at nulla id aliquam".toText14(color: MyColors.grey77Color),
"Nam suscipit turpis in pharetra euismsdef. Duis rutrum at nulla id aliquam"
.toText14(color: MyColors.grey77Color),
) )
], ],
), ),
@ -86,31 +82,25 @@ class MarathonDetailsCard extends StatelessWidget {
5.height, 5.height,
Row( Row(
children: <Widget>[ children: <Widget>[
LocaleKeys.prize LocaleKeys.prize.tr().toText16(color: MyColors.grey77Color, isBold: true),
.tr() " LED 55\" Android TV".toText16(color: MyColors.greenColor, isBold: true),
.toText16(color: MyColors.grey77Color, isBold: true),
" LED 55\" Android TV"
.toText16(color: MyColors.greenColor, isBold: true),
], ],
), ),
Row( Row(
children: <Widget>[ children: <Widget>[
LocaleKeys.sponsoredBy LocaleKeys.sponsoredBy.tr().toText16(color: MyColors.grey77Color),
.tr() " Extra".toText16(color: MyColors.darkTextColor, isBold: true),
.toText16(color: MyColors.grey77Color),
" Extra"
.toText16(color: MyColors.darkTextColor, isBold: true),
], ],
), ),
10.height, 10.height,
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[ children: <Widget>[
Image.network( Image.asset(
"https://cdn.pixabay.com/photo/2014/08/27/07/53/blog-428950_1280.jpg", "assets/images/logos/main_mohemm_logo.png",
height: 50, height: 40,
fit: BoxFit.fill, fit: BoxFit.fill,
width: 120, width: 150,
) )
], ],
), ),
@ -144,8 +134,7 @@ class MarathonTimerCard extends StatelessWidget {
Row( Row(
children: <Widget>[ children: <Widget>[
LocaleKeys.gameDate.tr().toText16(color: MyColors.grey77Color), LocaleKeys.gameDate.tr().toText16(color: MyColors.grey77Color),
" 10 Oct, 2022" " 10 Oct, 2022".toText16(color: MyColors.darkTextColor, isBold: true),
.toText16(color: MyColors.darkTextColor, isBold: true),
], ],
), ),
Row( Row(
@ -156,7 +145,7 @@ class MarathonTimerCard extends StatelessWidget {
), ),
Lottie.asset( Lottie.asset(
MyLottieConsts.hourGlassLottie, MyLottieConsts.hourGlassLottie,
height: 140, height: 200,
), ),
BuildCountdownTimer( BuildCountdownTimer(
timeToMarathon: timeToMarathon, timeToMarathon: timeToMarathon,

@ -2,7 +2,9 @@ import 'dart:async';
import 'package:appinio_swiper/appinio_swiper.dart'; import 'package:appinio_swiper/appinio_swiper.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/question_card.dart';
class MarathonProvider extends ChangeNotifier { class MarathonProvider extends ChangeNotifier {
final AppinioSwiperController swiperController = AppinioSwiperController(); final AppinioSwiperController swiperController = AppinioSwiperController();
@ -41,11 +43,18 @@ class MarathonProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
void resetAll() {
isSelectedOptions[0] = false;
isSelectedOptions[1] = false;
isSelectedOptions[2] = false;
isSelectedOptions[3] = false;
}
Timer timerU = Timer.periodic(const Duration(seconds: 1), (Timer timer) {}); Timer timerU = Timer.periodic(const Duration(seconds: 1), (Timer timer) {});
int start = 5; int start = 8;
void startTimer(BuildContext context) { void startTimer(BuildContext context) {
start = 5; start = 8;
const Duration oneSec = Duration(seconds: 1); const Duration oneSec = Duration(seconds: 1);
timerU = Timer.periodic( timerU = Timer.periodic(
oneSec, oneSec,
@ -66,9 +75,10 @@ class MarathonProvider extends ChangeNotifier {
return; return;
} }
swipeCardLeft(); resetAll();
timer.cancel(); timer.cancel();
cancelTimer(); cancelTimer();
swipeCardLeft();
} else { } else {
start--; start--;
} }

@ -13,8 +13,8 @@ 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/ui/marathon/marathon_provider.dart'; import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/custom_status_widget.dart'; import 'package:mohem_flutter_app/ui/marathon/widgets/custom_status_widget.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_header.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/question_card.dart'; import 'package:mohem_flutter_app/ui/marathon/widgets/question_card.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:steps_indicator/steps_indicator.dart'; import 'package:steps_indicator/steps_indicator.dart';
@ -25,11 +25,11 @@ class MarathonScreen extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
MarathonProvider provider = context.watch<MarathonProvider>(); MarathonProvider provider = context.watch<MarathonProvider>();
return Scaffold( return Scaffold(
appBar: AppBarWidget(context, title: LocaleKeys.brainMarathon.tr()),
body: SingleChildScrollView( body: SingleChildScrollView(
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
const MarathonHeader(), 20.height,
20.height,
MarathonProgressContainer(provider: provider).paddingOnly(left: 21, right: 21), MarathonProgressContainer(provider: provider).paddingOnly(left: 21, right: 21),
if (provider.isMarathonCompleted) if (provider.isMarathonCompleted)
InkWell( InkWell(

@ -13,7 +13,7 @@ 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/ui/marathon/marathon_provider.dart'; import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/custom_status_widget.dart'; import 'package:mohem_flutter_app/ui/marathon/widgets/custom_status_widget.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_header.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class MarathonWinnerSelection extends StatelessWidget { class MarathonWinnerSelection extends StatelessWidget {
@ -23,13 +23,12 @@ class MarathonWinnerSelection extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
MarathonProvider provider = context.read<MarathonProvider>(); MarathonProvider provider = context.read<MarathonProvider>();
return Scaffold( return Scaffold(
appBar: AppBarWidget(context, title: LocaleKeys.brainMarathon.tr()),
body: SingleChildScrollView( body: SingleChildScrollView(
child: Column( child: Column(
children: [ children: [
const MarathonHeader(),
20.height, 20.height,
QualifiersContainer(provider: provider) QualifiersContainer(provider: provider).paddingOnly(left: 21, right: 21),
.paddingOnly(left: 21, right: 21),
20.height, 20.height,
InkWell( InkWell(
onTap: () { onTap: () {
@ -53,8 +52,7 @@ class MarathonWinnerSelection extends StatelessWidget {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[ children: <Widget>[
"Muhammad Shrouff" "Muhammad Shrouff".toText18(isBold: true, color: MyColors.white),
.toText18(isBold: true, color: MyColors.white),
"837436".toText18(isBold: true, color: MyColors.white), "837436".toText18(isBold: true, color: MyColors.white),
], ],
), ),
@ -96,8 +94,7 @@ class MarathonWinnerSelection extends StatelessWidget {
class QualifiersContainer extends StatefulWidget { class QualifiersContainer extends StatefulWidget {
final MarathonProvider provider; final MarathonProvider provider;
const QualifiersContainer({Key? key, required this.provider}) const QualifiersContainer({Key? key, required this.provider}) : super(key: key);
: super(key: key);
@override @override
State<QualifiersContainer> createState() => _QualifiersContainerState(); State<QualifiersContainer> createState() => _QualifiersContainerState();
@ -134,11 +131,8 @@ class _QualifiersContainerState extends State<QualifiersContainer> {
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[ children: <Widget>[
LocaleKeys.winnerSelection LocaleKeys.winnerSelection.tr().toText18(isBold: true, color: MyColors.grey3AColor),
.tr() "00:${widget.provider.start < 10 ? "0${widget.provider.start}" : widget.provider.start}".toText18(isBold: true, color: MyColors.redColor),
.toText18(isBold: true, color: MyColors.grey3AColor),
"00:${widget.provider.start < 10 ? "0${widget.provider.start}" : widget.provider.start}"
.toText18(isBold: true, color: MyColors.redColor),
], ],
), ),
10.height, 10.height,

@ -33,8 +33,9 @@ class BuildCountdownTimer extends StatelessWidget {
color: MyColors.white, color: MyColors.white,
fontSize: 24, fontSize: 24,
fontStyle: FontStyle.italic, fontStyle: FontStyle.italic,
fontFamily: "Poppins",
letterSpacing: -1.44, letterSpacing: -1.44,
fontWeight: FontWeight.w600, fontWeight: FontWeight.bold,
); );
final TextStyle styleTextMarathon = const TextStyle( final TextStyle styleTextMarathon = const TextStyle(
@ -141,15 +142,11 @@ class BuildCountdownTimer extends StatelessWidget {
time.days == null time.days == null
? Text( ? Text(
"00", "00",
style: style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
) )
: Text( : Text(
time.days! < 10 time.days! < 10 ? "0${time.days.toString()}" : time.days.toString(),
? "0${time.days.toString()}" style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
: time.days.toString(),
style:
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
), ),
Text( Text(
LocaleKeys.days.tr(), LocaleKeys.days.tr(),
@ -163,15 +160,11 @@ class BuildCountdownTimer extends StatelessWidget {
time.hours == null time.hours == null
? Text( ? Text(
"00", "00",
style: style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
) )
: Text( : Text(
time.hours! < 10 time.hours! < 10 ? "0${time.hours.toString()}" : time.hours.toString(),
? "0${time.hours.toString()}" style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
: time.hours.toString(),
style:
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
), ),
Text( Text(
LocaleKeys.hours.tr(), LocaleKeys.hours.tr(),
@ -185,15 +178,11 @@ class BuildCountdownTimer extends StatelessWidget {
time.min == null time.min == null
? Text( ? Text(
"00", "00",
style: style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
) )
: Text( : Text(
time.min! < 10 time.min! < 10 ? "0${time.min.toString()}" : time.min.toString(),
? "0${time.min.toString()}" style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
: time.min.toString(),
style:
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
), ),
Text( Text(
LocaleKeys.minutes.tr(), LocaleKeys.minutes.tr(),
@ -207,15 +196,11 @@ class BuildCountdownTimer extends StatelessWidget {
time.sec == null time.sec == null
? Text( ? Text(
"00", "00",
style: style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
) )
: Text( : Text(
time.sec! < 10 time.sec! < 10 ? "0${time.sec.toString()}" : time.sec.toString(),
? "0${time.sec.toString()}" style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
: time.sec.toString(),
style:
screenFlag == 0 ? styleDigitHome : styleDigitMarathon,
), ),
Text( Text(
LocaleKeys.seconds.tr(), LocaleKeys.seconds.tr(),

@ -1,3 +1,4 @@
import 'package:auto_size_text/auto_size_text.dart';
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';
@ -22,6 +23,7 @@ class MarathonBanner extends StatelessWidget {
MarathonProvider provider = context.read<MarathonProvider>(); MarathonProvider provider = context.read<MarathonProvider>();
return Container( return Container(
decoration: MyDecorations.shadowDecoration, decoration: MyDecorations.shadowDecoration,
height: 90,
child: Stack( child: Stack(
children: [ children: [
Transform( Transform(
@ -35,50 +37,69 @@ class MarathonBanner extends StatelessWidget {
width: MediaQuery.of(context).size.width - 40, width: MediaQuery.of(context).size.width - 40,
), ),
), ),
Row( SizedBox(
mainAxisAlignment: MainAxisAlignment.end, width: double.infinity,
children: <Widget>[ height: double.infinity,
Column( child: Row(
mainAxisAlignment: MainAxisAlignment.center, children: [
mainAxisSize: MainAxisSize.min, const Expanded(
children: <Widget>[ flex: 3,
AppState().isArabic(context) ? 0.height : 5.height, child: SizedBox(
Flexible( width: double.infinity,
child: Text( height: double.infinity,
LocaleKeys.getReadyForContest.tr(),
style: const TextStyle(
fontStyle: FontStyle.italic,
fontSize: 12,
fontWeight: FontWeight.w600,
color: MyColors.lightGreyEFColor,
letterSpacing: -0.4,
),
),
), ),
const Flexible( ),
child: Text( Expanded(
"Saudi Arabia", flex: 5,
style: TextStyle( child: SizedBox(
fontStyle: FontStyle.italic, width: double.infinity,
fontSize: 19, height: double.infinity,
fontWeight: FontWeight.bold, child: Row(
color: MyColors.lightGreyEFColor, mainAxisAlignment: MainAxisAlignment.end,
height: 32 / 22, children: <Widget>[
), Column(
), mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
AppState().isArabic(context) ? 0.height : 5.height,
AutoSizeText(
LocaleKeys.getReadyForContest.tr(),
style: const TextStyle(
fontStyle: FontStyle.italic,
fontSize: 12,
fontWeight: FontWeight.w600,
color: MyColors.lightGreyEFColor,
letterSpacing: -0.4,
),
),
const AutoSizeText(
"Saudi Arabia",
style: TextStyle(
fontStyle: FontStyle.italic,
fontSize: 19,
fontWeight: FontWeight.bold,
color: MyColors.lightGreyEFColor,
height: 32 / 22,
),
),
3.height,
BuildCountdownTimer(
timeToMarathon: dummyEndTime,
provider: provider,
screenFlag: 0,
),
],
).paddingOnly(
left: AppState().isArabic(context) ? 12 : 0,
right: AppState().isArabic(context) ? 0 : 12,
)
],
).paddingOnly(right: 20),
), ),
3.height, ),
BuildCountdownTimer( ],
timeToMarathon: dummyEndTime, ),
provider: provider,
screenFlag: 0,
),
],
).paddingOnly(
left: AppState().isArabic(context) ? 12 : 0,
right: AppState().isArabic(context) ? 0 : 12,
)
],
), ),
], ],
).onPress( ).onPress(

@ -8,6 +8,13 @@ import 'package:mohem_flutter_app/models/marathon_question_model.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart'; import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
List<bool> isSelectedOptions = [
false,
false,
false,
false,
];
class QuestionCard extends StatefulWidget { class QuestionCard extends StatefulWidget {
final MarathonProvider provider; final MarathonProvider provider;
@ -18,7 +25,7 @@ class QuestionCard extends StatefulWidget {
} }
class _QuestionCardState extends State<QuestionCard> { class _QuestionCardState extends State<QuestionCard> {
final List<QuestionContent> questionCards = <QuestionContent>[]; final List<CardContent> questionCards = <CardContent>[];
@override @override
void initState() { void initState() {
@ -29,7 +36,7 @@ class _QuestionCardState extends State<QuestionCard> {
void _loadCards() { void _loadCards() {
for (DummyQuestionModel question in questions) { for (DummyQuestionModel question in questions) {
questionCards.add( questionCards.add(
QuestionContent( CardContent(
question: question, question: question,
provider: widget.provider, provider: widget.provider,
), ),
@ -64,11 +71,11 @@ class _QuestionCardState extends State<QuestionCard> {
} }
} }
class QuestionContent extends StatelessWidget { class CardContent extends StatelessWidget {
final DummyQuestionModel question; final DummyQuestionModel question;
final MarathonProvider provider; final MarathonProvider provider;
const QuestionContent({ const CardContent({
Key? key, Key? key,
required this.question, required this.question,
required this.provider, required this.provider,
@ -131,12 +138,38 @@ class QuestionContent extends StatelessWidget {
} }
} }
class AnswerContent extends StatelessWidget { class AnswerContent extends StatefulWidget {
final DummyQuestionModel question; final DummyQuestionModel question;
final MarathonProvider provider; final MarathonProvider provider;
const AnswerContent({Key? key, required this.question, required this.provider}) : super(key: key); const AnswerContent({Key? key, required this.question, required this.provider}) : super(key: key);
@override
State<AnswerContent> createState() => _AnswerContentState();
}
class _AnswerContentState extends State<AnswerContent> {
void updateOption(int index, bool value) {
isSelectedOptions[0] = false;
isSelectedOptions[1] = false;
isSelectedOptions[2] = false;
isSelectedOptions[3] = false;
isSelectedOptions[index] = value;
setState(() {});
}
Decoration getContainerColor(int index) {
if (!isSelectedOptions[index]) {
return MyDecorations.getContainersDecoration(MyColors.greyF7Color);
}
if (isSelectedOptions[index] && context.watch<MarathonProvider>().start > 0) {
return MyDecorations.getContainersDecoration(MyColors.yellowColorII);
}
return MyDecorations.getContainersDecoration(
isSelectedOptions[index] ? MyColors.greenColor : MyColors.greyF7Color,
);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
@ -155,29 +188,27 @@ class AnswerContent extends StatelessWidget {
children: <Widget>[ children: <Widget>[
InkWell( InkWell(
onTap: () { onTap: () {
if (provider.currentQuestionNumber == 9) { if (widget.provider.currentQuestionNumber == 9) {
provider.cancelTimer(); widget.provider.cancelTimer();
provider.resetValues(); widget.provider.resetValues();
Navigator.pushReplacementNamed( Navigator.pushReplacementNamed(
context, context,
AppRoutes.marathonWinnerSelection, AppRoutes.marathonWinnerSelection,
); );
return; return;
} }
provider.cancelTimer(); updateOption(0, true);
provider.startTimer(context);
provider.swipeCardLeft();
}, },
child: Container( child: Container(
height: 60, height: 60,
width: MediaQuery.of(context).size.width - 75, width: MediaQuery.of(context).size.width - 75,
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
decoration: MyDecorations.answerContainerDecoration, decoration: getContainerColor(0),
child: Center( child: Center(
child: Text( child: Text(
question.opt1!, widget.question.opt1!,
style: const TextStyle( style: TextStyle(
color: MyColors.darkTextColor, color: isSelectedOptions[0] ? MyColors.white : MyColors.darkTextColor,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 16, fontSize: 16,
), ),
@ -188,29 +219,27 @@ class AnswerContent extends StatelessWidget {
const SizedBox(height: 15), const SizedBox(height: 15),
InkWell( InkWell(
onTap: () { onTap: () {
if (provider.currentQuestionNumber == 9) { if (widget.provider.currentQuestionNumber == 9) {
provider.cancelTimer(); widget.provider.cancelTimer();
provider.resetValues(); widget.provider.resetValues();
Navigator.pushReplacementNamed( Navigator.pushReplacementNamed(
context, context,
AppRoutes.marathonWinnerSelection, AppRoutes.marathonWinnerSelection,
); );
return; return;
} }
provider.cancelTimer(); updateOption(1, true);
provider.startTimer(context);
provider.swipeCardLeft();
}, },
child: Container( child: Container(
height: 60, height: 60,
width: MediaQuery.of(context).size.width - 75, width: MediaQuery.of(context).size.width - 75,
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
decoration: MyDecorations.answerContainerDecoration, decoration: getContainerColor(1),
child: Center( child: Center(
child: Text( child: Text(
question.opt2!, widget.question.opt2!,
style: const TextStyle( style: TextStyle(
color: MyColors.darkTextColor, color: isSelectedOptions[1] ? MyColors.white : MyColors.darkTextColor,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 16, fontSize: 16,
), ),
@ -221,29 +250,27 @@ class AnswerContent extends StatelessWidget {
const SizedBox(height: 15), const SizedBox(height: 15),
InkWell( InkWell(
onTap: () { onTap: () {
if (provider.currentQuestionNumber == 9) { if (widget.provider.currentQuestionNumber == 9) {
provider.cancelTimer(); widget.provider.cancelTimer();
provider.resetValues(); widget.provider.resetValues();
Navigator.pushReplacementNamed( Navigator.pushReplacementNamed(
context, context,
AppRoutes.marathonWinnerSelection, AppRoutes.marathonWinnerSelection,
); );
return; return;
} }
provider.cancelTimer(); updateOption(2, true);
provider.startTimer(context);
provider.swipeCardLeft();
}, },
child: Container( child: Container(
height: 60, height: 60,
width: MediaQuery.of(context).size.width - 75, width: MediaQuery.of(context).size.width - 75,
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
decoration: MyDecorations.answerContainerDecoration, decoration: getContainerColor(2),
child: Center( child: Center(
child: Text( child: Text(
question.opt3!, widget.question.opt3!,
style: const TextStyle( style: TextStyle(
color: MyColors.darkTextColor, color: isSelectedOptions[2] ? MyColors.white : MyColors.darkTextColor,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 16, fontSize: 16,
), ),
@ -254,29 +281,27 @@ class AnswerContent extends StatelessWidget {
const SizedBox(height: 15), const SizedBox(height: 15),
InkWell( InkWell(
onTap: () { onTap: () {
if (provider.currentQuestionNumber == 9) { if (widget.provider.currentQuestionNumber == 9) {
provider.cancelTimer(); widget.provider.cancelTimer();
provider.resetValues(); widget.provider.resetValues();
Navigator.pushReplacementNamed( Navigator.pushReplacementNamed(
context, context,
AppRoutes.marathonWinnerSelection, AppRoutes.marathonWinnerSelection,
); );
return; return;
} }
provider.cancelTimer(); updateOption(3, true);
provider.startTimer(context);
provider.swipeCardLeft();
}, },
child: Container( child: Container(
height: 60, height: 60,
width: MediaQuery.of(context).size.width - 75, width: MediaQuery.of(context).size.width - 75,
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
decoration: MyDecorations.answerContainerDecoration, decoration: getContainerColor(3),
child: Center( child: Center(
child: Text( child: Text(
question.opt3!, widget.question.opt3!,
style: const TextStyle( style: TextStyle(
color: MyColors.darkTextColor, color: isSelectedOptions[3] ? MyColors.white : MyColors.darkTextColor,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontSize: 16, fontSize: 16,
), ),

@ -1,5 +1,6 @@
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/svg.dart';
import 'package:lottie/lottie.dart'; import 'package:lottie/lottie.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/decorations_helper.dart'; import 'package:mohem_flutter_app/classes/decorations_helper.dart';
@ -8,7 +9,7 @@ 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/ui/marathon/widgets/marathon_header.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
class WinnerScreen extends StatelessWidget { class WinnerScreen extends StatelessWidget {
const WinnerScreen({Key? key}) : super(key: key); const WinnerScreen({Key? key}) : super(key: key);
@ -17,10 +18,10 @@ class WinnerScreen extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
backgroundColor: MyColors.backgroundColor, backgroundColor: MyColors.backgroundColor,
appBar: AppBarWidget(context, title: LocaleKeys.brainMarathon.tr()),
body: SingleChildScrollView( body: SingleChildScrollView(
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
const MarathonHeader(),
60.height, 60.height,
Container( Container(
width: double.infinity, width: double.infinity,
@ -43,27 +44,43 @@ class WinnerScreen extends StatelessWidget {
], ],
), ),
), ),
50.height, 26.height,
SizedBox(
height: 50,
child: Stack(
children: [
Align(
alignment: Alignment.center,
child: SvgPicture.asset(
"assets/images/winner_ribbon.svg",
height: 50,
),
),
Align(
alignment: Alignment.center,
child: "WINNER".toText32(color: MyColors.white, isBold: true).paddingOnly(top: 07),
)
],
),
),
12.height,
"Muhammad Shrouff".toText22(color: MyColors.grey3AColor), "Muhammad Shrouff".toText22(color: MyColors.grey3AColor),
"837436".toText22(color: MyColors.grey57Color), "837436".toText22(color: MyColors.grey57Color),
90.height, 80.height,
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[ children: <Widget>[
LocaleKeys.sponsoredBy LocaleKeys.sponsoredBy.tr().toText14(color: MyColors.grey77Color),
.tr() " Extra".toText14(color: MyColors.darkTextColor, isBold: true),
.toText14(color: MyColors.grey77Color),
" Extra".toText14(
color: MyColors.darkTextColor, isBold: true),
], ],
), ),
5.height, 5.height,
Image.network( Image.asset(
"https://cdn.pixabay.com/photo/2014/08/27/07/53/blog-428950_1280.jpg", "assets/images/logos/main_mohemm_logo.png",
height: 50, height: 40,
fit: BoxFit.fill, fit: BoxFit.fill,
width: 120, width: 150,
), )
], ],
), ),
).paddingOnly(left: 21, right: 21), ).paddingOnly(left: 21, right: 21),

@ -260,7 +260,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreen> {
for (int i = 0; i < parentsList.length; i++) { for (int i = 0; i < parentsList.length; i++) {
for (int j = 0; j < (getEitDffStructureList?.length ?? 0); j++) { for (int j = 0; j < (getEitDffStructureList?.length ?? 0); j++) {
if (getEitDffStructureList![j].sEGMENTNAME == parentsList[i].opt1) { if (getEitDffStructureList![j].sEGMENTNAME == parentsList[i].name) {
if (getEitDffStructureList![j].dISPLAYFLAG != "N") { if (getEitDffStructureList![j].dISPLAYFLAG != "N") {
if (getEitDffStructureList![j].vALIDATIONTYPE == "N") { if (getEitDffStructureList![j].vALIDATIONTYPE == "N") {
String? idColName; String? idColName;

@ -392,7 +392,7 @@ class _AddUpdateFamilyMemberState extends State<AddUpdateFamilyMember> {
} }
void submitUpdateForm() async { void submitUpdateForm() async {
// try { try {
List<Map<String, dynamic>> values1 = getBasicDetDffStructureList!.map((e) { List<Map<String, dynamic>> values1 = getBasicDetDffStructureList!.map((e) {
String? dateVal = ''; String? dateVal = '';
String? vatcherVal = ''; String? vatcherVal = '';
@ -463,9 +463,9 @@ class _AddUpdateFamilyMemberState extends State<AddUpdateFamilyMember> {
Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, Navigator.pushNamed(context, AppRoutes.requestSubmitScreen,
arguments: RequestSubmitScreenParams(LocaleKeys.profile_familyDetails.tr(), transactionId!.toInt(), itemKey.toString(), 'family_member')); arguments: RequestSubmitScreenParams(LocaleKeys.profile_familyDetails.tr(), transactionId!.toInt(), itemKey.toString(), 'family_member'));
setState(() {}); setState(() {});
// } catch (ex) { } catch (ex) {
// Utils.hideLoading(context); Utils.hideLoading(context);
// Utils.handleException(ex, context, null); Utils.handleException(ex, context, null);
// } }
} }
} }

@ -283,10 +283,17 @@ class _DynamicInputScreenState extends State<DynamicInputScreenAddress> {
tempVar = e.getEmployeeAddressList!.sEGMENTVALUEDSP ?? ""; tempVar = e.getEmployeeAddressList!.sEGMENTVALUEDSP ?? "";
} }
return ValidateEitTransactionModel(dATEVALUE: null, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: null, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: tempVar.toString()).toJson(); return ValidateEitTransactionModel(dATEVALUE: null, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: null, tRANSACTIONNUMBER: 0, vARCHAR2VALUE: tempVar.toString()).toJson();
}).toList(); }).toList();
submitPhoneNumbers = await ProfileApiClient().submitAddressTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values, dynamicParams!.correctOrNew, countryCode, effectiveDate); submitPhoneNumbers = await ProfileApiClient().submitAddressTransaction(
dESCFLEXCONTEXTCODE,
dynamicParams!.dynamicId,
values,
dynamicParams!.correctOrNew,
countryCode,
effectiveDate.isEmpty ? DateFormat('dd-MMM-yyy').format(DateTime.now().add(Duration(days: 35))) : effectiveDate,
);
print(values); print(values);
Utils.hideLoading(context); Utils.hideLoading(context);

@ -112,7 +112,7 @@ class _ProfileScreenState extends State<ProfileScreen> {
} }
void startImageSheet() { void startImageSheet() {
showMyBottomSheet(context, showMyBottomSheet(context, callBackFunc: (){},
child: Column( child: Column(
children: [ children: [
Container( Container(

@ -47,7 +47,7 @@ class _MyRequestsState extends State<MyRequests> {
backgroundColor: Colors.white, backgroundColor: Colors.white,
appBar: AppBarWidget( appBar: AppBarWidget(
context, context,
title: "Concurrent Reports", title: LocaleKeys.concurrentReports,
), ),
body: Column( body: Column(
children: [ children: [

@ -5,11 +5,15 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/my_requests_api_client.dart'; import 'package:mohem_flutter_app/api/my_requests_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/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';
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/validate_eit_transaction_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/my_requests/get_ccp_transactions_model.dart';
import 'package:mohem_flutter_app/models/my_requests/get_ccp_transations_list_model.dart';
import 'package:mohem_flutter_app/models/my_requests/get_concurrent_programs_model.dart'; import 'package:mohem_flutter_app/models/my_requests/get_concurrent_programs_model.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';
@ -25,7 +29,8 @@ class NewRequest extends StatefulWidget {
class _NewRequestState extends State<NewRequest> { class _NewRequestState extends State<NewRequest> {
List<GetConcurrentProgramsModel> getConcurrentProgramsList = []; List<GetConcurrentProgramsModel> getConcurrentProgramsList = [];
GetConcurrentProgramsModel? selectedConcurrentProgramList; GetConcurrentProgramsModel? selectedConcurrentProgramList;
SubmitCcpTransactionList? submitCcpTransactionList;
List<GetCCPTransactionsModel> getCCPTransactionsList = [];
List<GetEITDFFStructureList>? getCCPDFFStructureModelList; List<GetEITDFFStructureList>? getCCPDFFStructureModelList;
DateTime selectedDate = DateTime.now(); DateTime selectedDate = DateTime.now();
@ -42,7 +47,7 @@ class _NewRequestState extends State<NewRequest> {
backgroundColor: Colors.white, backgroundColor: Colors.white,
appBar: AppBarWidget( appBar: AppBarWidget(
context, context,
title: "Concurrent Reports", title: LocaleKeys.concurrentReports,
), ),
body: Column( body: Column(
children: [ children: [
@ -84,7 +89,7 @@ class _NewRequestState extends State<NewRequest> {
1.divider, 1.divider,
DefaultButton(LocaleKeys.submit.tr(), () { DefaultButton(LocaleKeys.submit.tr(), () {
// todo need to add submit method // todo need to add submit method
// openNewRequest(); openNewRequest();
}) })
.insideContainer, .insideContainer,
], ],
@ -92,6 +97,40 @@ class _NewRequestState extends State<NewRequest> {
); );
} }
void openNewRequest() async {
try {
List<Map<String, dynamic>> values = getCCPDFFStructureModelList!.map((e) {
String? dateVal = '';
String? vatcherVal = '';
int? numberVal;
if (e!.fORMATTYPE == 'N') {
dateVal = null;
vatcherVal = e.eSERVICESDV!.pIDCOLUMNNAME;
numberVal = null;
} else if (e.fORMATTYPE == 'X') {
dateVal = null;
vatcherVal = e.eSERVICESDV!.pIDCOLUMNNAME;
numberVal = null;
} else {
dateVal = null;
numberVal = null;
vatcherVal = null;
}
return ValidateEitTransactionModel(dATEVALUE: dateVal, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: numberVal, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: vatcherVal.toString()).toJson();
}).toList();
Utils.showLoading(context);
submitCcpTransactionList = await MyRequestsApiClient().getSubmitNewRequest(values);
getCCPTransactionsList = await MyRequestsApiClient().getCcpTransactions(values);
Utils.hideLoading(context);
Navigator.pushNamed(context, AppRoutes.myRequests,);
setState(() {});
} catch (ex) {
Utils.hideLoading(context);
Utils.handleException(ex, context, null);
}
}
void getConcurrentPrograms() async { void getConcurrentPrograms() async {
try { try {
Utils.showLoading(context); Utils.showLoading(context);

@ -125,7 +125,7 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
}, },
children: [ children: [
RequestDetailFragment(fields: itgRequest?.fieldGoups?[1].fields ?? []), RequestDetailFragment(fields: itgRequest?.fieldGoups?[1].fields ?? []),
ApprovalLevelfragment(wFHistory: itgRequest?.wFHistory ?? []), ApprovalLevelfragment(wFHistory: itgRequest?.wFHistory ?? [], voidCallback: reloadITG,),
RequestDetailFragment(fields: itgRequest?.fieldGoups?[0].fields ?? []), RequestDetailFragment(fields: itgRequest?.fieldGoups?[0].fields ?? []),
], ],
).expanded, ).expanded,
@ -263,12 +263,12 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
print(action.toJson()); print(action.toJson());
switch (action.action) { switch (action.action) {
case "Delegate": case "Delegate":
showMyBottomSheet(context, showMyBottomSheet(context, callBackFunc: reloadITG,
child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? [])); child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? []));
break; break;
case "RequestInformation": case "RequestInformation":
showMyBottomSheet(context, showMyBottomSheet(context, callBackFunc: reloadITG,
child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? [])); child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? []));
break; break;
@ -342,10 +342,12 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
} }
void performAction(String actionMode) { void performAction(String actionMode) {
print(actionMode);
showDialog( showDialog(
context: context, context: context,
builder: (cxt) => ITGCommentsDialog( builder: (cxt) => ITGCommentsDialog(
message: LocaleKeys.writeComment.tr(), message: LocaleKeys.writeComment.tr(),
actionMode: actionMode,
onTap: (note) { onTap: (note) {
if (actionMode == "APPROVED") { if (actionMode == "APPROVED") {
performApproveAction(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", note); performApproveAction(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", note);
@ -404,4 +406,19 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
Utils.handleException(ex, context, null); Utils.handleException(ex, context, null);
} }
} }
void reloadITG() {
AppState().requestAllList!.removeAt(AppState().itgWorkListIndex!);
if (AppState().requestAllList!.isEmpty) {
Navigator.pop(context, "delegate_reload");
} else {
if (AppState().requestAllList!.length <= AppState().itgWorkListIndex!) {
Navigator.pop(context, "delegate_reload");
} else {
requestDetails = null;
getDataFromState();
}
}
}
} }

@ -12,8 +12,9 @@ import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
class ApprovalLevelfragment extends StatelessWidget { class ApprovalLevelfragment extends StatelessWidget {
List<WFHistory> wFHistory; List<WFHistory> wFHistory;
VoidCallback voidCallback;
ApprovalLevelfragment({Key? key, this.wFHistory = const <WFHistory>[]}) : super(key: key); ApprovalLevelfragment({Key? key, this.wFHistory = const <WFHistory>[], required this.voidCallback}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -98,6 +99,7 @@ class ApprovalLevelfragment extends StatelessWidget {
LocaleKeys.request_info.tr().toText12(color: MyColors.grey67Color).center.paddingOnly(top: 6, bottom: 6).onPress(() { LocaleKeys.request_info.tr().toText12(color: MyColors.grey67Color).center.paddingOnly(top: 6, bottom: 6).onPress(() {
showMyBottomSheet( showMyBottomSheet(
context, context,
callBackFunc: voidCallback,
child: SelectedItgItemSheet( child: SelectedItgItemSheet(
LocaleKeys.comments.tr(), LocaleKeys.comments.tr(),
wfHistory: history, wfHistory: history,
@ -109,6 +111,7 @@ class ApprovalLevelfragment extends StatelessWidget {
LocaleKeys.delegate.tr().toText12(color: MyColors.gradiantEndColor).center.paddingOnly(top: 6, bottom: 6).onPress(() { LocaleKeys.delegate.tr().toText12(color: MyColors.gradiantEndColor).center.paddingOnly(top: 6, bottom: 6).onPress(() {
showMyBottomSheet( showMyBottomSheet(
context, context,
callBackFunc: voidCallback,
child: SelectedItgItemSheet( child: SelectedItgItemSheet(
LocaleKeys.comments.tr(), LocaleKeys.comments.tr(),
wfHistory: history, wfHistory: history,
@ -126,18 +129,21 @@ class ApprovalLevelfragment extends StatelessWidget {
} }
Color getStatusColor(String code) { Color getStatusColor(String code) {
if (code == "Submit") { if (code.toLowerCase() == "submit") {
return MyColors.grey3AColor; return MyColors.grey3AColor;
} else if (code == "Pending") { } else if (code.toLowerCase() == "pending") {
return MyColors.yellowColor; return MyColors.yellowColor;
} else if (code == "Not Doable" || code == "Rejected") { } else if (code.toLowerCase() == "not doable" || code.toLowerCase() == "rejected") {
return MyColors.redColor; return MyColors.redColor;
} else if (code == "APPROVED") { } else if (code.toLowerCase() == "approved" ||
code.toLowerCase() == "auto-approve" ||
code.toLowerCase() == "auto-approved" ||
code.toLowerCase() == "doable") {
return MyColors.greenColor; return MyColors.greenColor;
} else if (code == "Requested Information") { } else if (code.toLowerCase() == "requested information" || code.toLowerCase() == "assign" || code.toLowerCase() == "reassign") {
return MyColors.orange; return MyColors.orange;
} else { } else {
return MyColors.yellowColor; return MyColors.whiteColor;
} }
} }
} }

@ -51,6 +51,7 @@ class RequestDetailFragment extends StatelessWidget {
? true ? true
: false : false
: false, : false,
type: fields[index].type,
); );
} }
return ItemDetailViewGridItem( return ItemDetailViewGridItem(
@ -62,6 +63,7 @@ class RequestDetailFragment extends StatelessWidget {
? true ? true
: false : false
: false, : false,
type: fields[index].type,
); );
}, },
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(

@ -194,6 +194,7 @@ class _DelegateSheetState extends State<DelegateSheet> {
).onPress(() { ).onPress(() {
showMyBottomSheet( showMyBottomSheet(
context, context,
callBackFunc: (){},
child: SearchOptionsSheet( child: SearchOptionsSheet(
selectedType, selectedType,
onSelection: (String value) { onSelection: (String value) {
@ -392,6 +393,7 @@ class _DelegateSheetState extends State<DelegateSheet> {
return InkWell( return InkWell(
onTap: () { onTap: () {
showMyBottomSheet(context, showMyBottomSheet(context,
callBackFunc: (){},
child: SelectedItemSheet( child: SelectedItemSheet(
"Comment", "Comment",
apiMode: widget.apiMode, apiMode: widget.apiMode,
@ -437,6 +439,7 @@ class _DelegateSheetState extends State<DelegateSheet> {
return InkWell( return InkWell(
onTap: () { onTap: () {
showMyBottomSheet(context, showMyBottomSheet(context,
callBackFunc: (){},
child: SelectedItgItemSheet( child: SelectedItgItemSheet(
"Comment", "Comment",
apiMode: widget.apiMode, apiMode: widget.apiMode,
@ -461,6 +464,7 @@ class _DelegateSheetState extends State<DelegateSheet> {
return InkWell( return InkWell(
onTap: () { onTap: () {
showMyBottomSheet(context, showMyBottomSheet(context,
callBackFunc: (){},
child: SelectedItemSheet( child: SelectedItemSheet(
"Comment", "Comment",
apiMode: widget.apiMode, apiMode: widget.apiMode,
@ -506,6 +510,7 @@ class _DelegateSheetState extends State<DelegateSheet> {
return InkWell( return InkWell(
onTap: () { onTap: () {
showMyBottomSheet(context, showMyBottomSheet(context,
callBackFunc: (){},
child: SelectedItemSheet( child: SelectedItemSheet(
LocaleKeys.comments.tr(), LocaleKeys.comments.tr(),
apiMode: widget.apiMode, apiMode: widget.apiMode,

@ -71,7 +71,7 @@ class SelectedItemSheet extends StatelessWidget {
child: DefaultButton( child: DefaultButton(
LocaleKeys.cancel.tr(), LocaleKeys.cancel.tr(),
() { () {
Navigator.pop(context); Navigator.pop(context, "cancel");
}, },
textColor: Colors.black, textColor: Colors.black,
colors: [ colors: [
@ -120,8 +120,8 @@ class SelectedItemSheet extends StatelessWidget {
try { try {
await WorkListApiClient().submitComment(comment: comment, email: email, userId: userId, notificationId: notificationID, apiMode: apiMode); await WorkListApiClient().submitComment(comment: comment, email: email, userId: userId, notificationId: notificationID, apiMode: apiMode);
Utils.hideLoading(context); Utils.hideLoading(context);
Navigator.pop(context); // Navigator.pop(context);
Navigator.pop(context); // Navigator.pop(context);
Navigator.pop(context, "delegate_reload"); Navigator.pop(context, "delegate_reload");
} catch (ex) { } catch (ex) {
Utils.hideLoading(context); Utils.hideLoading(context);
@ -142,7 +142,7 @@ class SelectedItemSheet extends StatelessWidget {
padding: EdgeInsets.only(top: 16, bottom: 16, left: 21, right: 21), padding: EdgeInsets.only(top: 16, bottom: 16, left: 21, right: 21),
child: Row( child: Row(
children: [ children: [
actionHistoryList != null (actionHistoryList != null && actionHistoryList!.eMPLOYEEIMAGE != null)
? CircularAvatar( ? CircularAvatar(
height: 30, height: 30,
width: 30, width: 30,

@ -429,6 +429,7 @@ class _WorkListScreenState extends State<WorkListScreen> {
void openBottomSheet(BuildContext context) { void openBottomSheet(BuildContext context) {
showMyBottomSheet( showMyBottomSheet(
context, context,
callBackFunc: (){},
child: WorkListAdvanceSearch((selectedViewID, selectedItemTypeID, searchByInput, searchByDate) async { child: WorkListAdvanceSearch((selectedViewID, selectedItemTypeID, searchByInput, searchByDate) async {
itgRequestTypeIndex = null; itgRequestTypeIndex = null;
pNotificationType = selectedViewID; pNotificationType = selectedViewID;

@ -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:lottie/lottie.dart';
import 'package:mohem_flutter_app/api/worklist/worklist_api_client.dart'; import 'package:mohem_flutter_app/api/worklist/worklist_api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
@ -82,6 +83,9 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
bool isApproveAvailable = false; bool isApproveAvailable = false;
bool isRejectAvailable = false; bool isRejectAvailable = false;
bool isAttachmentLoaded = false;
bool isActionHistoryLoaded = false;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -241,8 +245,20 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
itemCreationLines: getItemCreationNtfBody?.itemCreationLines ?? [], itemCreationLines: getItemCreationNtfBody?.itemCreationLines ?? [],
prLinesList: getPrNotificationBody?.pRLines ?? [], prLinesList: getPrNotificationBody?.pRLines ?? [],
), ),
actionHistoryList.isEmpty ? Utils.getNoDataWidget(context) : ActionsFragment(workListData!.nOTIFICATIONID, actionHistoryList), isActionHistoryLoaded
getAttachmentList.isEmpty ? Utils.getNoDataWidget(context) : AttachmentsFragment(getAttachmentList), ? actionHistoryList.isEmpty
? Utils.getNoDataWidget(context)
: ActionsFragment(
workListData!.nOTIFICATIONID,
actionHistoryList,
voidCallback: reloadWorkList,
)
: showLoadingAnimation(),
isAttachmentLoaded
? getAttachmentList.isEmpty
? Utils.getNoDataWidget(context)
: AttachmentsFragment(getAttachmentList)
: showLoadingAnimation(),
], ],
).expanded, ).expanded,
if (isApproveAvailable || isRejectAvailable || isCloseAvailable) if (isApproveAvailable || isRejectAvailable || isCloseAvailable)
@ -371,20 +387,24 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
switch (notificationButton.bUTTONACTION) { switch (notificationButton.bUTTONACTION) {
case "DELEGATE": case "DELEGATE":
showMyBottomSheet(context, showMyBottomSheet(context,
callBackFunc: reloadWorkList,
child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList));
break; break;
case "REQUEST_INFO": case "REQUEST_INFO":
// do something else // do something else
showMyBottomSheet(context, showMyBottomSheet(context,
callBackFunc: reloadWorkList,
child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: "REQUEST_INFO", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: "REQUEST_INFO", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList));
break; break;
case "TRANSFER_INFO": case "TRANSFER_INFO":
// do something else // do something else
showMyBottomSheet(context, showMyBottomSheet(context,
child: DelegateSheet(title: notificationButton.bUTTONLABEL!, apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); callBackFunc: reloadWorkList,
child:
DelegateSheet(title: notificationButton.bUTTONLABEL!, apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList));
break; break;
case "ANSWER_INFO": case "ANSWER_INFO":
performAction(notificationButton.bUTTONACTION!,title: notificationButton.bUTTONLABEL); performAction(notificationButton.bUTTONACTION!, title: notificationButton.bUTTONLABEL);
break; break;
case "RFC": case "RFC":
// do something else // do something else
@ -396,10 +416,13 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
// do something else // do something else
case "APPROVE_AND_FORWARD": case "APPROVE_AND_FORWARD":
showMyBottomSheet(context, showMyBottomSheet(context,
callBackFunc: reloadWorkList,
child: DelegateSheet(title: "Approve and Forward", apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); child: DelegateSheet(title: "Approve and Forward", apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList));
break; break;
case "FORWARD": case "FORWARD":
showMyBottomSheet(context, child: DelegateSheet(title: "Forward", apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); showMyBottomSheet(context,
callBackFunc: reloadWorkList,
child: DelegateSheet(title: "Forward", apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList));
break; break;
case "REJECT": case "REJECT":
performNetworkCall(context, email: "", userId: ""); performNetworkCall(context, email: "", userId: "");
@ -492,14 +515,15 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
); );
} }
void performAction(String actionMode,{String? title}) { void performAction(String actionMode, {String? title}) {
TextEditingController textEditingController = TextEditingController(); TextEditingController textEditingController = TextEditingController();
showDialog( showDialog(
context: context, context: context,
builder: (cxt) => AcceptRejectInputDialog( builder: (cxt) => AcceptRejectInputDialog(
message: title !=null ? null:LocaleKeys.requestedItems.tr(), message: title != null ? null : LocaleKeys.requestedItems.tr(),
title: title, title: title,
notificationGetRespond: notificationNoteInput, notificationGetRespond: notificationNoteInput,
actionMode: actionMode,
onTap: (note) { onTap: (note) {
Map<String, dynamic> payload = { Map<String, dynamic> payload = {
"P_ACTION_MODE": actionMode, "P_ACTION_MODE": actionMode,
@ -550,6 +574,20 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
} }
} }
void reloadWorkList() {
AppState().workList!.removeAt(AppState().workListIndex!);
if (AppState().workList!.isEmpty) {
Navigator.pop(context, "delegate_reload");
} else {
if (AppState().workList!.length <= AppState().workListIndex!) {
Navigator.pop(context, "delegate_reload");
} else {
workListData = null;
getDataFromState();
}
}
}
void getEitNotificationBody() async { void getEitNotificationBody() async {
try { try {
if (apiCallCount == 0) Utils.showLoading(context); if (apiCallCount == 0) Utils.showLoading(context);
@ -791,7 +829,9 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
// apiCallCount--; // apiCallCount--;
// if (apiCallCount == 0) { // if (apiCallCount == 0) {
// Utils.hideLoading(context); // Utils.hideLoading(context);
setState(() {}); setState(() {
isActionHistoryLoaded = true;
});
// } // }
} catch (ex) { } catch (ex) {
// apiCallCount--; // apiCallCount--;
@ -808,7 +848,9 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
// apiCallCount--; // apiCallCount--;
// if (apiCallCount == 0) { // if (apiCallCount == 0) {
// Utils.hideLoading(context); // Utils.hideLoading(context);
setState(() {}); setState(() {
isAttachmentLoaded = true;
});
// } // }
} catch (ex) { } catch (ex) {
// apiCallCount--; // apiCallCount--;
@ -816,4 +858,13 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
Utils.handleException(ex, context, null); Utils.handleException(ex, context, null);
} }
} }
Widget showLoadingAnimation() {
return Lottie.asset(
'assets/lottie/loading.json',
repeat: true,
reverse: false,
fit: BoxFit.contain,
);
}
} }

@ -7,7 +7,6 @@ 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/get_action_history_list_model.dart'; import 'package:mohem_flutter_app/models/get_action_history_list_model.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/delegate_sheet.dart';
import 'package:mohem_flutter_app/ui/work_list/sheets/selected_item_sheet.dart'; import 'package:mohem_flutter_app/ui/work_list/sheets/selected_item_sheet.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
@ -15,8 +14,9 @@ import 'package:mohem_flutter_app/widgets/circular_avatar.dart';
class ActionsFragment extends StatelessWidget { class ActionsFragment extends StatelessWidget {
int? notificationID; int? notificationID;
List<GetActionHistoryList> actionHistoryList; List<GetActionHistoryList> actionHistoryList;
VoidCallback voidCallback;
ActionsFragment(this.notificationID, this.actionHistoryList, {Key? key}) : super(key: key); ActionsFragment(this.notificationID, this.actionHistoryList, {Key? key, required this.voidCallback}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -99,13 +99,17 @@ class ActionsFragment extends StatelessWidget {
Row( Row(
children: [ children: [
LocaleKeys.request_info.tr().toText12(color: MyColors.grey67Color).center.paddingOnly(top: 6, bottom: 6).onPress(() { LocaleKeys.request_info.tr().toText12(color: MyColors.grey67Color).center.paddingOnly(top: 6, bottom: 6).onPress(() {
showMyBottomSheet(context, showMyBottomSheet(
child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: "REQUEST_INFO", notificationID: notificationID, actionHistoryList: actionHistoryList)); context,
callBackFunc: voidCallback,
child: SelectedItemSheet(LocaleKeys.request_info.tr(), apiMode: "REQUEST_INFO", notificationID: notificationID, actionHistoryList: actionHistory),
);
}).expanded, }).expanded,
Container(width: 1, height: 30, color: MyColors.lightGreyEFColor), Container(width: 1, height: 30, color: MyColors.lightGreyEFColor),
LocaleKeys.delegate.tr().toText12(color: MyColors.gradiantEndColor).center.paddingOnly(top: 6, bottom: 6).onPress(() { LocaleKeys.delegate.tr().toText12(color: MyColors.gradiantEndColor).center.paddingOnly(top: 6, bottom: 6).onPress(() {
showMyBottomSheet( showMyBottomSheet(
context, context,
callBackFunc: voidCallback,
child: SelectedItemSheet( child: SelectedItemSheet(
LocaleKeys.comments.tr(), LocaleKeys.comments.tr(),
apiMode: "DELEGATE", apiMode: "DELEGATE",
@ -133,9 +137,9 @@ class ActionsFragment extends StatelessWidget {
return MyColors.redColor; return MyColors.redColor;
} else if (code == "PENDING") { } else if (code == "PENDING") {
return MyColors.orange; return MyColors.orange;
} else if (code == "APPROVED" || code == "APPROVE") { } else if (code == "APPROVED" || code == "APPROVE" || code == "ANSWER_INFO") {
return const Color(0xff1FA269); return const Color(0xff1FA269);
} else if (code == "REQUEST_INFO") { } else if (code == "REQUEST_INFO"|| code == "FORWARD") {
return const Color(0xff2E303A); return const Color(0xff2E303A);
} else if (code != "SUBMIT" && code != "REJECT" && code != "PENDING") { } else if (code != "SUBMIT" && code != "REJECT" && code != "PENDING") {
return MyColors.orange; return MyColors.orange;

@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart';
void showMyBottomSheet(BuildContext context, {required Widget child}) { void showMyBottomSheet(BuildContext context, {required Widget child, required VoidCallback callBackFunc}) {
showModalBottomSheet<void>( showModalBottomSheet<String>(
context: context, context: context,
isScrollControlled: true, isScrollControlled: true,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
@ -37,7 +37,13 @@ void showMyBottomSheet(BuildContext context, {required Widget child}) {
), ),
); );
}, },
); ).then((value) {
// print("BACK FROM DELEGATE!!!!");
// print("value: $value");
if (value == "delegate_reload") {
callBackFunc();
}
});
} }
class BottomSheetItem extends StatelessWidget { class BottomSheetItem extends StatelessWidget {

@ -25,7 +25,7 @@ class CircularAvatar extends StatelessWidget {
image: NetworkImage(url ?? "https://cdn4.iconfinder.com/data/icons/professions-2-2/151/89-512.png"), image: NetworkImage(url ?? "https://cdn4.iconfinder.com/data/icons/professions-2-2/151/89-512.png"),
), ),
), ),
child: isImageBase64 ? imageFromBase64String(url!) : null, child: (isImageBase64 && url != null) ? imageFromBase64String(url!) : Container(),
); );
} }

@ -13,11 +13,13 @@ class AcceptRejectInputDialog extends StatelessWidget {
final String? title; final String? title;
final String? message; final String? message;
final String? okTitle; final String? okTitle;
final String? actionMode;
final NotificationGetRespondAttributesList? notificationGetRespond; final NotificationGetRespondAttributesList? notificationGetRespond;
final Function(String) onTap; final Function(String) onTap;
// final TextEditingController textEditingController; // final TextEditingController textEditingController;
AcceptRejectInputDialog({Key? key, this.title, @required this.message, this.okTitle, required this.onTap, this.notificationGetRespond}) : super(key: key); AcceptRejectInputDialog({Key? key, this.title, @required this.message, this.okTitle, required this.onTap, this.notificationGetRespond, this.actionMode}) : super(key: key);
String note = ""; String note = "";
@ -85,15 +87,20 @@ class AcceptRejectInputDialog extends StatelessWidget {
).expanded, ).expanded,
10.width, 10.width,
DefaultButton( DefaultButton(
LocaleKeys.ok.tr(), actionMode == "REJECTED" ? LocaleKeys.reject.tr() : LocaleKeys.ok.tr(),
() { () {
Navigator.pop(context); Navigator.pop(context);
onTap(note); onTap(note);
}, },
colors: const [ colors: actionMode == "REJECTED"
Color(0xff28C884), ? const [
Color(0xff1BB271), Color(0xffE47A7E),
], Color(0xffE47A7E),
]
: const [
Color(0xff28C884),
Color(0xff1BB271),
],
).expanded, ).expanded,
], ],
), ),

@ -2,6 +2,7 @@ import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.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/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/int_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';
@ -12,9 +13,10 @@ class ITGCommentsDialog extends StatelessWidget {
final String? title; final String? title;
final String? message; final String? message;
final String? okTitle; final String? okTitle;
final String? actionMode;
final Function(String) onTap; final Function(String) onTap;
ITGCommentsDialog({Key? key, this.title, @required this.message, this.okTitle, required this.onTap}) : super(key: key); ITGCommentsDialog({Key? key, this.title, @required this.message, this.okTitle, required this.onTap, this.actionMode}) : super(key: key);
String note = ""; String note = "";
@ -82,15 +84,24 @@ class ITGCommentsDialog extends StatelessWidget {
).expanded, ).expanded,
10.width, 10.width,
DefaultButton( DefaultButton(
LocaleKeys.ok.tr(), actionMode == "REJECTED" ? LocaleKeys.reject.tr() : LocaleKeys.approve.tr(),
() { () {
Navigator.pop(context); if (actionMode == "REJECTED" && note.isEmpty) {
onTap(note); Utils.showToast(LocaleKeys.pleaseEnterComments.tr());
} else {
Navigator.pop(context);
onTap(note);
}
}, },
colors: const [ colors: actionMode == "REJECTED"
Color(0xff28C884), ? const [
Color(0xff1BB271), Color(0xffE47A7E),
], Color(0xffE47A7E),
]
: const [
Color(0xff28C884),
Color(0xff1BB271),
],
).expanded, ).expanded,
], ],
), ),

@ -13,6 +13,7 @@ class ImageOptions {
static void showImageOptionsNew(BuildContext context, bool showFilesOption, Function(String, File) image) { static void showImageOptionsNew(BuildContext context, bool showFilesOption, Function(String, File) image) {
showMyBottomSheet( showMyBottomSheet(
context, context,
callBackFunc: (){},
child: AttachmentOptions( child: AttachmentOptions(
showFilesOption: showFilesOption, showFilesOption: showFilesOption,
onCameraTap: () async { onCameraTap: () async {

@ -1,8 +1,11 @@
import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.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';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/models/itg_forms_models/itg_worklist_table_model.dart';
class ItemDetailView extends StatelessWidget { class ItemDetailView extends StatelessWidget {
final String title; final String title;
@ -46,9 +49,10 @@ class ItemDetailViewGridItem extends StatelessWidget {
int index; int index;
final String? title; final String? title;
final String? value; final String? value;
final String? type;
final bool isNeedToShowEmptyDivider; final bool isNeedToShowEmptyDivider;
ItemDetailViewGridItem(this.index, this.title, this.value, {Key? key, this.isNeedToShowEmptyDivider = false}) : super(key: key); ItemDetailViewGridItem(this.index, this.title, this.value, {Key? key, this.isNeedToShowEmptyDivider = false, this.type = ""}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -78,7 +82,7 @@ class ItemDetailViewGridItem extends StatelessWidget {
children: [ children: [
Flexible(child: "$title:".toText12Auto(isBold: true, color: const Color(0xff2BB8A6))), Flexible(child: "$title:".toText12Auto(isBold: true, color: const Color(0xff2BB8A6))),
4.width, 4.width,
Flexible(child: (value!.isEmpty ? "--" : value).toString().toText12Auto(color: MyColors.normalTextColor)), type!.toLowerCase() == "table" ? getStringFromJSON(value!) : Flexible(child: (value!.isEmpty ? "--" : value).toString().toText12Auto(color: MyColors.normalTextColor)),
], ],
), ),
); );
@ -129,3 +133,14 @@ class ItemDetailGrid extends StatelessWidget {
); );
} }
} }
Widget getStringFromJSON(String jsonString) {
var body = json.decode(jsonString);
ITGWorkListTableModel itgWorkListTableModel = ITGWorkListTableModel();
if (body.length != 0) {
itgWorkListTableModel = ITGWorkListTableModel.fromJson(body[0][0]);
return Flexible(child: (itgWorkListTableModel.textvalue).toString().toText12Auto(color: MyColors.normalTextColor));
} else {
return Flexible(child: ("-").toString().toText12Auto(color: MyColors.normalTextColor));
}
}

@ -75,21 +75,23 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
print(MediaQuery.of(context).size.width);
return Container( return Container(
padding: EdgeInsets.only(left: 21, right: 21, bottom: 21, top: widget.topPadding), padding: EdgeInsets.only(left: 21, right: 21, bottom: 21, top: widget.topPadding),
decoration: const BoxDecoration(borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), color: Colors.white), decoration: const BoxDecoration(borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), color: Colors.white),
width: double.infinity, width: double.infinity,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [ children: [
LocaleKeys.markAttendance.tr().toSectionHeading(), LocaleKeys.markAttendance.tr().toSectionHeading(),
LocaleKeys.selectMethodOfAttendance.tr().tr().toText11(color: const Color(0xff535353)), LocaleKeys.selectMethodOfAttendance.tr().tr().toText11(color: const Color(0xff535353)),
GridView( GridView(
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
padding: const EdgeInsets.only(bottom: 14, top: 21), padding: const EdgeInsets.only(bottom: 0, top: 21),
gridDelegate: gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: (MediaQuery.of(context).size.width < 400) ? 3 : 5, childAspectRatio: 1 / 1, crossAxisSpacing: 8, mainAxisSpacing: 8), SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: (MediaQuery.of(context).size.width < 550) ? 3 : 5, childAspectRatio: 1 / 1, crossAxisSpacing: 8, mainAxisSpacing: 8),
children: <Widget>[ children: <Widget>[
// if (isNfcEnabled) // if (isNfcEnabled)
attendanceMethod("NFC", "assets/images/nfc.svg", isNfcEnabled, () { attendanceMethod("NFC", "assets/images/nfc.svg", isNfcEnabled, () {
@ -137,27 +139,50 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
print("nfc not location enabled"); print("nfc not location enabled");
} }
showNfcReader(context, onNcfScan: (String? nfcId) async { if (Platform.isIOS) {
print(nfcId); Utils.readNFc(onRead: (String nfcId) async {
Utils.showLoading(context); Utils.showLoading(context);
try { try {
GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 2, nfcValue: nfcId ?? "", isGpsRequired: isNfcLocationEnabled, lat: lat, long: lng); GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 2, nfcValue: nfcId, isGpsRequired: isNfcLocationEnabled, lat: lat, long: lng);
bool status = await model.fetchAttendanceTracking(context); bool status = await model.fetchAttendanceTracking(context);
Utils.hideLoading(context); Utils.hideLoading(context);
showMDialog( showMDialog(
context, context,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
isDismissable: false, isDismissable: false,
child: SuccessDialog(widget.isFromDashboard), child: SuccessDialog(widget.isFromDashboard),
); );
} catch (ex) { } catch (ex) {
print(ex); print(ex);
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.handleException(ex, context, (msg) { Utils.handleException(ex, context, (msg) {
Utils.confirmDialog(context, msg); Utils.confirmDialog(context, msg);
}); });
} }
}); });
} else {
showNfcReader(context, onNcfScan: (String? nfcId) async {
print(nfcId);
Utils.showLoading(context);
try {
GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 2, nfcValue: nfcId ?? "", isGpsRequired: isNfcLocationEnabled, lat: lat, long: lng);
bool status = await model.fetchAttendanceTracking(context);
Utils.hideLoading(context);
showMDialog(
context,
backgroundColor: Colors.transparent,
isDismissable: false,
child: SuccessDialog(widget.isFromDashboard),
);
} catch (ex) {
print(ex);
Utils.hideLoading(context);
Utils.handleException(ex, context, (msg) {
Utils.confirmDialog(context, msg);
});
}
});
}
} }
Future<void> performWifiAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async { Future<void> performWifiAttendance(DashboardProviderModel model, {String lat = "0", String lng = "0"}) async {
@ -199,6 +224,7 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
}); });
} }
} else { } else {
Utils.hideLoading(context);
Utils.confirmDialog(context, LocaleKeys.comeNearHMGWifi.tr()); Utils.confirmDialog(context, LocaleKeys.comeNearHMGWifi.tr());
} }
} }
@ -264,8 +290,10 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
title.toText17(isBold: true, color: Colors.white), title.toText17(isBold: true, color: Colors.white),
], ],
), ),
).onPress(() { ).onPress(
if (!isEnabled) return; () {
onPress(); if (!isEnabled) return;
}); onPress();
},
);
} }

Loading…
Cancel
Save