diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index bec7c28..0534f2b 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -32,8 +32,22 @@
NSCameraUsageDescription
This app requires camera access to capture & upload pictures.
+ NSFaceIDUsageDescription
+ This app requires Face ID to allow biometric authentication for app login.
NSPhotoLibraryUsageDescription
This app requires photo library access to select image as document & upload it.
+ NSLocationAlwaysAndWhenInUseUsageDescription
+ This App requires access to your location to mark your attendance.
+ NSLocationAlwaysUsageDescription
+ This App requires access to your location to mark your attendance.
+ NSLocationWhenInUseUsageDescription
+ This App requires access to your location to mark your attendance.
+ NFCReaderUsageDescription
+ This App requires access to NFC to mark your attendance.
+ UIBackgroundModes
+
+ remote-notification
+
UILaunchStoryboardName
LaunchScreen
UIMainStoryboardFile
@@ -53,5 +67,9 @@
UIViewControllerBasedStatusBarAppearance
+ com.apple.developer.nfc.readersession.felica.systemcodes
+
+ 0000
+
diff --git a/lib/classes/app_permissions.dart b/lib/classes/app_permissions.dart
index 983b400..1509b57 100644
--- a/lib/classes/app_permissions.dart
+++ b/lib/classes/app_permissions.dart
@@ -1,7 +1,12 @@
+import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
+import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/material.dart';
+import 'package:geolocator/geolocator.dart';
import 'package:permission_handler/permission_handler.dart';
-class AppPermissions{
- static void location(Function(bool) completion) {
+class AppPermissions {
+ static void location(Function(bool) completion, BuildContext context) {
Permission.location.isGranted.then((isGranted){
if(!isGranted){
Permission.location.request().then((granted){
@@ -10,21 +15,34 @@ class AppPermissions{
}
completion(isGranted);
});
-
}
- static void checkAll(Function(bool) completion){
- [
- Permission.location
- ].request().then((value){
+ static void showErrorLocationDialog(bool isPermissionError, BuildContext context) {
+ showDialog(
+ context: context,
+ builder: (cxt) => ConfirmDialog(
+ message: "Please provide location permission",
+ onTap: () {
+ if (isPermissionError) {
+ Geolocator.openAppSettings();
+ } else {
+ Geolocator.openLocationSettings();
+ }
+ Navigator.pop(context);
+ // createVacationRule(list);
+ },
+ ),
+ );
+ }
+ static void checkAll(Function(bool) completion) {
+ [Permission.location].request().then((value) {
bool allGranted = false;
value.values.forEach((element) {
allGranted = allGranted && element == PermissionStatus.granted;
});
completion(allGranted);
-
});
}
-}
\ No newline at end of file
+}
diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart
index 12f818e..17bd143 100644
--- a/lib/classes/consts.dart
+++ b/lib/classes/consts.dart
@@ -1,7 +1,7 @@
class ApiConsts {
//static String baseUrl = "http://10.200.204.20:2801/"; // Local server
- static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server
- // static String baseUrl = "https://hmgwebservices.com"; // Live server
+ // static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server
+ static String baseUrl = "https://hmgwebservices.com"; // Live server
static String baseUrlServices = baseUrl + "/Services/"; // server
// static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server
static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/";
diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart
index 0410536..70b3ce0 100644
--- a/lib/ui/landing/dashboard_screen.dart
+++ b/lib/ui/landing/dashboard_screen.dart
@@ -59,7 +59,6 @@ class _DashboardScreenState extends State {
@override
Widget build(BuildContext context) {
- List namesD = ["Nostalgia Perfume Perfume", "Al Nafoura", "AlJadi", "Nostalgia Perfume"];
GlobalKey _key = GlobalKey(); //
return Scaffold(
key: _scaffoldState,
@@ -71,15 +70,17 @@ class _DashboardScreenState extends State {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
- Image.memory(
+ Image.memory(
Utils.getPostBytes(
AppState().memberInformationList!.eMPLOYEEIMAGE ?? "",
),
- errorBuilder: (BuildContext context, error, stackTrace) {
+ errorBuilder: (BuildContext context, error, stackTrace) {
return SvgPicture.asset(
- "assets/images/user.svg", height: 34, width: 34,
- );
- },
+ "assets/images/user.svg",
+ height: 34,
+ width: 34,
+ );
+ },
width: 34,
height: 34,
fit: BoxFit.cover,
diff --git a/lib/ui/landing/widget/app_drawer.dart b/lib/ui/landing/widget/app_drawer.dart
index ebe3f7b..523c1cc 100644
--- a/lib/ui/landing/widget/app_drawer.dart
+++ b/lib/ui/landing/widget/app_drawer.dart
@@ -136,8 +136,8 @@ class _AppDrawerState extends State {
AppState().isAuthenticated = false;
AppState().isLogged = false;
AppState().setPostParamsInitConfig();
- SharedPreferences prefs = await SharedPreferences.getInstance();
- await prefs.clear();
- Navigator.pushNamedAndRemoveUntil(context, AppRoutes.login, (Route route) => false, arguments: false);
+ // SharedPreferences prefs = await SharedPreferences.getInstance();
+ // await prefs.clear();
+ Navigator.pushNamedAndRemoveUntil(context, AppRoutes.login, (Route route) => false, arguments: null);
}
}
diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart
index f50bb47..92a58db 100644
--- a/lib/ui/login/login_screen.dart
+++ b/lib/ui/login/login_screen.dart
@@ -50,7 +50,7 @@ class _LoginScreenState extends State {
@override
void initState() {
super.initState();
- // checkFirebaseToken();
+ // checkFirebaseToken();
}
@override
@@ -130,8 +130,8 @@ class _LoginScreenState extends State {
if (isAppOpenBySystem == null) {
isAppOpenBySystem = (ModalRoute.of(context)!.settings.arguments ?? true) as bool;
print('isAppOpenBySystem:$isAppOpenBySystem');
- username.text = "15153";
- password.text = "Abcd@12345";
+ // username.text = "15153";
+ // password.text = "Abcd@12345";
if (isAppOpenBySystem!) checkFirebaseToken();
}
diff --git a/lib/ui/login/verify_last_login_screen.dart b/lib/ui/login/verify_last_login_screen.dart
index faaf76e..7229b53 100644
--- a/lib/ui/login/verify_last_login_screen.dart
+++ b/lib/ui/login/verify_last_login_screen.dart
@@ -60,10 +60,10 @@ class _VerifyLastLoginScreenState extends State {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.transparent,
- leading: IconButton(
- icon: const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor),
- onPressed: () => Navigator.pop(context),
- ),
+ // leading: IconButton(
+ // icon: const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor),
+ // onPressed: () => Navigator.pop(context),
+ // ),
actions: [Center(child: "Employee Digital ID".toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {})), 21.width],
),
body: Column(
@@ -211,7 +211,7 @@ class _VerifyLastLoginScreenState extends State {
const IOSAuthMessages(cancelButton: 'cancel', goToSettingsButton: 'settings', goToSettingsDescription: 'Please set up your Touch ID.', lockOut: 'Please reenable your Touch ID');
bool authenticated = false;
try {
- authenticated = await auth.authenticate(localizedReason: 'Scan your fingerprint to authenticate', useErrorDialogs: true, stickyAuth: true, iOSAuthStrings: iosStrings);
+ authenticated = await auth.authenticate(localizedReason: 'Scan your fingerprint to authenticate', useErrorDialogs: true, stickyAuth: true, biometricOnly: true, iOSAuthStrings: iosStrings);
} on PlatformException catch (e) {
print(e);
Utils.hideLoading(context);
@@ -238,12 +238,13 @@ class _VerifyLastLoginScreenState extends State {
return;
} else {
if (mobileLoginInfoListModel!.loginType == 2 || mobileLoginInfoListModel!.loginType == 3) {
- bool authenticateWithFaceAndTouchID = await loginWithFaceIDAndBiometrics();
- if (!authenticateWithFaceAndTouchID) {
- return;
- } else {
- performApiCall(_title, _icon, _flag, isDirectLogin: true);
- }
+ // bool authenticateWithFaceAndTouchID = await loginWithFaceIDAndBiometrics();
+ // if (!authenticateWithFaceAndTouchID) {
+ // return;
+ // } else {
+ // performApiCall(_title, _icon, _flag, isDirectLogin: true);
+ // }
+ performApiCall(_title, _icon, _flag, isDirectLogin: true);
} else {
isNeedVerifyWithFaceIDAndBiometrics = true;
selectedFlag = _flag;
diff --git a/lib/ui/login/verify_login_screen.dart b/lib/ui/login/verify_login_screen.dart
index 1d66df9..a713c0f 100644
--- a/lib/ui/login/verify_login_screen.dart
+++ b/lib/ui/login/verify_login_screen.dart
@@ -517,7 +517,7 @@ class _VerifyLoginScreenState extends State {
const IOSAuthMessages(cancelButton: 'cancel', goToSettingsButton: 'settings', goToSettingsDescription: 'Please set up your Touch ID.', lockOut: 'Please reenable your Touch ID');
bool authenticated = false;
try {
- authenticated = await auth.authenticate(localizedReason: 'Scan your fingerprint to authenticate', useErrorDialogs: true, stickyAuth: true, iOSAuthStrings: iosStrings);
+ authenticated = await auth.authenticate(localizedReason: 'Scan your fingerprint to authenticate', useErrorDialogs: true, stickyAuth: true, biometricOnly: true, iOSAuthStrings: iosStrings);
} on PlatformException catch (e) {
print(e);
Utils.hideLoading(context);
diff --git a/lib/ui/my_team/view_attendance.dart b/lib/ui/my_team/view_attendance.dart
index 80b6b73..5d55ee8 100644
--- a/lib/ui/my_team/view_attendance.dart
+++ b/lib/ui/my_team/view_attendance.dart
@@ -14,8 +14,8 @@ import 'package:mohem_flutter_app/models/get_schedule_shifts_details_list_model.
import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart';
import 'package:mohem_flutter_app/models/my_team/get_employee_subordinates_list.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
-import 'package:month_picker_dialog_2/month_picker_dialog_2.dart';
import 'package:mohem_flutter_app/widgets/circular_step_progress_bar.dart';
+import 'package:month_picker_dialog_2/month_picker_dialog_2.dart';
import 'package:pie_chart/pie_chart.dart';
import 'package:syncfusion_flutter_calendar/calendar.dart';
@@ -405,6 +405,7 @@ class _ViewAttendanceState extends State {
);
}
+
void calendarTapped(CalendarTapDetails details) async {
dynamic index = details.date?.day;
if (index != null) {
@@ -425,214 +426,213 @@ class _ViewAttendanceState extends State {
}
if (details.date!.month == formattedDate.month && details.date!.year == formattedDate.year) {
int val = details.date!.day;
- getDayHoursTypeDetailsList?[val - 1].aTTENDEDFLAG == 'Y'
- ? showModalBottomSheet(
- context: context,
- shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)),
- isScrollControlled: true,
- backgroundColor: MyColors.backgroundBlackColor,
- builder: (_) {
- return DraggableScrollableSheet(
- maxChildSize: 0.9,
- expand: false,
- builder: (_, controller) {
- dynamic dmyString = getScheduleShiftsDetailsList!.sCHEDULEDATE;
- DateTime dateTime1 = DateFormat("MM/dd/yyyy hh:mm:ss a").parse(dmyString);
- return Column(
- children: [
- Container(
- width: 49,
- height: 7,
- margin: const EdgeInsets.symmetric(vertical: 10),
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(25),
- color: MyColors.darkGreyColor,
- ),
- ),
- Expanded(
- child: ListView.builder(
- controller: controller,
- itemCount: 1,
- itemBuilder: (_, i) => Container(
- decoration: const BoxDecoration(
- borderRadius: BorderRadius.vertical(
- top: Radius.circular(25.0),
- ),
- color: MyColors.backgroundBlackColor,
+ getDayHoursTypeDetailsList?[val - 1].aTTENDEDFLAG == 'Y' ?
+ showModalBottomSheet(
+ context: context,
+ shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)),
+ isScrollControlled: true,
+ backgroundColor: MyColors.backgroundBlackColor,
+ builder: (_) {
+ return DraggableScrollableSheet(
+ maxChildSize: 0.9,
+ expand: false,
+ builder: (_, controller) {
+ dynamic dmyString = getScheduleShiftsDetailsList!.sCHEDULEDATE;
+ DateTime dateTime1 = DateFormat("MM/dd/yyyy hh:mm:ss a").parse(dmyString);
+ return Column(
+ children: [
+ Container(
+ width: 49,
+ height: 7,
+ margin: const EdgeInsets.symmetric(vertical: 10),
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(25),
+ color: MyColors.darkGreyColor,
+ ),
+ ),
+ Expanded(
+ child: ListView.builder(
+ controller: controller,
+ itemCount: 1,
+ itemBuilder: (_, i) =>
+ Container(
+ decoration: const BoxDecoration(
+ borderRadius: BorderRadius.vertical(
+ top: Radius.circular(25.0),
),
- child: Column(
- children: [
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- "${DateFormat("MMMM-dd-yyyy").format(dateTime1).replaceAll('-', " ")}".toText24(isBold: true, color: Colors.white),
- LocaleKeys.attendanceDetails.tr().toText16(color: MyColors.greyACColor),
- 12.height,
- CircularStepProgressBar(
- totalSteps: 16 * 4,
- currentStep: percentage,
- width: 224,
- height: 236,
- selectedColor: MyColors.gradiantEndColor,
- unselectedColor: MyColors.grey70Color,
- child: Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- "${getScheduleShiftsDetailsList!.pERCENTAGE}".toText44(color: Colors.white, isBold: true),
- LocaleKeys.completed.tr().toText11(color: MyColors.greyACColor),
- 28.height,
- LocaleKeys.shiftTime.tr().toText11(color: MyColors.greyACColor),
- "${getScheduleShiftsDetailsList!.sHTNAME}".toText22(color: Colors.white, isBold: true),
- ],
- ).center,
+ color: MyColors.backgroundBlackColor,
+ ),
+ child: Column(
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ "${DateFormat("MMMM-dd-yyyy").format(dateTime1).replaceAll('-', " ")}".toText24(isBold: true, color: Colors.white),
+ LocaleKeys.attendanceDetails.tr().toText16(color: MyColors.greyACColor),
+ 12.height,
+ CircularStepProgressBar(
+ totalSteps: 16 * 4,
+ currentStep: percentage,
+ width: 224,
+ height: 236,
+ selectedColor: MyColors.gradiantEndColor,
+ unselectedColor: MyColors.grey70Color,
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ "${getScheduleShiftsDetailsList!.pERCENTAGE}".toText44(color: Colors.white, isBold: true),
+ LocaleKeys.completed.tr().toText11(color: MyColors.greyACColor),
+ 28.height,
+ LocaleKeys.shiftTime.tr().toText11(color: MyColors.greyACColor),
+ "${getScheduleShiftsDetailsList!.sHTNAME}".toText22(color: Colors.white, isBold: true),
+ ],
).center,
- ],
- ).paddingOnly(left: 21, right: 21, top: 27, bottom: 37),
- Stack(
- children: [
- Container(
- width: double.infinity,
- decoration: const BoxDecoration(borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), color: Colors.white),
- padding: const EdgeInsets.only(left: 31, right: 31, top: 30, bottom: 29),
- child: Column(
- children: [
- Row(
- children: [
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- LocaleKeys.actualCheckIn.tr().toText11(
- color: MyColors.grey67Color,
- ),
- "${getScheduleShiftsDetailsList!.sHTACTUALSTARTTIME}" != ""
- ? "${getScheduleShiftsDetailsList!.sHTACTUALSTARTTIME}".toText22(color: Colors.black, isBold: true)
- : "__".toText22(color: Colors.black, isBold: true),
- ],
- ).expanded,
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- LocaleKeys.actualCheckOut.tr().toText11(
- color: MyColors.grey67Color,
- ),
- "${getScheduleShiftsDetailsList!.sHTACTUALENDTIME}" != ""
- ? "${getScheduleShiftsDetailsList!.sHTACTUALENDTIME}".toText22(color: Colors.black, isBold: true)
- : "__".toText22(color: Colors.black, isBold: true),
- ],
- ).expanded,
- ],
- ),
- 25.height,
- const Divider(
- height: 1,
- thickness: 1,
- color: MyColors.lightGreyEFColor,
- ),
- 25.height,
- Row(
- children: [
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- LocaleKeys.approvedCheckIn.tr().toText11(
- color: MyColors.grey67Color,
- ),
- "${getScheduleShiftsDetailsList!.aPPROVEDSTARTTIME}" != ""
- ? "${getScheduleShiftsDetailsList!.aPPROVEDSTARTTIME}".toText22(color: MyColors.greenColor, isBold: true)
- : "__".toText22(color: MyColors.greenColor, isBold: true),
- ],
- ).expanded,
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- LocaleKeys.approvedCheckOut.tr().toText11(
- color: MyColors.grey67Color,
- ),
- "${getScheduleShiftsDetailsList!.aPPROVEDENDTIME}" != ""
- ? "${getScheduleShiftsDetailsList!.aPPROVEDENDTIME}".toText22(color: MyColors.greenColor, isBold: true)
- : "__".toText22(color: MyColors.greenColor, isBold: true),
- ],
- ).expanded,
- ],
- ),
- 25.height,
- const Divider(
- height: 1,
- thickness: 1,
- color: MyColors.lightGreyEFColor,
- ),
- 25.height,
- Row(
- children: [
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- LocaleKeys.lateIn.tr().toText11(
- color: MyColors.grey67Color,
- ),
- "${getDayHoursTypeDetailsList[index].lATEINHRS}".toText22(color: MyColors.redColor, isBold: true),
- ],
- ).expanded,
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- LocaleKeys.excess.tr().toText11(
- color: MyColors.grey67Color,
- ),
- "${getDayHoursTypeDetailsList[index].eXCESSHRS}".toText22(color: MyColors.backgroundBlackColor, isBold: true),
- ],
- ).expanded,
- ],
- ),
- 25.height,
- const Divider(
- height: 1,
- thickness: 1,
- color: MyColors.lightGreyEFColor,
- ),
- 25.height,
- Row(
- children: [
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- LocaleKeys.shortage.tr().toText11(
- color: MyColors.grey67Color,
- ),
- "${getDayHoursTypeDetailsList[index].sHORTAGEHRS}".toText22(color: MyColors.backgroundBlackColor, isBold: true),
- ],
- ).expanded,
- Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- LocaleKeys.earlyOut.tr().toText11(
- color: MyColors.grey67Color,
- ),
- "${getDayHoursTypeDetailsList[index].eARLYOUTHRS}".toText22(color: Colors.black, isBold: true),
- ],
- ).expanded,
- ],
- ),
- ],
- ),
+ ).center,
+ ],
+ ).paddingOnly(left: 21, right: 21, top: 27, bottom: 37),
+ Stack(
+ children: [
+ Container(
+ width: double.infinity,
+ decoration: const BoxDecoration(borderRadius: BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), color: Colors.white),
+ padding: const EdgeInsets.only(left: 31, right: 31, top: 30, bottom: 29),
+ child: Column(
+ children: [
+ Row(
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ LocaleKeys.actualCheckIn.tr().toText11(
+ color: MyColors.grey67Color,
+ ),
+ "${getScheduleShiftsDetailsList!.sHTACTUALSTARTTIME}" != ""
+ ? "${getScheduleShiftsDetailsList!.sHTACTUALSTARTTIME}".toText22(color: Colors.black, isBold: true)
+ : "__".toText22(color: Colors.black, isBold: true),
+ ],
+ ).expanded,
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ LocaleKeys.actualCheckOut.tr().toText11(
+ color: MyColors.grey67Color,
+ ),
+ "${getScheduleShiftsDetailsList!.sHTACTUALENDTIME}" != ""
+ ? "${getScheduleShiftsDetailsList!.sHTACTUALENDTIME}".toText22(color: Colors.black, isBold: true)
+ : "__".toText22(color: Colors.black, isBold: true),
+ ],
+ ).expanded,
+ ],
+ ),
+ 25.height,
+ const Divider(
+ height: 1,
+ thickness: 1,
+ color: MyColors.lightGreyEFColor,
+ ),
+ 25.height,
+ Row(
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ LocaleKeys.approvedCheckIn.tr().toText11(
+ color: MyColors.grey67Color,
+ ),
+ "${getScheduleShiftsDetailsList!.aPPROVEDSTARTTIME}" != ""
+ ? "${getScheduleShiftsDetailsList!.aPPROVEDSTARTTIME}".toText22(color: MyColors.greenColor, isBold: true)
+ : "__".toText22(color: MyColors.greenColor, isBold: true),
+ ],
+ ).expanded,
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ LocaleKeys.approvedCheckOut.tr().toText11(
+ color: MyColors.grey67Color,
+ ),
+ "${getScheduleShiftsDetailsList!.aPPROVEDENDTIME}" != ""
+ ? "${getScheduleShiftsDetailsList!.aPPROVEDENDTIME}".toText22(color: MyColors.greenColor, isBold: true)
+ : "__".toText22(color: MyColors.greenColor, isBold: true),
+ ],
+ ).expanded,
+ ],
+ ),
+ 25.height,
+ const Divider(
+ height: 1,
+ thickness: 1,
+ color: MyColors.lightGreyEFColor,
+ ),
+ 25.height,
+ Row(
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ LocaleKeys.lateIn.tr().toText11(
+ color: MyColors.grey67Color,
+ ),
+ "${getDayHoursTypeDetailsList[index].lATEINHRS}".toText22(color: MyColors.redColor, isBold: true),
+ ],
+ ).expanded,
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ LocaleKeys.excess.tr().toText11(
+ color: MyColors.grey67Color,
+ ),
+ "${getDayHoursTypeDetailsList[index].eXCESSHRS}".toText22(color: MyColors.backgroundBlackColor, isBold: true),
+ ],
+ ).expanded,
+ ],
+ ),
+ 25.height,
+ const Divider(
+ height: 1,
+ thickness: 1,
+ color: MyColors.lightGreyEFColor,
+ ),
+ 25.height,
+ Row(
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ LocaleKeys.shortage.tr().toText11(
+ color: MyColors.grey67Color,
+ ),
+ "${getDayHoursTypeDetailsList[index].sHORTAGEHRS}".toText22(color: MyColors.backgroundBlackColor, isBold: true),
+ ],
+ ).expanded,
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ LocaleKeys.earlyOut.tr().toText11(
+ color: MyColors.grey67Color,
+ ),
+ "${getDayHoursTypeDetailsList[index].eARLYOUTHRS}".toText22(color: Colors.black, isBold: true),
+ ],
+ ).expanded,
+ ],
+ ),
+ ],
),
- ],
- ),
- ],
- ),
+ ),
+ ],
+ ),
+ ],
),
),
- ),
- ],
- );
- },
- );
- },
- )
- : null;
+ ),
+ ),
+ ],
+ );
+ },
+ );
+ },
+ ):null;
}
}
-
List _getDataSource() {
List meetings = [];
return meetings;
diff --git a/lib/widgets/location/Location.dart b/lib/widgets/location/Location.dart
index 47e2238..0ddca1c 100644
--- a/lib/widgets/location/Location.dart
+++ b/lib/widgets/location/Location.dart
@@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:math';
import 'dart:ui';
+import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:geolocator/geolocator.dart';
@@ -45,7 +46,7 @@ class Location {
});
}
- static void getCurrentLocation(Function(LatLng?) callback) {
+ static void getCurrentLocation(Function(LatLng?) callback, BuildContext context) {
void done(Position position) {
//AppStorage.sp.saveLocation(position);
@@ -64,8 +65,10 @@ class Location {
done(value);
}
});
+ } else {
+ // AppPermissions
}
- });
+ }, context);
}
// static LatLng locationAwayFrom(
@@ -137,11 +140,11 @@ class _Map {
});
}
- void goToCurrentLocation({Completer? mapController, double? direction = 0.0, bool? animation}) {
- Location.getCurrentLocation((location) {
- moveTo(location!, zoom: 17, mapController: mapController!, animation: animation, direction: direction!);
- });
- }
+ // void goToCurrentLocation({Completer? mapController, double? direction = 0.0, bool? animation}) {
+ // Location.getCurrentLocation((location) {
+ // moveTo(location!, zoom: 17, mapController: mapController!, animation: animation, direction: direction!);
+ // });
+ // }
var routes = Map();
diff --git a/lib/widgets/mark_attendance_widget.dart b/lib/widgets/mark_attendance_widget.dart
index a3ed0d5..08e7c5e 100644
--- a/lib/widgets/mark_attendance_widget.dart
+++ b/lib/widgets/mark_attendance_widget.dart
@@ -90,7 +90,7 @@ class _MarkAttendanceWidgetState extends State {
if (isNfcLocationEnabled) {
Location.getCurrentLocation((LatLng? latlng) {
performNfcAttendance(widget.model, lat: latlng?.latitude.toString() ?? "", lng: latlng?.longitude.toString() ?? "");
- });
+ }, context);
} else {
performNfcAttendance(widget.model);
}
@@ -100,7 +100,7 @@ class _MarkAttendanceWidgetState extends State {
if (isWifiLocationEnabled) {
Location.getCurrentLocation((LatLng? latlng) {
performWifiAttendance(widget.model, lat: latlng?.latitude.toString() ?? "", lng: latlng?.longitude.toString() ?? "");
- });
+ }, context);
} else {
performWifiAttendance(widget.model);
}
@@ -111,7 +111,7 @@ class _MarkAttendanceWidgetState extends State {
if (isQrLocationEnabled) {
Location.getCurrentLocation((LatLng? latlng) {
performQrCodeAttendance(widget.model, lat: latlng?.latitude.toString() ?? "", lng: latlng?.longitude.toString() ?? "");
- });
+ }, context);
} else {
performQrCodeAttendance(widget.model);
}
@@ -158,16 +158,19 @@ class _MarkAttendanceWidgetState extends State {
bool isConnected =
await WiFiForIoTPlugin.connect(AppState().getMohemmWifiSSID ?? "", password: AppState().getMohemmWifiPassword ?? "", joinOnce: true, security: NetworkSecurity.WPA, withInternet: false);
if (isConnected) {
+ Utils.showLoading(context);
await WiFiForIoTPlugin.forceWifiUsage(true);
- Utils.showLoading(context);
+ await Future.delayed(Duration(seconds: 1));
+
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();
+ // await closeWifiRequest();
} catch (ex) {
- await closeWifiRequest();
+ print("performWifiAttendance: "+ex.toString());
+ // await closeWifiRequest();
Utils.hideLoading(context);
Utils.handleException(ex, context, (msg) {
Utils.confirmDialog(context, msg);
@@ -179,7 +182,8 @@ class _MarkAttendanceWidgetState extends State {
}
Future closeWifiRequest() async {
- await WiFiForIoTPlugin.forceWifiUsage(false);
+ // await WiFiForIoTPlugin.forceWifiUsage(false);
+ // Future.delayed(Duration(seconds: 2));
return await WiFiForIoTPlugin.disconnect();
}
diff --git a/lib/widgets/nfc/nfc_reader_sheet.dart b/lib/widgets/nfc/nfc_reader_sheet.dart
index eff0b56..4ac055b 100644
--- a/lib/widgets/nfc/nfc_reader_sheet.dart
+++ b/lib/widgets/nfc/nfc_reader_sheet.dart
@@ -1,4 +1,5 @@
import 'dart:async';
+import 'dart:io';
import 'package:flutter/material.dart';
import 'package:nfc_manager/nfc_manager.dart';
@@ -41,9 +42,13 @@ class _NfcLayoutState extends State {
NfcManager.instance.startSession(onDiscovered: (NfcTag tag) async {
print(tag.data);
- var f = MifareUltralight(tag: tag, identifier: tag.data["nfca"]["identifier"], type: 2, maxTransceiveLength: 252, timeout: 22);
+ 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('');
- // print(identifier); // => 0428fcf2255e81
nfcId = identifier;
setState(() {
@@ -54,8 +59,16 @@ class _NfcLayoutState extends State {
Future.delayed(const Duration(seconds: 1), () {
NfcManager.instance.stopSession();
Navigator.pop(context);
+ // if (Platform.isAndroid) {
+ // Navigator.pop(context);
+ // } else {
+ // Navigator.pop(context);
+ // Navigator.pop(context);
+ // }
widget.onNcfScan(nfcId);
});
+ }).catchError((err) {
+ print(err);
});
}
diff --git a/pubspec.yaml b/pubspec.yaml
index 3c9d1d8..14c034a 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,4 +1,5 @@
name: mohem_flutter_app
+
description: A new Flutter application.
# The following line prevents the package from being accidentally published to
@@ -52,7 +53,7 @@ dependencies:
shimmer: ^2.0.0
logger: ^1.1.0
flutter_countdown_timer: ^4.1.0
- nfc_manager: ^3.2.0
+ nfc_manager: ^3.1.1
uuid: ^3.0.6
image_picker: ^0.8.5+3
file_picker: ^4.6.1
@@ -60,11 +61,11 @@ dependencies:
google_maps_flutter: ^2.0.2
google_maps_utils: ^1.4.0+1
google_directions_api: ^0.9.0
- geolocator: any
+ geolocator: ^9.0.2
# flutter_compass: ^0.6.1
google_maps_flutter_web: ^0.3.2
month_year_picker: ^0.2.0+1
- month_picker_dialog_2: ^0.5.5
+ month_picker_dialog_2: 0.5.5
open_file: ^3.2.1
wifi_iot: ^0.3.16
flutter_html: ^2.2.1