Merge branch 'master' into development_haroon
						commit
						0fd1c8c96b
					
				| @ -0,0 +1,9 @@ | ||||
| <svg xmlns="http://www.w3.org/2000/svg" width="22.015" height="22.015" viewBox="0 0 22.015 22.015"> | ||||
|   <g id="Button" transform="translate(-75.66 64.04) rotate(-45)"> | ||||
|     <rect id="Rectangle_5860" data-name="Rectangle 5860" width="15.567" height="15.567" rx="7.783" transform="translate(91 16)" fill="#d85323"/> | ||||
|     <g id="plus_1" data-name="plus 1" transform="translate(95.001 20.001)"> | ||||
|       <path id="Vector" d="M0,0V7.756" transform="translate(3.878)" fill="none" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.2"/> | ||||
|       <path id="Vector-2" data-name="Vector" d="M0,0H7.756" transform="translate(0 3.878)" fill="none" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.2"/> | ||||
|     </g> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 757 B | 
| @ -0,0 +1,4 @@ | ||||
| <svg id="google-docs" xmlns="http://www.w3.org/2000/svg" width="18.402" height="24.158" viewBox="0 0 18.402 24.158"> | ||||
|   <path id="Path_4955" data-name="Path 4955" d="M63.123,24.158H77.278A2.126,2.126,0,0,0,79.4,22.035V7.078H74.447a2.126,2.126,0,0,1-2.123-2.123V0h-9.2A2.126,2.126,0,0,0,61,2.123V22.035A2.126,2.126,0,0,0,63.123,24.158Zm2.831-14.2h8.493a.708.708,0,0,1,0,1.416H65.954a.708.708,0,1,1,0-1.416Zm0,2.831h8.493a.708.708,0,0,1,0,1.416H65.954a.708.708,0,1,1,0-1.416Zm0,2.831h8.493a.708.708,0,0,1,0,1.416H65.954a.708.708,0,1,1,0-1.416Zm0,2.831h5.662a.708.708,0,0,1,0,1.416H65.954a.708.708,0,1,1,0-1.416Z" transform="translate(-61)" fill="#125765"/> | ||||
|   <path id="Path_4956" data-name="Path 4956" d="M331.708,14.036h4.54L331,8.789v4.54A.708.708,0,0,0,331.708,14.036Z" transform="translate(-318.26 -8.374)" fill="#2bb8a6"/> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 832 B | 
| @ -0,0 +1,29 @@ | ||||
| class EmployeeDocumentsList { | ||||
|   String? dOCUMENTREQUIREDSTATUS; | ||||
|   String? dOCUMENTSTATUS; | ||||
|   String? dOCUMENTTYPE; | ||||
|   String? fUNCTIONNAME; | ||||
| 
 | ||||
|   EmployeeDocumentsList({ | ||||
|     this.dOCUMENTREQUIREDSTATUS, | ||||
|     this.dOCUMENTSTATUS, | ||||
|     this.dOCUMENTTYPE, | ||||
|     this.fUNCTIONNAME, | ||||
|   }); | ||||
| 
 | ||||
|   EmployeeDocumentsList.fromJson(Map<String, dynamic> json) { | ||||
|     dOCUMENTREQUIREDSTATUS = json['DOCUMENT_REQUIRED_STATUS']; | ||||
|     dOCUMENTSTATUS = json['DOCUMENT_STATUS']; | ||||
|     dOCUMENTTYPE = json['DOCUMENT_TYPE']; | ||||
|     fUNCTIONNAME = json['FUNCTION_NAME']; | ||||
|   } | ||||
| 
 | ||||
|   Map<String, dynamic> toJson() { | ||||
|     Map<String, dynamic> data = Map<String, dynamic>(); | ||||
|     data['DOCUMENT_REQUIRED_STATUS'] = dOCUMENTREQUIREDSTATUS; | ||||
|     data['DOCUMENT_STATUS'] = dOCUMENTSTATUS; | ||||
|     data['DOCUMENT_TYPE'] = dOCUMENTTYPE; | ||||
|     data['FUNCTION_NAME'] = fUNCTIONNAME; | ||||
|     return data; | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,174 @@ | ||||
| import 'dart:io'; | ||||
| 
 | ||||
| import 'package:dotted_border/dotted_border.dart'; | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_svg/svg.dart'; | ||||
| import 'package:image_picker/image_picker.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/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/generated/locale_keys.g.dart'; | ||||
| import 'package:mohem_flutter_app/models/my_documents/employee_documents_list_model.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/dynamic_forms/dynamic_textfield_widget.dart'; | ||||
| import 'package:mohem_flutter_app/widgets/my_document_item.dart'; | ||||
| import 'package:sizer/sizer.dart'; | ||||
| 
 | ||||
| class MyDocumentDetailScreen extends StatefulWidget { | ||||
|   EmployeeDocumentsList document; | ||||
|   final Color color; | ||||
| 
 | ||||
|   MyDocumentDetailScreen(this.document, this.color, {Key? key}) : super(key: key); | ||||
| 
 | ||||
|   @override | ||||
|   _MyDocumentDetailScreenState createState() { | ||||
|     return _MyDocumentDetailScreenState(); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class _MyDocumentDetailScreenState extends State<MyDocumentDetailScreen> { | ||||
|   DateTime? expiryDate; | ||||
|   List<XFile> imagesList = []; | ||||
| 
 | ||||
|   @override | ||||
|   void initState() { | ||||
|     super.initState(); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   void dispose() { | ||||
|     super.dispose(); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Scaffold( | ||||
|       backgroundColor: Colors.white, | ||||
|       appBar: AppBarWidget(context, title: widget.document.dOCUMENTTYPE!, showHomeButton: true), | ||||
|       body: Column( | ||||
|         children: [ | ||||
|           ListView( | ||||
|             padding: const EdgeInsets.all(21), | ||||
|             children: [ | ||||
|               MyDocumentItem(widget.document, widget.color,isNotInDetailView: false), | ||||
|               20.height, | ||||
|               DynamicTextFieldWidget( | ||||
|                 LocaleKeys.employeeNumber.tr(), | ||||
|                 AppState().getUserName!, | ||||
|                 isInputTypeNum: true, | ||||
|                 isReadOnly: true, | ||||
|               ), | ||||
|               12.height, | ||||
|               PopupMenuButton( | ||||
|                   child: DynamicTextFieldWidget( | ||||
|                     "Document Type*", | ||||
|                     "National ID", | ||||
|                     isEnable: false, | ||||
|                     isPopup: true, | ||||
|                     isInputTypeNum: true, | ||||
|                     //   isReadOnly: true, | ||||
|                   ), | ||||
|                   itemBuilder: (_) => <PopupMenuItem<int>>[], | ||||
|                   onSelected: (int popipIndex) async {}), | ||||
|               12.height, | ||||
|               DynamicTextFieldWidget( | ||||
|                 "Expiry Date", | ||||
|                 expiryDate == null ? LocaleKeys.dateRequired.tr() : Utils.getMonthNamedFormat(expiryDate!).replaceAll("-", " "), | ||||
|                 suffixIconData: Icons.calendar_today, | ||||
|                 isEnable: false, | ||||
|                 onTap: () async { | ||||
|                   DateTime date = await Utils.selectDate(context, expiryDate ?? DateTime.now()); | ||||
|                   String dateString = date.toString().split(' ').first; | ||||
|                   if (date != expiryDate) { | ||||
|                     expiryDate = date; | ||||
|                     setState(() {}); | ||||
|                   } | ||||
|                 }, | ||||
|               ), | ||||
|               12.height, | ||||
|               DottedBorder( | ||||
|                 borderType: BorderType.RRect, | ||||
|                 radius: const Radius.circular(10), | ||||
|                 padding: const EdgeInsets.all(12), | ||||
|                 dashPattern: const <double>[2, 1], | ||||
|                 color: MyColors.selectedBorderColor, | ||||
|                 child: Row( | ||||
|                   mainAxisSize: MainAxisSize.min, | ||||
|                   children: [ | ||||
|                     Transform.rotate( | ||||
|                       angle: 45, | ||||
|                       child: const Icon(Icons.attach_file_rounded, size: 16, color: MyColors.selectedBorderColor), | ||||
|                     ), | ||||
|                     4.width, | ||||
|                     "Attach Image".toText14(color: MyColors.selectedBorderColor), | ||||
|                   ], | ||||
|                 ).center, | ||||
|               ).onPress(() async { | ||||
|                 ImagePicker picker = ImagePicker(); | ||||
|                 List<XFile> list = await picker.pickMultiImage(); | ||||
|                 if (list.isNotEmpty) { | ||||
|                   imagesList.addAll(list); | ||||
|                   var seen = <String>{}; | ||||
|                   imagesList = imagesList.where((image) => seen.add(image.name)).toList(); | ||||
|                   setState(() {}); | ||||
|                 } | ||||
|               }), | ||||
|               12.height, | ||||
|               GridView.builder( | ||||
|                 padding: EdgeInsets.zero, | ||||
|                 itemCount: imagesList.length, | ||||
|                 shrinkWrap: true, | ||||
|                 physics: const NeverScrollableScrollPhysics(), | ||||
|                 itemBuilder: (context, index) { | ||||
|                   return Stack( | ||||
|                     alignment: Alignment.topRight, | ||||
|                     children: [ | ||||
|                       AspectRatio( | ||||
|                         aspectRatio: 1, | ||||
|                         child: Image.file( | ||||
|                           File(imagesList[index].path), | ||||
|                           fit: BoxFit.cover, | ||||
|                           errorBuilder: (BuildContext context, Object error, StackTrace? stackTrace) { | ||||
|                             return const Center(child: Text('This image type is not supported')); | ||||
|                           }, | ||||
|                         ), | ||||
|                       ).paddingOnly(top: 6, right: 6), | ||||
|                       Container( | ||||
|                         height: 16, | ||||
|                         width: 16, | ||||
|                         decoration: const BoxDecoration( | ||||
|                           shape: BoxShape.circle, | ||||
|                           color: Color(0xffd85323), | ||||
|                         ), | ||||
|                         child: const Icon(Icons.clear, color: Colors.white, size: 12), | ||||
|                       ).onPress(() { | ||||
|                         imagesList.removeAt(index); | ||||
|                         setState(() {}); | ||||
|                       }), | ||||
|                     ], | ||||
|                   ); | ||||
|                 }, | ||||
|                 gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( | ||||
|                   crossAxisCount: 4, | ||||
|                   mainAxisSpacing: 8, | ||||
|                   crossAxisSpacing: 8, | ||||
|                   childAspectRatio: 1, | ||||
|                 ), | ||||
|               ) | ||||
|             ], | ||||
|           ).expanded, | ||||
|           const Divider(height: 1, color: MyColors.lightGreyEFColor), | ||||
|           DefaultButton( | ||||
|             LocaleKeys.submit.tr(), | ||||
|             widget.document.dOCUMENTSTATUS == "Exist" ? null : () {}, | ||||
|           ).paddingOnly(left: 21, right: 21, bottom: 21, top: 14), | ||||
|         ], | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,157 @@ | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:mohem_flutter_app/api/profile_api_client.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/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/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/my_documents/employee_documents_list_model.dart'; | ||||
| import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; | ||||
| import 'package:mohem_flutter_app/ui/screens/my_documents/my_document_detail_screen.dart'; | ||||
| import 'package:mohem_flutter_app/widgets/my_document_item.dart'; | ||||
| 
 | ||||
| class MyDocumentsFragment extends StatefulWidget { | ||||
|   List<EmployeeDocumentsList>? list; | ||||
| 
 | ||||
|   MyDocumentsFragment(this.list, {Key? key}) : super(key: key); | ||||
| 
 | ||||
|   @override | ||||
|   _MyDocumentsFragmentState createState() { | ||||
|     return _MyDocumentsFragmentState(); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class _MyDocumentsFragmentState extends State<MyDocumentsFragment> { | ||||
|   int selectedIndex = 0; | ||||
|   List<EmployeeDocumentsList>? documentsList; | ||||
| 
 | ||||
|   @override | ||||
|   void initState() { | ||||
|     super.initState(); | ||||
|     documentsList = widget.list; | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   void dispose() { | ||||
|     super.dispose(); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   void didUpdateWidget(covariant MyDocumentsFragment oldWidget) { | ||||
|     super.didUpdateWidget(oldWidget); | ||||
|     if (oldWidget.list != widget.list) { | ||||
|       documentsList = widget.list; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     List<EmployeeDocumentsList> documentfilteredList = getTagBySelectedTab(selectedIndex); | ||||
|     return Column( | ||||
|       children: [ | ||||
|         GridView.count( | ||||
|           crossAxisSpacing: 6, | ||||
|           crossAxisCount: 4, | ||||
|           childAspectRatio: 79 / 79, | ||||
|           shrinkWrap: true, | ||||
|           physics: const NeverScrollableScrollPhysics(), | ||||
|           padding: const EdgeInsets.only(left: 21, right: 21, bottom: 11, top: 21), | ||||
|           children: [ | ||||
|             gridViewItem(LocaleKeys.allDocuments.tr(), getTagBySelectedTab(0).length.toString(), 0, MyColors.darkTextColor), | ||||
|             gridViewItem(LocaleKeys.expiredDocuments.tr(), getTagBySelectedTab(1).length.toString(), 1, MyColors.redA3Color), | ||||
|             gridViewItem(LocaleKeys.missingDocuments.tr(), getTagBySelectedTab(2).length.toString(), 2, MyColors.yellowColor00), | ||||
|             gridViewItem(LocaleKeys.uploadedDocuments.tr(), getTagBySelectedTab(3).length.toString(), 3, MyColors.greenColor), | ||||
|           ], | ||||
|         ), | ||||
|         documentsList == null | ||||
|             ? const SizedBox() | ||||
|             : (documentfilteredList.isNotEmpty | ||||
|                     ? ListView.separated( | ||||
|                         physics: const BouncingScrollPhysics(), | ||||
|                         padding: const EdgeInsets.only(left: 21, right: 21, bottom: 21, top: 11), | ||||
|                         itemBuilder: (cxt, index) { | ||||
|                           return MyDocumentItem(documentfilteredList[index], getColorByDocumentStatus(documentfilteredList[index].dOCUMENTSTATUS!)).onPress(() { | ||||
|                             Navigator.pushNamed(context, AppRoutes.addDynamicInput, | ||||
|                                 arguments: DynamicListViewParams(documentfilteredList[index].dOCUMENTTYPE!, documentfilteredList[index].fUNCTIONNAME!, selectedEmp: AppState().getUserName, popUntilRoute: AppRoutes.myDocuments)); | ||||
|                           }); | ||||
|                         }, | ||||
|                         separatorBuilder: (cxt, index) => 12.height, | ||||
|                         itemCount: documentfilteredList.length) | ||||
|                     : Utils.getNoDataWidget(context).center) | ||||
|                 .expanded, | ||||
|       ], | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   Widget gridViewItem(String title, String value, int index, Color color) { | ||||
|     return Container( | ||||
|       padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 8), | ||||
|       decoration: BoxDecoration( | ||||
|         color: Colors.white, | ||||
|         borderRadius: BorderRadius.circular(15), | ||||
|         boxShadow: [ | ||||
|           BoxShadow( | ||||
|             color: const Color(0xff000000).withOpacity(.05), | ||||
|             blurRadius: 26, | ||||
|             offset: const Offset(0, 0), | ||||
|           ), | ||||
|         ], | ||||
|         border: Border.all(color: selectedIndex == index ? MyColors.selectedBorderColor : Colors.white, width: 2), | ||||
|       ), | ||||
|       child: Column( | ||||
|         crossAxisAlignment: CrossAxisAlignment.start, | ||||
|         mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
|         children: [ | ||||
|           title.toText10(), | ||||
|           value.toText20(isBold: true, color: color), | ||||
|         ], | ||||
|       ), | ||||
|     ).onPress(() { | ||||
|       setState(() { | ||||
|         selectedIndex = index; | ||||
|       }); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   Color getColorByDocumentStatus(String status) { | ||||
|     Color _color; | ||||
|     switch (status) { | ||||
|       case "Exist": | ||||
|         _color = MyColors.greenColor; | ||||
|         break; | ||||
|       case "Missing": | ||||
|         _color = MyColors.yellowColor00; | ||||
|         break; | ||||
|       case "Not Exist": | ||||
|         _color = MyColors.redA3Color; | ||||
|         break; | ||||
|       default: | ||||
|         _color = MyColors.darkTextColor; | ||||
|         break; | ||||
|     } | ||||
|     return _color; | ||||
|   } | ||||
| 
 | ||||
|   List<EmployeeDocumentsList> getTagBySelectedTab(int index) { | ||||
|     List<EmployeeDocumentsList> list = []; | ||||
|     switch (index) { | ||||
|       case 1: | ||||
|         list = documentsList?.where((element) => element.dOCUMENTSTATUS == "Not Exist").toList() ?? []; | ||||
|         break; | ||||
|       case 2: | ||||
|         list = documentsList?.where((element) => element.dOCUMENTSTATUS == "Missing").toList() ?? []; | ||||
|         break; | ||||
|       case 3: | ||||
|         list = documentsList?.where((element) => element.dOCUMENTSTATUS == "Exist").toList() ?? []; | ||||
|         break; | ||||
|       default: | ||||
|         list = documentsList ?? []; | ||||
|         break; | ||||
|     } | ||||
|     return list; | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,132 @@ | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:mohem_flutter_app/api/profile_api_client.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/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/my_documents/employee_documents_list_model.dart'; | ||||
| import 'package:mohem_flutter_app/ui/screens/my_documents/my_documents_fragment.dart'; | ||||
| import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; | ||||
| 
 | ||||
| class MyDocumentsScreen extends StatefulWidget { | ||||
|   MyDocumentsScreen({Key? key}) : super(key: key); | ||||
| 
 | ||||
|   @override | ||||
|   _MyDocumentsScreenState createState() { | ||||
|     return _MyDocumentsScreenState(); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class _MyDocumentsScreenState extends State<MyDocumentsScreen> { | ||||
|   int tabIndex = 0; | ||||
|   PageController controller = PageController(); | ||||
| 
 | ||||
|   List<EmployeeDocumentsList>? documentsList; | ||||
| 
 | ||||
|   @override | ||||
|   void initState() { | ||||
|     super.initState(); | ||||
|     getDocuments(); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   void dispose() { | ||||
|     super.dispose(); | ||||
|   } | ||||
| 
 | ||||
|   void getDocuments() async { | ||||
|     try { | ||||
|       documentsList?.clear(); | ||||
|       Utils.showLoading(context); | ||||
|       documentsList = await ProfileApiClient().getEmployeeDocuments(); | ||||
|       Utils.hideLoading(context); | ||||
|       setState(() {}); | ||||
|     } catch (ex) { | ||||
|       Utils.hideLoading(context); | ||||
|       Utils.handleException(ex, context, null); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     var requiredDocumentsList; | ||||
|     var optionalDocumentsList; | ||||
| 
 | ||||
|     if (documentsList?.isNotEmpty ?? false) { | ||||
|       requiredDocumentsList = <EmployeeDocumentsList>[]; | ||||
|       optionalDocumentsList = <EmployeeDocumentsList>[]; | ||||
|       documentsList!.forEach((element) { | ||||
|         if (element.dOCUMENTREQUIREDSTATUS == "Required") { | ||||
|           requiredDocumentsList.add(element); | ||||
|         } else { | ||||
|           optionalDocumentsList.add(element); | ||||
|         } | ||||
|       }); | ||||
|     } | ||||
| 
 | ||||
|     return Scaffold( | ||||
|       backgroundColor: Colors.white, | ||||
|       appBar: AppBarWidget(context, title: LocaleKeys.myDocuments.tr(), showHomeButton: true), | ||||
|       body: Column( | ||||
|         children: [ | ||||
|           Container( | ||||
|             padding: const EdgeInsets.only(left: 21, right: 21, top: 16, bottom: 16), | ||||
|             decoration: const BoxDecoration( | ||||
|               borderRadius: BorderRadius.only( | ||||
|                 bottomLeft: Radius.circular(25), | ||||
|                 bottomRight: Radius.circular(25), | ||||
|               ), | ||||
|               gradient: LinearGradient( | ||||
|                 transform: GradientRotation(.83), | ||||
|                 begin: Alignment.topRight, | ||||
|                 end: Alignment.bottomLeft, | ||||
|                 colors: [ | ||||
|                   MyColors.gradiantEndColor, | ||||
|                   MyColors.gradiantStartColor, | ||||
|                 ], | ||||
|               ), | ||||
|             ), | ||||
|             child: Row( | ||||
|               children: [myTab(LocaleKeys.requiredDocuments.tr(), 0), myTab(LocaleKeys.optionalDocuments.tr(), 1)], | ||||
|             ), | ||||
|           ), | ||||
|           PageView( | ||||
|             controller: controller, | ||||
|             physics: const NeverScrollableScrollPhysics(), | ||||
|             onPageChanged: (int pageIndex) { | ||||
|               setState(() { | ||||
|                 tabIndex = pageIndex; | ||||
|               }); | ||||
|             }, | ||||
|             children: [MyDocumentsFragment(requiredDocumentsList), MyDocumentsFragment(optionalDocumentsList)], | ||||
|           ).expanded, | ||||
|         ], | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   Widget myTab(String title, int index) { | ||||
|     bool isSelected = (index == tabIndex); | ||||
|     return Column( | ||||
|       mainAxisSize: MainAxisSize.min, | ||||
|       crossAxisAlignment: CrossAxisAlignment.center, | ||||
|       children: [ | ||||
|         title.toText12(color: isSelected ? Colors.white : Colors.white.withOpacity(.74), isCenter: true), | ||||
|         4.height, | ||||
|         Container( | ||||
|           height: 8, | ||||
|           width: 8, | ||||
|           decoration: BoxDecoration( | ||||
|             shape: BoxShape.circle, | ||||
|             color: isSelected ? Colors.white : Colors.transparent, | ||||
|           ), | ||||
|         ), | ||||
|       ], | ||||
|     ).onPress(() { | ||||
|       controller.jumpToPage(index); | ||||
|     }).expanded; | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,76 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_svg/flutter_svg.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/my_documents/employee_documents_list_model.dart'; | ||||
| import 'package:sizer/sizer.dart'; | ||||
| 
 | ||||
| class MyDocumentItem extends StatelessWidget { | ||||
|   EmployeeDocumentsList document; | ||||
|   final Color color; | ||||
|   final bool isNotInDetailView; | ||||
| 
 | ||||
|   MyDocumentItem(this.document, this.color, {Key? key,this.isNotInDetailView = true}) : super(key: key); | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Container( | ||||
|       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: ClipRRect( | ||||
|         borderRadius: BorderRadius.circular(10.0), | ||||
|         child: Stack( | ||||
|           children: [ | ||||
|             Positioned( | ||||
|               top: -35, | ||||
|               child: Container( | ||||
|                 width: 45, | ||||
|                 height: 45, | ||||
|                 transform: Matrix4.rotationZ(0.8), | ||||
|                 color: color, | ||||
|               ), | ||||
|             ), | ||||
|             Row( | ||||
|               crossAxisAlignment: CrossAxisAlignment.end, | ||||
|               mainAxisSize: MainAxisSize.min, | ||||
|               children: [ | ||||
|                 Row( | ||||
|                   crossAxisAlignment: CrossAxisAlignment.start, | ||||
|                   mainAxisSize: MainAxisSize.min, | ||||
|                   children: [ | ||||
|                     SvgPicture.asset('assets/images/document.svg').paddingOnly(top: 6), | ||||
|                     12.width, | ||||
|                     Column( | ||||
|                       crossAxisAlignment: CrossAxisAlignment.start, | ||||
|                       mainAxisSize: MainAxisSize.min, | ||||
|                       children: [ | ||||
|                         document.dOCUMENTTYPE!.toText16(), | ||||
|                         document.dOCUMENTSTATUS!.toText10(color: color), | ||||
|                       ], | ||||
|                     ).expanded, | ||||
|                   ], | ||||
|                 ).expanded, | ||||
|                 if(isNotInDetailView) | ||||
|                 const Icon( | ||||
|                   Icons.arrow_forward, | ||||
|                   size: 20, | ||||
|                   color: Color(0xff2E303A), | ||||
|                 ) | ||||
|               ], | ||||
|             ).paddingOnly(top: 14, bottom: 18, right: 14, left: 24), | ||||
|           ], | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in New Issue