diff --git a/android/app/build.gradle b/android/app/build.gradle index 596d981..a3de0ed 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -27,7 +27,7 @@ apply plugin: 'com.google.gms.google-services' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 31 + compileSdkVersion 32 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -46,7 +46,7 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "hmg.cloudSolutions.mohem" minSdkVersion 21 - targetSdkVersion 30 + targetSdkVersion 32 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 0ddf1eb..6bbb0ca 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/logos/bn_cloud_soloution.jpg b/assets/images/logos/bn_cloud_soloution.jpg new file mode 100644 index 0000000..844bc43 Binary files /dev/null and b/assets/images/logos/bn_cloud_soloution.jpg differ diff --git a/lib/api/dashboard_api_client.dart b/lib/api/dashboard_api_client.dart index 444eb21..dbfaa4e 100644 --- a/lib/api/dashboard_api_client.dart +++ b/lib/api/dashboard_api_client.dart @@ -92,7 +92,7 @@ class DashboardApiClient { } //Mark Attendance - Future markAttendance({String lat = "0", String? long = "0", required int pointType, String nfcValue = "", bool isGpsRequired = false}) async { + Future markAttendance({String lat = "0", String? long = "0", required int pointType, String nfcValue = "", bool isGpsRequired = false, String QRValue = ""}) async { String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC"; var uuid = Uuid(); // Generate a v4 (random) id @@ -101,7 +101,7 @@ class DashboardApiClient { "UID": uuid.v4(), //Mobile Id "Latitude": lat, "Longitude": long, - "QRValue": "", + "QRValue": QRValue, "PointType": pointType, // NFC=2, Wifi = 3, QR= 1, "NFCValue": nfcValue, "WifiValue": pointType == 3 ? "100" : "", diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 6dab1da..36ed7d3 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -65,6 +65,11 @@ extension EmailValidator on String { style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 17, letterSpacing: -0.68, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), ); + Widget toText20({Color? color, bool isBold = false}) => Text( + this, + style: TextStyle(height: 1, color: color ?? MyColors.darkTextColor, fontSize: 20, letterSpacing: -1.44, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), + ); + Widget toText22({Color? color, bool isBold = false}) => Text( this, style: TextStyle(height: 1, color: color ?? MyColors.darkTextColor, fontSize: 22, letterSpacing: -1.44, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), diff --git a/lib/main.dart b/lib/main.dart index 5e9f705..c894b70 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -30,7 +30,7 @@ Future main() async { await EasyLocalization.ensureInitialized(); await Firebase.initializeApp(); AppState().setPostParamsModel( - PostParamsModel(channel: 31, versionID: 3.6, mobileType: Platform.isAndroid ? "android" : "ios"), + PostParamsModel(channel: 31, versionID: 3.7, mobileType: Platform.isAndroid ? "android" : "ios"), ); runApp( EasyLocalization( diff --git a/lib/ui/dialogs/id/business_card_dialog.dart b/lib/ui/dialogs/id/business_card_dialog.dart new file mode 100644 index 0000000..9b6b50b --- /dev/null +++ b/lib/ui/dialogs/id/business_card_dialog.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; + +import '../../../app_state/app_state.dart'; +import '../../../classes/utils.dart'; + +class BusinessCardDialog extends StatelessWidget { + @override + Widget build(BuildContext context) { + return RotatedBox( + quarterTurns: 1, + child: Container( + width: MediaQuery.of(context).size.height / 2, + color: Colors.white, + margin: EdgeInsets.all(20), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Image.asset( + "assets/images/logos/bn_cloud_soloution.jpg", + width: 80, + height: 80, + ), + 12.height, + (AppState().memberInformationList!.eMPLOYEENAME ?? "").toText20(), + ], + ), + ), + Image.memory( + Utils.getPostBytes(AppState().memberInformationList!.businessCardQR ?? ""), + width: 100, + height: 100, + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 1.height, + (AppState().memberInformationList!.pOSITIONNAME ?? "").toText12(isBold: false), + 12.height, + (AppState().memberInformationList!.eMPLOYEENUMBER ?? "").toText12(isBold: false), + 1.height, + (AppState().memberInformationList!.eMPLOYEEEMAILADDRESS ?? "").toText12(isBold: false), + 1.height, + (AppState().memberInformationList!.jOBNAME ?? "").toText12(isBold: false), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/ui/dialogs/id/employee_digital_id_dialog.dart b/lib/ui/dialogs/id/employee_digital_id_dialog.dart new file mode 100644 index 0000000..e5db30c --- /dev/null +++ b/lib/ui/dialogs/id/employee_digital_id_dialog.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; +import 'package:qr_flutter/qr_flutter.dart'; + +import '../../../classes/utils.dart'; +import '../../../main.dart'; + +class EmployeeDigitialIdDialog extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Image.asset("assets/images/bn_logo.png"), + Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + children: [ + Container( + width: 80, + height: 80, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.all(Radius.circular(12)), + boxShadow: [BoxShadow(color: Colors.white60, blurRadius: 10, spreadRadius: 10)], + ), + clipBehavior: Clip.antiAlias, + child: Image.memory( + Utils.getPostBytes( + AppState().memberInformationList!.eMPLOYEEIMAGE ?? "", + ), + fit: BoxFit.cover, + ), + ), + 16.width, + (AppState().memberInformationList!.eMPLOYEENUMBER ?? "").toText20(), + ], + ), + Container( + width: double.infinity, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + 12.height, + (AppState().memberInformationList!.eMPLOYEENAME ?? "").toText16(), + 4.height, + (AppState().memberInformationList!.pOSITIONNAME ?? "").toText12(isBold: false), + ], + ), + ), + Image.memory( + Utils.getPostBytes(AppState().memberInformationList!.employeeQR ?? ""), + width: 160, + height: 160, + ), + DefaultButton("Cancel", () { + Navigator.pop(context); + }) + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart index 354e0db..00cfb54 100644 --- a/lib/ui/landing/dashboard_screen.dart +++ b/lib/ui/landing/dashboard_screen.dart @@ -29,6 +29,7 @@ class DashboardScreen extends StatefulWidget { class _DashboardScreenState extends State { late DashboardProviderModel data; final GlobalKey _scaffoldState = GlobalKey(); + @override void initState() { super.initState(); diff --git a/lib/ui/landing/today_attendance_screen.dart b/lib/ui/landing/today_attendance_screen.dart index 821b01c..1eed856 100644 --- a/lib/ui/landing/today_attendance_screen.dart +++ b/lib/ui/landing/today_attendance_screen.dart @@ -1,5 +1,6 @@ import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_countdown_timer/flutter_countdown_timer.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; @@ -14,6 +15,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/models/generic_response_model.dart'; import 'package:mohem_flutter_app/widgets/circular_step_progress_bar.dart'; +import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart'; import 'package:mohem_flutter_app/widgets/nfc/nfc_reader_sheet.dart'; import 'package:nfc_manager/nfc_manager.dart'; import 'package:provider/provider.dart'; @@ -21,6 +23,7 @@ import 'package:wifi_iot/wifi_iot.dart'; import '../../provider/dashboard_provider_model.dart'; import '../../widgets/location/Location.dart'; +import '../../widgets/qr_scanner_dialog.dart'; class TodayAttendanceScreen extends StatefulWidget { TodayAttendanceScreen({Key? key}) : super(key: key); @@ -34,7 +37,7 @@ class TodayAttendanceScreen extends StatefulWidget { class _TodayAttendanceScreenState extends State { ValueNotifier result = ValueNotifier(null); late DashboardProviderModel data; - bool isNfcEnabled = true, isNfcLocationEnabled = false, isQrEnabled = false, isQrLocationEnabled = false, isWifiEnabled = false, isWifiLocationEnabled = false; + bool isNfcEnabled = false, isNfcLocationEnabled = false, isQrEnabled = false, isQrLocationEnabled = false, isWifiEnabled = false, isWifiLocationEnabled = false; @override void initState() { @@ -190,25 +193,38 @@ class _TodayAttendanceScreenState extends State { padding: EdgeInsets.zero, gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 1 / 1, crossAxisSpacing: 8, mainAxisSpacing: 8), children: [ - 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); - } - }), - 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 (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); + }), ], ) ], @@ -273,6 +289,7 @@ class _TodayAttendanceScreenState extends State { } 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); @@ -302,6 +319,29 @@ class _TodayAttendanceScreenState extends State { return v; } + Future 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), @@ -318,7 +358,11 @@ class _TodayAttendanceScreenState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded(child: SvgPicture.asset(image)), + Expanded( + child: SvgPicture.asset( + image, + color: Colors.white, + )), title.toText17(isBold: true, color: Colors.white), ], ), diff --git a/lib/ui/landing/widget/app_drawer.dart b/lib/ui/landing/widget/app_drawer.dart index 4ef5eb4..ca49a2d 100644 --- a/lib/ui/landing/widget/app_drawer.dart +++ b/lib/ui/landing/widget/app_drawer.dart @@ -1,9 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:mohem_flutter_app/config/routes.dart'; +import 'package:mohem_flutter_app/ui/dialogs/id/employee_digital_id_dialog.dart'; import 'package:mohem_flutter_app/ui/landing/widget/drawer_item.dart'; import 'package:provider/provider.dart'; +import '../../../widgets/dialogs/dialogs.dart'; +import '../../dialogs/id/business_card_dialog.dart'; + class AppDrawer extends StatefulWidget { @override _AppDrawerState createState() => _AppDrawerState(); @@ -13,26 +17,58 @@ class _AppDrawerState extends State { @override Widget build(BuildContext context) { return Container( - color: Colors.white, - child: Drawer( - child: Column(children: [ - const SizedBox( - height: 200, - ), - Expanded( - child: ListView(padding: const EdgeInsets.all(21), physics: const BouncingScrollPhysics(), children: [ - Divider(), - InkWell( - child: DrawerItem( - 'My Profile', - icon: Icons.person, - color: Colors.grey, - ), - onTap: () { - drawerNavigator(context, AppRoutes.profile); - }) - ])) - ]))); + color: Colors.white, + child: Drawer( + child: Column( + children: [ + const SizedBox( + height: 200, + ), + Expanded( + child: ListView( + padding: const EdgeInsets.all(21), + physics: const BouncingScrollPhysics(), + children: [ + Divider(), + InkWell( + child: DrawerItem( + 'My Profile', + icon: Icons.person, + color: Colors.grey, + ), + onTap: () { + drawerNavigator(context, AppRoutes.profile); + }, + ), + Divider(), + InkWell( + child: DrawerItem( + 'Employee Digital ID', + icon: Icons.insert_drive_file_outlined, + color: Colors.grey, + ), + onTap: () { + showMDialog(context, child: EmployeeDigitialIdDialog()); + }, + ), + Divider(), + InkWell( + child: DrawerItem( + 'Business Card', + icon: Icons.insert_drive_file_outlined, + color: Colors.grey, + ), + onTap: () { + showMDialog(context, child: BusinessCardDialog()); + }, + ), + ], + ), + ) + ], + ), + ), + ); } drawerNavigator(context, routeName) { diff --git a/lib/ui/landing/widget/drawer_item.dart b/lib/ui/landing/widget/drawer_item.dart index 301719b..affbb1d 100644 --- a/lib/ui/landing/widget/drawer_item.dart +++ b/lib/ui/landing/widget/drawer_item.dart @@ -31,7 +31,7 @@ class _DrawerItemState extends State { if (widget.assetLink == null) Icon( widget.icon, - color: widget.color ?? Colors.black87, + color: widget.color, size: 25, ), Expanded( diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index b20ec58..d02fd74 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -132,10 +132,9 @@ class _LoginScreenState extends State { @override Widget build(BuildContext context) { - // username.text = "15153"; + username.text = "15153"; password.text = "Abcd@1234"; - username.text = "15444"; - + // username.text = "15444"; return Scaffold( body: Column( diff --git a/lib/ui/screens/profile/profile_screen.dart b/lib/ui/screens/profile/profile_screen.dart index 76f8a20..bf16fc6 100644 --- a/lib/ui/screens/profile/profile_screen.dart +++ b/lib/ui/screens/profile/profile_screen.dart @@ -38,53 +38,63 @@ class _ProfileScreenState extends State { backgroundColor: const Color(0xffefefef), body: Stack(children: [ Container( - height: 300, - margin: EdgeInsets.only(top: 50), - decoration: BoxDecoration(image: DecorationImage(image: MemoryImage(Utils.getPostBytes(memberInformationList.eMPLOYEEIMAGE)), fit: BoxFit.cover)), - child: new BackdropFilter( - filter: new ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), - child: new Container( - decoration: new BoxDecoration(color: Colors.white.withOpacity(0.0)), - ), - )), + height: 300, + margin: EdgeInsets.only(top: 50), + decoration: BoxDecoration(image: DecorationImage(image: MemoryImage(Utils.getPostBytes(memberInformationList.eMPLOYEEIMAGE)), fit: BoxFit.cover)), + child: new BackdropFilter( + filter: new ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), + child: new Container( + decoration: new BoxDecoration(color: Colors.white.withOpacity(0.0)), + ), + ), + ), SingleChildScrollView( scrollDirection: Axis.vertical, - child: Column(crossAxisAlignment: CrossAxisAlignment.center, children: [ - SizedBox( - height: 80, - ), - Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + height: 80, + ), + Container( padding: EdgeInsets.only(left: 15, right: 15), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: Icon( - Icons.arrow_back_ios, - color: Colors.white, - )), + onPressed: () { + Navigator.pop(context); + }, + icon: Icon( + Icons.arrow_back_ios, + color: Colors.white, + ), + ), InkWell( - onTap: () { - startImageSheet(); - }, - child: Container( - padding: EdgeInsets.only(left: 10, right: 10, top: 5, bottom: 5), - decoration: BoxDecoration(borderRadius: BorderRadius.circular(15), color: Colors.black.withOpacity(.3)), - child: Row(children: [ - Icon(Icons.photo, color: Colors.white), - Text( - 'Edit', - style: TextStyle(color: Colors.white, fontSize: 12), - ) - ]))), + onTap: () { + startImageSheet(); + }, + child: Container( + padding: EdgeInsets.only(left: 10, right: 10, top: 5, bottom: 5), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(15), color: Colors.black.withOpacity(.3)), + child: Row( + children: [ + Icon(Icons.photo, color: Colors.white), + Text( + 'Edit', + style: TextStyle(color: Colors.white, fontSize: 12), + ) + ], + ), + ), + ), ], - )), - HeaderPanel(memberInformationList), - ProfilePanle(memberInformationList) - ]), + ), + ), + HeaderPanel(memberInformationList), + ProfilePanle(memberInformationList) + ], + ), ) ])); } diff --git a/lib/ui/screens/profile/widgets/header.dart b/lib/ui/screens/profile/widgets/header.dart index ca3d829..abd5ce6 100644 --- a/lib/ui/screens/profile/widgets/header.dart +++ b/lib/ui/screens/profile/widgets/header.dart @@ -4,16 +4,19 @@ import 'package:mohem_flutter_app/models/member_information_list_model.dart'; class HeaderPanel extends StatelessWidget { HeaderPanel(this.memberInformationList); + late MemberInformationListModel memberInformationList; + @override Widget build(BuildContext context) { double _width = MediaQuery.of(context).size.width; return Container( - padding: EdgeInsets.symmetric(horizontal: _width / 10, vertical: 0), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [], - )); + padding: EdgeInsets.symmetric(horizontal: _width / 10, vertical: 0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [], + ), + ); } } diff --git a/lib/ui/screens/profile/widgets/profile_info.dart b/lib/ui/screens/profile/widgets/profile_info.dart index 6f30b7a..4cb338b 100644 --- a/lib/ui/screens/profile/widgets/profile_info.dart +++ b/lib/ui/screens/profile/widgets/profile_info.dart @@ -11,6 +11,7 @@ import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listv class ProfileInFo extends StatelessWidget { ProfileInFo(this.memberInfo); + MemberInformationListModel memberInfo; String data = '.'; double sliderValue = 75; @@ -24,68 +25,79 @@ class ProfileInFo extends StatelessWidget { ProfileMenu(name: LocaleKeys.profile_contactDetails.tr(), icon: 'contact-details.svg', route: AppRoutes.contactDetails, dynamicUrl: ''), ProfileMenu(name: LocaleKeys.profile_familyDetails.tr(), icon: 'family-members.svg', route: AppRoutes.familyMembers, dynamicUrl: ''), ]; + @override Widget build(BuildContext context) { return Container( - child: Column(crossAxisAlignment: CrossAxisAlignment.center, children: [ - /// card header - customLabel(memberInfo.eMPLOYEENAME.toString(), 22, Colors.black, true), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + /// card header + customLabel(memberInfo.eMPLOYEENAME.toString(), 22, Colors.black, true), - customLabel(memberInfo.eMPLOYEENUMBER.toString() + ' | ' + memberInfo.jOBNAME.toString(), 14, Colors.grey, false), + customLabel(memberInfo.eMPLOYEENUMBER.toString() + ' | ' + memberInfo.jOBNAME.toString(), 14, Colors.grey, false), - customLabel(memberInfo.eMPLOYEEEMAILADDRESS.toString(), 13, Colors.black, true), + customLabel(memberInfo.eMPLOYEEEMAILADDRESS.toString(), 13, Colors.black, true), - Divider(height: 40, thickness: 8, color: const Color(0xffefefef)), + Divider(height: 40, thickness: 8, color: const Color(0xffefefef)), - customLabel(LocaleKeys.completingYear.tr(), 10, Colors.black, true), + customLabel(LocaleKeys.completingYear.tr(), 10, Colors.black, true), - SizedBox(height: 10), - Container( - child: Row(mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Column( - children: [customLabel(LocaleKeys.year.tr(), 14, const Color(0xff808080), true), customLabel(memberInfo.sERVICEYEARS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)], - ), - Column( - children: [customLabel(LocaleKeys.month.tr(), 14, const Color(0xff808080), true), customLabel(memberInfo.sERVICEMONTHS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)], - ), - Column( - children: [customLabel(LocaleKeys.day.tr(), 14, const Color(0xff808080), true), customLabel(memberInfo.sERVICEDAYS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)], - ) - ])), + SizedBox(height: 10), + Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + children: [customLabel(LocaleKeys.year.tr(), 14, const Color(0xff808080), true), customLabel(memberInfo.sERVICEYEARS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)], + ), + Column( + children: [customLabel(LocaleKeys.month.tr(), 14, const Color(0xff808080), true), customLabel(memberInfo.sERVICEMONTHS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)], + ), + Column( + children: [customLabel(LocaleKeys.day.tr(), 14, const Color(0xff808080), true), customLabel(memberInfo.sERVICEDAYS.toString().padLeft(2, '0'), 22, Color(0xff2BB8A6), true)], + ) + ], + ), + ), - Divider(height: 40, thickness: 8, color: const Color(0xffefefef)), - Container( - padding: EdgeInsets.only( - left: 20, - right: 20, + Divider(height: 40, thickness: 8, color: const Color(0xffefefef)), + Container( + padding: EdgeInsets.only( + left: 20, + right: 20, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + customLabel(LocaleKeys.profile_profileCompletionPer.tr() + ' 75%', 18, Colors.black, true), + const SizedBox(height: 10), + Row( + children: [ + for (var i = 0; i < 4; i++) + if (i < 3) Expanded(child: drawSlider(Color(0xff2BB8A6))) else Expanded(child: drawSlider(const Color(0xffefefef))) + ], + ), + const SizedBox(height: 10), + Text( + LocaleKeys.profile_completeProfile.tr(), + style: TextStyle(color: Color(0xff2BB8A6), fontWeight: FontWeight.bold, decoration: TextDecoration.underline), + ), + ], + ), ), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - customLabel(LocaleKeys.profile_profileCompletionPer.tr() + ' 75%', 18, Colors.black, true), - const SizedBox(height: 10), - Row( - children: [ - for (var i = 0; i < 4; i++) - if (i < 3) Expanded(child: drawSlider(Color(0xff2BB8A6))) else Expanded(child: drawSlider(const Color(0xffefefef))) - ], - ), - const SizedBox(height: 10), - Text( - LocaleKeys.profile_completeProfile.tr(), - style: TextStyle(color: Color(0xff2BB8A6), fontWeight: FontWeight.bold, decoration: TextDecoration.underline), - ), - ], - )), - /// description - Divider(height: 50, thickness: 8, color: const Color(0xffefefef)), + /// description + Divider(height: 50, thickness: 8, color: const Color(0xffefefef)), - Column( - children: menu.map((i) => rowItem(i, context)).toList(), - ) - ])); + Column( + children: menu.map((i) => rowItem(i, context)).toList(), + ) + ], + ), + ); } Widget drawSlider(color) { diff --git a/lib/ui/screens/profile/widgets/profile_panel.dart b/lib/ui/screens/profile/widgets/profile_panel.dart index fd99abb..1facf52 100644 --- a/lib/ui/screens/profile/widgets/profile_panel.dart +++ b/lib/ui/screens/profile/widgets/profile_panel.dart @@ -6,7 +6,9 @@ import 'package:mohem_flutter_app/ui/screens/profile/widgets/profile_info.dart'; class ProfilePanle extends StatelessWidget { ProfilePanle(this.memberInformationList); + late MemberInformationListModel memberInformationList; + @override Widget build(BuildContext context) { double _width = MediaQuery.of(context).size.width; @@ -19,9 +21,10 @@ class ProfilePanle extends StatelessWidget { margin: EdgeInsets.only(top: 50), padding: EdgeInsets.only(top: 50), decoration: BoxDecoration( - color: Colors.white, - borderRadius: const BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), - boxShadow: [BoxShadow(color: Colors.white60, blurRadius: 10, spreadRadius: 10)]), + color: Colors.white, + borderRadius: const BorderRadius.only(topLeft: Radius.circular(25), topRight: Radius.circular(25)), + boxShadow: [BoxShadow(color: Colors.white60, blurRadius: 10, spreadRadius: 10)], + ), child: ProfileInFo(memberInformationList), ), Container(height: 100, alignment: Alignment.center, child: ProfileImage()) diff --git a/lib/widgets/dialogs/dialogs.dart b/lib/widgets/dialogs/dialogs.dart new file mode 100644 index 0000000..9a5a822 --- /dev/null +++ b/lib/widgets/dialogs/dialogs.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; + +void showMDialog( + context, { + Widget? child, +}) async { + return showDialog( + context: context, + barrierDismissible: true, + builder: (context) { + return Dialog( + child: child, + ); + }, + ); +} diff --git a/lib/widgets/qr_scanner_dialog.dart b/lib/widgets/qr_scanner_dialog.dart new file mode 100644 index 0000000..89a1912 --- /dev/null +++ b/lib/widgets/qr_scanner_dialog.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:qr_code_scanner/qr_code_scanner.dart'; + +import 'button/default_button.dart'; + +class QrScannerDialog extends StatefulWidget { + @override + State createState() => _QrScannerDialogState(); +} + +class _QrScannerDialogState extends State { + final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); + Barcode? result; + QRViewController? controller; + bool isPicked = false; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + width: double.infinity, + height: double.infinity, + color: Colors.white, + child: Column( + children: [ + Expanded( + flex: 1, + child: QRView( + key: qrKey, + onQRViewCreated: _onQRViewCreated, + ), + ), + // Expanded( + // flex: 1, + // child: Center( + // child: (result != null) + // ? Text( + // 'Barcode Type: ${result!.format} Data: ${result!.code}') + // : Text('Scan a code'), + // ), + // ), + Padding( + padding: const EdgeInsets.all(12.0), + child: DefaultButton( + "Cancel", + () { + Navigator.pop(context); + }, + ), + ), + ], + ), + ), + ); + } + + void _onQRViewCreated(QRViewController controller) { + this.controller = controller; + + controller.scannedDataStream.listen((scanData) { + setState(() { + result = scanData; + if (!isPicked) { + isPicked = true; + Navigator.pop(context, result!.code); + } + }); + }); + } + + @override + void dispose() { + controller?.dispose(); + super.dispose(); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 03cfb99..9f1a7af 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -64,6 +64,10 @@ dependencies: google_maps_flutter_web: ^0.3.2 open_file: ^3.2.1 wifi_iot: ^0.3.16 +# flutter_barcode_scanner: ^2.0.0 + qr_code_scanner: ^1.0.0 + qr_flutter: ^4.0.0 +