Compare commits
	
		
			7 Commits 
		
	
	
		
			master
			...
			flutter_up
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | c191d4c0c0 | 1 week ago | 
|  | 0b08606813 | 1 week ago | 
|  | 107846dd82 | 2 weeks ago | 
|  | c7e44965d6 | 2 weeks ago | 
|  | cca95cee6a | 1 month ago | 
|  | 1bcecde59b | 2 months ago | 
|  | c8fa64171e | 2 months ago | 
| @ -0,0 +1,25 @@ | ||||
| import 'dart:convert'; | ||||
| 
 | ||||
| class GetTicketAccuralBalanceModel { | ||||
|   int? accrualNetEntitlement; | ||||
|   String? accuralPlanCode; | ||||
| 
 | ||||
|   GetTicketAccuralBalanceModel({ | ||||
|     this.accrualNetEntitlement, | ||||
|     this.accuralPlanCode, | ||||
|   }); | ||||
| 
 | ||||
|   factory GetTicketAccuralBalanceModel.fromRawJson(String str) => GetTicketAccuralBalanceModel.fromJson(json.decode(str)); | ||||
| 
 | ||||
|   String toRawJson() => json.encode(toJson()); | ||||
| 
 | ||||
|   factory GetTicketAccuralBalanceModel.fromJson(Map<String, dynamic> json) => GetTicketAccuralBalanceModel( | ||||
|     accrualNetEntitlement: json["ACCRUAL_NET_ENTITLEMENT"], | ||||
|     accuralPlanCode: json["ACCURAL_PLAN_CODE"], | ||||
|   ); | ||||
| 
 | ||||
|   Map<String, dynamic> toJson() => { | ||||
|     "ACCRUAL_NET_ENTITLEMENT": accrualNetEntitlement, | ||||
|     "ACCURAL_PLAN_CODE": accuralPlanCode, | ||||
|   }; | ||||
| } | ||||
| @ -0,0 +1,187 @@ | ||||
| import 'dart:convert'; | ||||
| 
 | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:flutter/material.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/date_uitl.dart'; | ||||
| import 'package:mohem_flutter_app/classes/utils.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/models/dashboard/get_accural_ticket_balance_model.dart'; | ||||
| import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; | ||||
| import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; | ||||
| import 'package:mohem_flutter_app/widgets/balances_dashboard_widget.dart'; | ||||
| import 'package:mohem_flutter_app/widgets/button/default_button.dart'; | ||||
| import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; | ||||
| import 'package:mohem_flutter_app/widgets/sso_webview_widget.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
| 
 | ||||
| class TicketDetailedScreen extends StatefulWidget { | ||||
|   final String? url; | ||||
|   final String? jwtToken; | ||||
| 
 | ||||
|   const TicketDetailedScreen({super.key, this.url, this.jwtToken}); | ||||
| 
 | ||||
|   @override | ||||
|   State<TicketDetailedScreen> createState() => _TicketDetailedScreenState(); | ||||
| } | ||||
| 
 | ||||
| class _TicketDetailedScreenState extends State<TicketDetailedScreen> { | ||||
|   DashboardProviderModel? dashboardProviderModel; | ||||
|   late DateTime accrualDateTime; | ||||
| 
 | ||||
|   @override | ||||
|   void initState() { | ||||
|     dashboardProviderModel = Provider.of<DashboardProviderModel>(context, listen: false); | ||||
|     accrualDateTime = DateTime.now(); | ||||
|     super.initState(); | ||||
|   } | ||||
| 
 | ||||
|   void changeAccrualDate(bool showLoading) async { | ||||
|     try { | ||||
|       if (showLoading) Utils.showLoading(context); | ||||
|       await dashboardProviderModel?.fetchTicketAccuralBalance(context, accrualDateTime); | ||||
|       if (showLoading) Utils.hideLoading(context); | ||||
|       setState(() {}); | ||||
|     } catch (ex) { | ||||
|       if (showLoading) Utils.hideLoading(context); | ||||
|       Utils.handleException(ex, context, null); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Scaffold( | ||||
|       backgroundColor: Colors.white, | ||||
|       appBar: AppBarWidget(context, title: "Ticket Details"), | ||||
|       body: Column( | ||||
|         children: <Widget>[ | ||||
|           ListView( | ||||
|             padding: const EdgeInsets.all(21), | ||||
|             physics: const BouncingScrollPhysics(), | ||||
|             children: <Widget>[ | ||||
|               if (dashboardProviderModel == null && dashboardProviderModel?.accrualTicketBalanceList == null) ...<Widget>[Utils.getNoDataWidget(context).paddingOnly(top: 50)] else ...<Widget>[ | ||||
|                 Container( | ||||
|                   padding: const EdgeInsets.all(16.0), | ||||
|                   decoration: BoxDecoration( | ||||
|                     color: Colors.white, | ||||
|                     borderRadius: BorderRadius.circular(12.0), | ||||
|                     boxShadow: <BoxShadow>[BoxShadow(color: Colors.grey.withOpacity(0.2), spreadRadius: 2, blurRadius: 5, offset: const Offset(0, 3))], | ||||
|                   ), | ||||
|                   child: Column( | ||||
|                     children: <Widget>[ | ||||
|                       Row( | ||||
|                         children: <Widget>[ | ||||
|                           "Current Ticket Balance".toText20().expanded, | ||||
|                           Row( | ||||
|                             children: <Widget>[ | ||||
|                               const Icon(Icons.calendar_month_rounded, color: MyColors.darkIconColor, size: 16), | ||||
|                               5.width, | ||||
|                               DateUtil.formatDateToDate(accrualDateTime, AppState().isArabic(context)).toText13(isUnderLine: true), | ||||
|                               8.width, | ||||
|                             ], | ||||
|                           ).onPress(() async { | ||||
|                             DateTime selectedDate = await Utils.selectDate(context, accrualDateTime); | ||||
|                             if (selectedDate != accrualDateTime) { | ||||
|                               accrualDateTime = selectedDate; | ||||
|                               changeAccrualDate(true); | ||||
|                             } | ||||
|                           }), | ||||
|                         ], | ||||
|                       ), | ||||
|                       8.height, | ||||
|                       Column( | ||||
|                         crossAxisAlignment: CrossAxisAlignment.start, | ||||
|                         children: | ||||
|                             dashboardProviderModel!.accrualTicketBalanceList!.map<Widget>((GetTicketAccuralBalanceModel item) { | ||||
|                               return Padding( | ||||
|                                 padding: const EdgeInsets.symmetric(vertical: 6.0), | ||||
|                                 child: Row( | ||||
|                                   mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
|                                   children: <Widget>[ | ||||
|                                     item.accuralPlanCode.toString().replaceAll('_', ' ').toCamelCase.toText14(), | ||||
|                                     item.accrualNetEntitlement.toString().toText16(color: MyColors.textMixColor, isBold: true), | ||||
|                                   ], | ||||
|                                 ), | ||||
|                               ); | ||||
|                             }).toList(), | ||||
|                       ), | ||||
|                     ], | ||||
|                   ), | ||||
|                 ), | ||||
|                 const SizedBox(height: 21), | ||||
|                 dashboardProviderModel == null && dashboardProviderModel!.ticketHistoryTransactionList == null | ||||
|                     ? const SizedBox() | ||||
|                     : ListView( | ||||
|                       shrinkWrap: true, | ||||
|                       physics: const NeverScrollableScrollPhysics(), | ||||
|                       children: <Widget>[ | ||||
|                         "Tickets History".toText20().expanded, | ||||
|                         12.height, | ||||
|                         ListView.separated( | ||||
|                           physics: const NeverScrollableScrollPhysics(), | ||||
|                           shrinkWrap: true, | ||||
|                           padding: EdgeInsets.zero, | ||||
|                           itemBuilder: (BuildContext cxt, int cardIndex) { | ||||
|                             var transactionDetails = dashboardProviderModel!.ticketHistoryTransactionList![cardIndex]; | ||||
|                             const allowedSegmentNames = <String>{ | ||||
|                               "TICKETS_ROUTE", | ||||
|                               "TRAVELER_NAME", | ||||
|                               "TICKETS_EFFECTIVE_DATE", | ||||
|                               "TICKET_ARRIVAL", | ||||
|                               "TICKET_AMOUNT", | ||||
|                               "TICKET_COMP_SHARE", | ||||
|                               "TICKET_EMP_SHARE", | ||||
|                             }; | ||||
|                             var uniqueDetails = | ||||
|                                 transactionDetails | ||||
|                                     .where((item) => item.dISPLAYFLAG != 'N' && item.sEGMENTPROMPT != null && item.sEGMENTPROMPT!.isNotEmpty && allowedSegmentNames.contains(item.sEGMENTNAME)) | ||||
|                                     .toList(); | ||||
| 
 | ||||
|                             return Column( | ||||
|                               crossAxisAlignment: CrossAxisAlignment.start, | ||||
|                               mainAxisSize: MainAxisSize.min, | ||||
|                               children: <Widget>[ | ||||
|                                 ListView.builder( | ||||
|                                   physics: const NeverScrollableScrollPhysics(), | ||||
|                                   shrinkWrap: true, | ||||
|                                   itemCount: (uniqueDetails.length / 2).ceil(), | ||||
|                                   itemBuilder: (context, rowIndex) { | ||||
|                                     int firstIndex = rowIndex * 2; | ||||
|                                     int? secondIndex = (firstIndex + 1 < uniqueDetails.length) ? firstIndex + 1 : null; | ||||
|                                     bool isLastRow = (rowIndex == (uniqueDetails.length / 2).ceil() - 1); | ||||
|                                     var item1 = uniqueDetails[firstIndex]; | ||||
|                                     var child1 = ItemDetailViewCol(item1.sEGMENTPROMPT!, item1.vARCHAR2VALUE ?? item1.nUMBERVALUE?.toString() ?? ""); | ||||
|                                     Widget child2; | ||||
|                                     if (secondIndex != null) { | ||||
|                                       var item2 = uniqueDetails[secondIndex]; | ||||
|                                       child2 = ItemDetailViewCol(item2.sEGMENTPROMPT!, item2.vARCHAR2VALUE ?? item2.nUMBERVALUE?.toString() ?? ""); | ||||
|                                     } else { | ||||
|                                       child2 = const SizedBox(); // Empty widget if there is no second item | ||||
|                                     } | ||||
|                                     return ItemDetailGrid(child1, child2, isItLast: isLastRow); | ||||
|                                   }, | ||||
|                                 ), | ||||
|                               ], | ||||
|                             ).objectContainerView(); | ||||
|                           }, | ||||
|                           separatorBuilder: (BuildContext cxt, int index) => 12.height, | ||||
|                           itemCount: dashboardProviderModel!.ticketHistoryTransactionList!.length, | ||||
|                         ), | ||||
|                       ], | ||||
|                     ), | ||||
|               ], | ||||
|             ], | ||||
|           ).expanded, | ||||
|           DefaultButton("Proceed For Booking", () { | ||||
|             if (widget.url != null && widget.jwtToken != null) { | ||||
|               Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => SsoLoginWebView(url: widget.url, jwtToken: widget.jwtToken))); | ||||
|             } | ||||
|           }).insideContainer, | ||||
|         ], | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in New Issue