From 0974861463116a1338fa1985342316c26f7e2850 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Tue, 10 May 2022 16:47:59 +0300 Subject: [PATCH] updated menus --- lib/api/eit_api_client.dart | 31 +++++ lib/config/routes.dart | 5 + lib/main.dart | 4 +- lib/models/eit/get_eit_transaction_model.dart | 103 ++++++++++++++++ lib/provider/eit_provider_model.dart | 35 ++++++ lib/ui/landing/widget/missing_swipe.dart | 110 ++++++++++++++++++ lib/ui/screens/eit/add_eit.dart | 63 ++++++++++ lib/ui/screens/submenu_screen.dart | 19 ++- 8 files changed, 358 insertions(+), 12 deletions(-) create mode 100644 lib/api/eit_api_client.dart create mode 100644 lib/models/eit/get_eit_transaction_model.dart create mode 100644 lib/provider/eit_provider_model.dart create mode 100644 lib/ui/landing/widget/missing_swipe.dart create mode 100644 lib/ui/screens/eit/add_eit.dart diff --git a/lib/api/eit_api_client.dart b/lib/api/eit_api_client.dart new file mode 100644 index 0000000..e3f78bf --- /dev/null +++ b/lib/api/eit_api_client.dart @@ -0,0 +1,31 @@ +import 'dart:async'; + +import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/classes/consts.dart'; +import 'package:mohem_flutter_app/models/basic_member_information_model.dart'; +import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart'; +import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; +import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart'; +import 'package:mohem_flutter_app/models/eit/get_eit_transaction_model.dart'; +import 'package:mohem_flutter_app/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/member_login_list_model.dart'; + +import 'api_client.dart'; + +class EITApiClient { + static final EITApiClient _instance = EITApiClient._internal(); + + EITApiClient._internal(); + + factory EITApiClient() => _instance; + + Future?> getEITTransactions(String functionName) async { + String url = "${ApiConsts.erpRest}GET_EIT_TRANSACTIONS"; + Map postParams = {'P_FUNCTION_NAME': functionName, "P_MENU_TYPE": "E", "P_PAGE_LIMIT": 50, "P_PAGE_NUM": 1}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + List? responseData = GET_EIT_Transactions_Model.fromJson(json['GetEITTransactionList'][0]).collectionTransaction; + return responseData; + }, url, postParams); + } +} diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 26a1bfe..aa3fcee 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -6,6 +6,7 @@ import 'package:mohem_flutter_app/ui/login/login_screen.dart'; import 'package:mohem_flutter_app/ui/login/new_password_screen.dart'; import 'package:mohem_flutter_app/ui/login/verify_last_login_screen.dart'; import 'package:mohem_flutter_app/ui/login/verify_login_screen.dart'; +import 'package:mohem_flutter_app/ui/screens/eit/add_eit.dart'; import 'package:mohem_flutter_app/ui/screens/submenu_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/missing_swipe/missing_swipe_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/work_list_screen.dart'; @@ -23,6 +24,7 @@ class AppRoutes { static const String dashboard = "/dashboard"; static const String todayAttendance = "/todayAttendance"; static const String subMenuScreen = "/submenuScreen"; + static const String addEitScreen = "/addeitScreen"; static const String initialRoute = login; //Work List @@ -39,6 +41,9 @@ class AppRoutes { newPassword: (context) => NewPasswordScreen(), forgotPassword: (context) => ForgotPasswordScreen(), todayAttendance: (context) => TodayAttendanceScreen(), + //eit + + addEitScreen: (context) => AddEITScreen(), //Work List workList: (context) => WorkListScreen(), diff --git a/lib/main.dart b/lib/main.dart index 49b0e35..6e6ead2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,6 +7,7 @@ import 'package:mohem_flutter_app/config/app_provider.dart'; import 'package:mohem_flutter_app/generated/codegen_loader.g.dart'; import 'package:mohem_flutter_app/models/post_params_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; +import 'package:mohem_flutter_app/provider/eit_provider_model.dart'; import 'package:mohem_flutter_app/theme/app_theme.dart'; import 'package:provider/provider.dart'; import 'package:sizer/sizer.dart'; @@ -14,14 +15,12 @@ import 'package:firebase_core/firebase_core.dart'; import 'config/routes.dart'; import 'package:logger/logger.dart'; - var logger = Logger( // filter: null, // Use the default LogFilter (-> only log in debug mode) printer: PrettyPrinter(lineLength: 0), // Use the PrettyPrinter to format and print log // output: null, // U ); - Future main() async { WidgetsFlutterBinding.ensureInitialized(); await EasyLocalization.ensureInitialized(); @@ -37,6 +36,7 @@ Future main() async { child: MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => DashboardProviderModel()), + ChangeNotifierProvider(create: (_) => EITProviderModel()), ], child: MyApp(), ), diff --git a/lib/models/eit/get_eit_transaction_model.dart b/lib/models/eit/get_eit_transaction_model.dart new file mode 100644 index 0000000..186ef9c --- /dev/null +++ b/lib/models/eit/get_eit_transaction_model.dart @@ -0,0 +1,103 @@ +class GET_EIT_Transactions_Model { + List? collectionTransaction; + + GET_EIT_Transactions_Model({this.collectionTransaction}); + + GET_EIT_Transactions_Model.fromJson(Map json) { + if (json['Collection_Transaction'] != null) { + collectionTransaction = []; + json['Collection_Transaction'].forEach((v) { + collectionTransaction!.add(new CollectionTransaction.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + if (this.collectionTransaction != null) { + data['Collection_Transaction'] = this.collectionTransaction!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class CollectionTransaction { + String? aPPLICATIONCOLUMNNAME; + String? dATATYPE; + String? dATEVALUE; + String? dESCFLEXCONTEXTCODE; + String? dESCFLEXNAME; + String? dISPLAYFLAG; + int? fROMROWNUM; + int? nOOFROWS; + dynamic? nUMBERVALUE; + int? rOWNUM; + String? sEGMENTNAME; + String? sEGMENTPROMPT; + int? sEGMENTSEQNUM; + String? sEGMENTVALUEDSP; + int? tOROWNUM; + int? tRANSACTIONNUMBER; + String? vARCHAR2VALUE; + + CollectionTransaction( + {this.aPPLICATIONCOLUMNNAME, + this.dATATYPE, + this.dATEVALUE, + this.dESCFLEXCONTEXTCODE, + this.dESCFLEXNAME, + this.dISPLAYFLAG, + this.fROMROWNUM, + this.nOOFROWS, + this.nUMBERVALUE, + this.rOWNUM, + this.sEGMENTNAME, + this.sEGMENTPROMPT, + this.sEGMENTSEQNUM, + this.sEGMENTVALUEDSP, + this.tOROWNUM, + this.tRANSACTIONNUMBER, + this.vARCHAR2VALUE}); + + CollectionTransaction.fromJson(Map json) { + aPPLICATIONCOLUMNNAME = json['APPLICATION_COLUMN_NAME']; + dATATYPE = json['DATATYPE']; + dATEVALUE = json['DATE_VALUE']; + dESCFLEXCONTEXTCODE = json['DESC_FLEX_CONTEXT_CODE']; + dESCFLEXNAME = json['DESC_FLEX_NAME']; + dISPLAYFLAG = json['DISPLAY_FLAG']; + fROMROWNUM = json['FROM_ROW_NUM']; + nOOFROWS = json['NO_OF_ROWS']; + nUMBERVALUE = json['NUMBER_VALUE']; + rOWNUM = json['ROW_NUM']; + sEGMENTNAME = json['SEGMENT_NAME']; + sEGMENTPROMPT = json['SEGMENT_PROMPT']; + sEGMENTSEQNUM = json['SEGMENT_SEQ_NUM']; + sEGMENTVALUEDSP = json['SEGMENT_VALUE_DSP']; + tOROWNUM = json['TO_ROW_NUM']; + tRANSACTIONNUMBER = json['TRANSACTION_NUMBER']; + vARCHAR2VALUE = json['VARCHAR2_VALUE']; + } + + Map toJson() { + final Map data = new Map(); + data['APPLICATION_COLUMN_NAME'] = this.aPPLICATIONCOLUMNNAME; + data['DATATYPE'] = this.dATATYPE; + data['DATE_VALUE'] = this.dATEVALUE; + data['DESC_FLEX_CONTEXT_CODE'] = this.dESCFLEXCONTEXTCODE; + data['DESC_FLEX_NAME'] = this.dESCFLEXNAME; + data['DISPLAY_FLAG'] = this.dISPLAYFLAG; + data['FROM_ROW_NUM'] = this.fROMROWNUM; + data['NO_OF_ROWS'] = this.nOOFROWS; + data['NUMBER_VALUE'] = this.nUMBERVALUE; + data['ROW_NUM'] = this.rOWNUM; + data['SEGMENT_NAME'] = this.sEGMENTNAME; + data['SEGMENT_PROMPT'] = this.sEGMENTPROMPT; + data['SEGMENT_SEQ_NUM'] = this.sEGMENTSEQNUM; + data['SEGMENT_VALUE_DSP'] = this.sEGMENTVALUEDSP; + data['TO_ROW_NUM'] = this.tOROWNUM; + data['TRANSACTION_NUMBER'] = this.tRANSACTIONNUMBER; + data['VARCHAR2_VALUE'] = this.vARCHAR2VALUE; + return data; + } +} diff --git a/lib/provider/eit_provider_model.dart b/lib/provider/eit_provider_model.dart new file mode 100644 index 0000000..664e5cc --- /dev/null +++ b/lib/provider/eit_provider_model.dart @@ -0,0 +1,35 @@ +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/dashboard_api_client.dart'; +import 'package:mohem_flutter_app/api/eit_api_client.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/main.dart'; +import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; +import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart'; +import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; +import 'package:mohem_flutter_app/models/dashboard/menus.dart'; +import 'package:mohem_flutter_app/models/eit/get_eit_transaction_model.dart'; +import 'package:mohem_flutter_app/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/widgets/Updater.dart'; + +/// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for the devtool +// ignore: prefer_mixin +class EITProviderModel with ChangeNotifier, DiagnosticableTreeMixin { + List? eitTransactionList; + late bool isEitLoaded = false; + void getEITList(String functionName) async { + try { + eitTransactionList = await EITApiClient().getEITTransactions(functionName); + isEitLoaded = true; + + notifyListeners(); + } catch (ex) { + isEitLoaded = false; + logger.wtf(ex); + notifyListeners(); + Utils.handleException(ex, null); + } + } +} diff --git a/lib/ui/landing/widget/missing_swipe.dart b/lib/ui/landing/widget/missing_swipe.dart new file mode 100644 index 0000000..ebd011a --- /dev/null +++ b/lib/ui/landing/widget/missing_swipe.dart @@ -0,0 +1,110 @@ +import 'package:easy_localization/src/public_ext.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; +import 'package:mohem_flutter_app/models/dashboard/menus.dart'; +import 'package:mohem_flutter_app/models/eit/get_eit_transaction_model.dart'; +import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; +import 'package:mohem_flutter_app/provider/eit_provider_model.dart'; +import 'package:mohem_flutter_app/ui/work_list/work_list_screen.dart'; +import 'package:mohem_flutter_app/widgets/loading_dialog.dart'; +import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart'; +import 'package:provider/provider.dart'; + +class MissingSwipe extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Consumer( + builder: (context, data, child) { + return !data.isEitLoaded + ? LoadingDialog() + : SizedBox( + width: double.infinity, + height: double.infinity, + child: ListView.separated( + itemBuilder: (context, index) { + return rowItem(data.eitTransactionList![index]); + }, + separatorBuilder: (context, index) { + return 12.height; + }, + itemCount: data.eitTransactionList?.length ?? 0, + padding: EdgeInsets.only(left: 21, right: 21), + )); + }, + ); + } + + Widget rowItem(CollectionTransaction types) { + return InkWell( + onTap: () { + // Navigator.pushNamed(context, AppRoutes.missingSwipe); + }, + child: Container( + width: double.infinity, + padding: EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4), + gradient: LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomRight, colors: [Colors.red, Colors.blue]), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SvgPicture.asset( + "assets/images/miss_swipe.svg", + color: Colors.white, + ), + 2.height, + Text(types.aPPLICATIONCOLUMNNAME.toString()) + ], + ).paddingAll(6), + ), + 12.width, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Missing Swipe Request".toText16(), + "Missing Swipe Request for Hussain, Mohammad has been approved".toText10(), + 12.height, + Row( + children: [ + Expanded(child: "07 Jan 2021".toText10(color: MyColors.lightTextColor)), + SvgPicture.asset( + "assets/images/arrow_next.svg", + color: MyColors.darkIconColor, + ) + ], + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/ui/screens/eit/add_eit.dart b/lib/ui/screens/eit/add_eit.dart new file mode 100644 index 0000000..44918fb --- /dev/null +++ b/lib/ui/screens/eit/add_eit.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; +import 'package:mohem_flutter_app/models/dashboard/menus.dart'; +import 'package:mohem_flutter_app/provider/eit_provider_model.dart'; +import 'package:mohem_flutter_app/ui/app_bar.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/ui/landing/widget/missing_swipe.dart'; +import 'package:provider/provider.dart'; + +class AddEITScreen extends StatelessWidget { + late GetMenuEntriesList getMenu; + late EITProviderModel data; + + @override + Widget build(BuildContext context) { + getMenu = ModalRoute.of(context)!.settings.arguments as GetMenuEntriesList; + + data = Provider.of(context, listen: false); + data.getEITList(getMenu.functionName.toString()); + return DefaultTabController( + length: 2, + child: Scaffold( + backgroundColor: Colors.white, + appBar: appBar( + context, + title: getMenu.prompt.toString(), + ), + body: Container( + width: double.infinity, + height: double.infinity, + child: Column(children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only(bottomLeft: Radius.circular(20), bottomRight: Radius.circular(20)), + gradient: LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomRight, colors: [ + MyColors.gradiantEndColor, + MyColors.gradiantStartColor, + ]), + ), + clipBehavior: Clip.antiAlias, + child: TabBar( + indicatorColor: Colors.white, + labelColor: Colors.white, + tabs: [ + Tab( + text: "Missing Swipe", + ), + Tab( + text: "Swipe Request", + ), + ], + ), + ), + Expanded( + child: TabBarView( + children: [MissingSwipe(), Container()], + ), + ) + ])), + )); + } +} diff --git a/lib/ui/screens/submenu_screen.dart b/lib/ui/screens/submenu_screen.dart index bc9fbc9..0b3fdbd 100644 --- a/lib/ui/screens/submenu_screen.dart +++ b/lib/ui/screens/submenu_screen.dart @@ -1,19 +1,12 @@ -import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/config/routes.dart'; -import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; import 'package:mohem_flutter_app/models/dashboard/menus.dart'; import 'package:mohem_flutter_app/ui/app_bar.dart'; -import 'package:mohem_flutter_app/extensions/string_extensions.dart'; -import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; class SubMenuScreen extends StatelessWidget { late Menus menu; - @override Widget build(BuildContext context) { menu = ModalRoute.of(context)!.settings.arguments as Menus; @@ -27,14 +20,20 @@ class SubMenuScreen extends StatelessWidget { width: double.infinity, height: double.infinity, child: Column( - children: menu.menuEntiesList.map((i) => rowItem(i)).toList(), + children: menu.menuEntiesList.map((i) => rowItem(i, context)).toList(), )), ); } - Widget rowItem(GetMenuEntriesList obj) { + Widget rowItem(obj, context) { return InkWell( - onTap: () {}, + onTap: () { + Navigator.pushNamed( + context, + AppRoutes.addEitScreen, + arguments: obj, + ); + }, child: Container( width: double.infinity, padding: EdgeInsets.all(12),