diff --git a/assets/images/add_icon.svg b/assets/images/add_icon.svg new file mode 100644 index 00000000..833a5215 --- /dev/null +++ b/assets/images/add_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/assets.svg b/assets/images/assets.svg index 905e96b3..f4fea28b 100644 --- a/assets/images/assets.svg +++ b/assets/images/assets.svg @@ -1,5 +1,3 @@ - - - - + + diff --git a/assets/images/contact.svg b/assets/images/contact.svg new file mode 100644 index 00000000..5e8a0385 --- /dev/null +++ b/assets/images/contact.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/overview.svg b/assets/images/overview.svg index 0abb97f3..d5e96156 100644 --- a/assets/images/overview.svg +++ b/assets/images/overview.svg @@ -1,5 +1,3 @@ - - - - + + diff --git a/assets/images/request.svg b/assets/images/request.svg new file mode 100644 index 00000000..a0e0d462 --- /dev/null +++ b/assets/images/request.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/extensions/text_extensions.dart b/lib/extensions/text_extensions.dart index 325bded8..581fd843 100644 --- a/lib/extensions/text_extensions.dart +++ b/lib/extensions/text_extensions.dart @@ -16,6 +16,7 @@ extension TextStyles on String { Text heading4(BuildContext context) => getTextWithStyle(this, AppTextStyles.heading4, context.isDark ? AppColor.neutral30 : AppColor.neutral50); Text heading5(BuildContext context) => getTextWithStyle(this, AppTextStyles.heading5, context.isDark ? AppColor.neutral30 : AppColor.neutral50); + Text bottomSheetHeadingTextStyle(BuildContext context) => getTextWithStyle(this, AppTextStyles.bottomSheetHeadingTextStyle, context.isDark ? AppColor.neutral30 : AppColor.black20); Text customHeadingText(BuildContext context) => getTextWithStyle(this, AppTextStyles.customHeadingText, context.isDark ? AppColor.neutral30 : AppColor.neutral50); Text heading6(BuildContext context) => getTextWithStyle(this, AppTextStyles.heading6, context.isDark ? AppColor.neutral30 : AppColor.neutral50); @@ -85,6 +86,12 @@ abstract class AppTextStyles { fontStyle: FontStyle.normal, decoration: TextDecoration.none, ); + static final TextStyle bottomSheetHeadingTextStyle = TextStyle( + fontSize: 21.toScreenWidth, + fontWeight: FontWeight.w500, + fontStyle: FontStyle.normal, + decoration: TextDecoration.none, + ); static const TextStyle customHeadingText = TextStyle( fontFamily: 'Poppins', fontSize: 27, // Font size in logical pixels @@ -121,6 +128,12 @@ abstract class AppTextStyles { fontStyle: FontStyle.normal, decoration: TextDecoration.none, ); + static final TextStyle tinyFont2 = TextStyle( + fontSize: 10.toScreenWidth, + fontWeight: FontWeight.w500, + fontStyle: FontStyle.normal, + decoration: TextDecoration.none, + ); static final TextStyle overline = TextStyle( fontSize: 9.toScreenWidth, diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index 9d5bb524..061bb469 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -1,3 +1,4 @@ +import 'package:another_flushbar/flushbar.dart'; import 'package:flutter/material.dart'; import 'package:shimmer/shimmer.dart'; import 'package:test_sa/extensions/context_extension.dart'; @@ -12,11 +13,35 @@ extension WidgetExtensions on Widget { Widget get center => Center(child: this); - BoxShadow get boxShadowR14 => BoxShadow(color: Colors.black.withOpacity(0.03), blurRadius: 14, offset: const Offset(0, 0), spreadRadius: 0); + BoxShadow get boxShadowR14 => BoxShadow(color: Colors.black.withOpacity(0.03), blurRadius: 5, offset: const Offset(0, 0), spreadRadius: 0); Widget circle(double value) => ClipRRect(borderRadius: BorderRadius.circular(value), child: this); Widget paddingAll(double value) => Padding(padding: EdgeInsets.all(value), child: this); + Widget indicatorWidget({double height,double width,Color color})=> Container( + width: height??40.toScreenWidth, + height: width??5.toScreenHeight, + decoration: BoxDecoration(color:color?? AppColor.white50, borderRadius: BorderRadius.circular(30)), + child: this, + ); + Widget flushBar({@required BuildContext context,String title,String message,double duration,Color backgroundColor})=>Flushbar( + flushbarPosition: FlushbarPosition.TOP, + backgroundColor:backgroundColor?? AppColor.green70, + title: title ?? "Hey Ninja", + message: message ?? "Lorem Ipsum is simply dummy text of the printing and typesetting industry", + duration: Duration(seconds: duration ?? 3), + flushbarStyle: FlushbarStyle.GROUNDED, + reverseAnimationCurve: Curves.easeInOut, + mainButton: IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: const Icon( + Icons.close, + color: AppColor.white20, + ), + ), + )..show(context); Widget paddingOnly({int start = 0, int end = 0, int top = 0, int bottom = 0}) => Padding(padding: EdgeInsetsDirectional.only(start: start.toScreenWidth, end: end.toScreenWidth, top: top.toScreenHeight, bottom: bottom.toScreenHeight), child: this); @@ -62,6 +87,15 @@ extension WidgetExtensions on Widget { child: this, ) : this; + Widget bottomSheetContainer(BuildContext context, { EdgeInsets padding}) => Container( + clipBehavior: Clip.antiAlias, + margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), + decoration: BoxDecoration( + color:AppColor.background(context), + borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), + ), + padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), + child: this,); Widget toShadowCircleContainer(BuildContext context, {bool showShadow = true, double padding = 16}) => showShadow ? Container( diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index b97076ed..f44a8a27 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -269,9 +269,10 @@ "requiredField" : "الحقل مطلوب", "passwordLengthMessage" : "يجب أن تتكون كلمة السر من 6 خانات على الأقل", "overview" : "نظرة عامة", - "myRequests" : "طلباتي", - "myAssets" : "ممتلكاتي", - "contactUs": "اتصل بنا", + "request" : "طلب", + "assets" : "الأصول", + "contact": "اتصال", + "feedBack": "تعليقات", "welcome" : "مرحبا،", "openWhatsapp" : "الإنتقال الى الواتس اب", "callUs" : "إتصل بنا", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index af57bfe4..0f2d211e 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -240,13 +240,14 @@ "requiredField" : "Required Field", "passwordLengthMessage" : "Password must has at least 6 characters", "overview" : "Overview", - "myRequests" : "My Requests", - "myAssets" : "My Assets", - "contactUs": "Contact Us", + "request" : "Request", + "assets" : "Assets", + "contact": "Contact", "welcome" : "Welcome,", "openWhatsapp" : "Open WhatsApp", "callUs" : "Call Us", "liveChat" : "Live Chat", + "feedBack" : "Feedback", "gasRefillRequest" : "Gas Refill Request", "transferRequest" : "Transfer Request", "serviceRequest" : "Service Request", diff --git a/lib/new_views/app_style/app_color.dart b/lib/new_views/app_style/app_color.dart index 417a7ce1..534cef25 100644 --- a/lib/new_views/app_style/app_color.dart +++ b/lib/new_views/app_style/app_color.dart @@ -12,6 +12,7 @@ class AppColor { static const Color primary60 = Color(0xff3B7097); static const Color primary70 = Color(0xff163A51); static const Color primary80 = Color(0xff161D27); + static const Color primary90 = Color(0xff1E95DE); //texts static const Color neutral10 = Color(0xffBCBCBC); @@ -37,6 +38,8 @@ class AppColor { static const Color white20 = Color(0xffF7F9FB); static const Color white30 = Color(0xffE7EBF2); static const Color white40 = Color(0xffE4EBEE); + static const Color white50 = Color(0xffECECEC); + static const Color white60 = Color(0xffEFEFEF); //black static const Color black10 = Color(0xff3B3D4A); diff --git a/lib/new_views/app_style/app_themes.dart b/lib/new_views/app_style/app_themes.dart index d384040a..587092f6 100644 --- a/lib/new_views/app_style/app_themes.dart +++ b/lib/new_views/app_style/app_themes.dart @@ -21,8 +21,8 @@ class AppThemes { type: BottomNavigationBarType.fixed, unselectedLabelStyle: ThemeData.light().textTheme.bodySmall.copyWith(fontWeight: FontWeight.w500), selectedLabelStyle: ThemeData.light().textTheme.bodySmall.copyWith(fontWeight: FontWeight.w500), - selectedItemColor: AppColor.primary70, - unselectedItemColor: AppColor.neutral20, + selectedItemColor: AppColor.primary90, + unselectedItemColor: AppColor.neutral120, backgroundColor: Colors.white, ), appBarTheme: AppBarTheme(elevation: 0, backgroundColor: Colors.white, iconTheme: ThemeData.light().iconTheme.copyWith(color: AppColor.neutral50)), diff --git a/lib/new_views/common_widgets/app_bottom_nav_bar.dart b/lib/new_views/common_widgets/app_bottom_nav_bar.dart index 53d78b9f..a78839dd 100644 --- a/lib/new_views/common_widgets/app_bottom_nav_bar.dart +++ b/lib/new_views/common_widgets/app_bottom_nav_bar.dart @@ -17,42 +17,44 @@ class AppBottomNavigationBar extends StatelessWidget { @override Widget build(BuildContext context) { bool isEngineer = (Provider.of(context, listen: false).user.type) == UsersTypes.engineer; - return ClipRRect( - borderRadius: const BorderRadius.only(topLeft: Radius.circular(20.0), topRight: Radius.circular(20.0)), - child: Container( - height: 120.toScreenHeight, - decoration: BoxDecoration( - color: AppColor.background(context), - boxShadow: [boxShadowR14], - ), - child: BottomNavigationBar( - items: [ - navBarItem(context, index: 0, iconName: "overview", label: context.translation.overview), - navBarItem(context, index: 1, iconName: "requests", label: context.translation.myRequests), - navBarItem(context, index: 2, iconName: "assets", label: context.translation.myAssets), - if (isEngineer) navBarItem(context, index: 3, iconName: "calender_bottom", label: context.translation.calendar), - navBarItem(context, index: isEngineer ? 4 : 3, iconName: "message", label: context.translation.contactUs), - ], - currentIndex: selectedIndex, - onTap: onPressed, - selectedLabelStyle: AppTextStyles.tinyFont, - unselectedLabelStyle: AppTextStyles.tinyFont, - selectedItemColor: Theme.of(context).bottomNavigationBarTheme.selectedItemColor, - unselectedItemColor: Theme.of(context).bottomNavigationBarTheme.unselectedItemColor, - ), + return Container( + // height: 86.toScreenHeight, + decoration: BoxDecoration( + color: AppColor.background(context), + boxShadow: [boxShadowR14], + ), + child: BottomNavigationBar( + items: [ + navBarItem(context, index: 0, iconName: "overview", label: context.translation.overview), + navBarItem(context, index: 1, iconName: "requests", label: context.translation.request), + if (!isEngineer) navBarItem(context, index: 2, iconName: "add_icon", label: context.translation.calendar, showLabel: false), + navBarItem(context, index: !isEngineer ? 3 : 2, iconName: "assets", label: context.translation.assets), + navBarItem(context, index: !isEngineer ? 4 : 3, iconName: "contact", label: context.translation.contact), + ], + currentIndex: selectedIndex, + onTap: onPressed, + selectedLabelStyle: AppTextStyles.tinyFont2, + unselectedLabelStyle: AppTextStyles.tinyFont2, + selectedItemColor: Theme.of(context).bottomNavigationBarTheme.selectedItemColor, + unselectedItemColor: Theme.of(context).bottomNavigationBarTheme.unselectedItemColor, ), ); } - BottomNavigationBarItem navBarItem(BuildContext context, {@required int index, @required String iconName, @required String label}) { + BottomNavigationBarItem navBarItem(BuildContext context, {@required int index, @required String iconName, @required String label, bool showLabel = true}) { return BottomNavigationBarItem( icon: iconName ?.toSvgAsset( - width: 24, - color: selectedIndex == index ? Theme.of(context).bottomNavigationBarTheme.selectedItemColor : Theme.of(context).bottomNavigationBarTheme.unselectedItemColor, + width: showLabel ? 28 : 38, + height: showLabel ? 26 : 40, + color: showLabel||(showLabel && selectedIndex != 2) + ? selectedIndex == index + ? Theme.of(context).bottomNavigationBarTheme.selectedItemColor + : Theme.of(context).bottomNavigationBarTheme.unselectedItemColor + : null, ) - ?.paddingOnly(top: 10, bottom: 10), - label: label, + ?.paddingOnly(top: 21, bottom: showLabel ? 4 : 0), + label: showLabel ? label : '', ); } } diff --git a/lib/new_views/pages/land_page/calender_fragments/monthly_fragment.dart b/lib/new_views/pages/land_page/calender_fragments/monthly_fragment.dart index 512e1d22..d529b6d6 100644 --- a/lib/new_views/pages/land_page/calender_fragments/monthly_fragment.dart +++ b/lib/new_views/pages/land_page/calender_fragments/monthly_fragment.dart @@ -107,7 +107,7 @@ class _MonthlyFragmentState extends State { children: [ const CircleAvatar(backgroundColor: AppColor.primary40, radius: 8), 8.width, - context.translation.myRequests.heading6(context), + context.translation.request.heading6(context), ], ), 16.height, diff --git a/lib/new_views/pages/land_page/contact_us_bottom_sheet.dart b/lib/new_views/pages/land_page/contact_us_bottom_sheet.dart index 0500606c..22c50c21 100644 --- a/lib/new_views/pages/land_page/contact_us_bottom_sheet.dart +++ b/lib/new_views/pages/land_page/contact_us_bottom_sheet.dart @@ -37,7 +37,7 @@ class ContactUsBottomSheet extends StatelessWidget { Align( alignment: AlignmentDirectional.centerStart, child: Text( - context.translation.contactUs, + context.translation.contact, style: AppTextStyles.heading3.copyWith(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), ), ), diff --git a/lib/new_views/pages/land_page/land_page.dart b/lib/new_views/pages/land_page/land_page.dart index 0dbd7ed2..82967ba0 100644 --- a/lib/new_views/pages/land_page/land_page.dart +++ b/lib/new_views/pages/land_page/land_page.dart @@ -107,8 +107,8 @@ class _LandPageState extends State { })), // const old_page.LandPage(), const MyRequestsPage(), + if (_userProvider.user.type != UsersTypes.engineer) const CalendarPage(), const MyAssetsPage(fromBottomBar: true), - if (_userProvider.user.type == UsersTypes.engineer) const CalendarPage(), ]; checkLocalAuth(); } @@ -135,8 +135,7 @@ class _LandPageState extends State { selectedIndex: currentPageIndex, onPressed: (index) { bool isEngineer = _userProvider.user.type == UsersTypes.engineer; - - if (index == (isEngineer ? 4 : 3)) { + if (index == (!isEngineer ? 4 : 3)) { showModalBottomSheet( context: context, useSafeArea: true, diff --git a/lib/new_views/pages/land_page/requests/request_paginated_listview.dart b/lib/new_views/pages/land_page/requests/request_paginated_listview.dart index 6856bb94..df7d7a2b 100644 --- a/lib/new_views/pages/land_page/requests/request_paginated_listview.dart +++ b/lib/new_views/pages/land_page/requests/request_paginated_listview.dart @@ -23,6 +23,7 @@ class RequestPaginatedList extends StatelessWidget { itemCount: list.length < totalCount ? list.length + 1 : list.length, controller: scrollController, shrinkWrap: true, + padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth), itemBuilder: (context, index) { if (index == list.length) { return ListTile( diff --git a/lib/new_views/pages/land_page/requests_list_page.dart b/lib/new_views/pages/land_page/requests_list_page.dart index 105b246a..551583ea 100644 --- a/lib/new_views/pages/land_page/requests_list_page.dart +++ b/lib/new_views/pages/land_page/requests_list_page.dart @@ -77,7 +77,9 @@ class _RequestsListPageState extends State { }, ); } else { - snapshot.requestDetailList = snapshot.selectedRequestCategory; + WidgetsBinding.instance.addPostFrameCallback((_) { + snapshot.requestDetailList = snapshot.selectedRequestCategory; + }); return RequestPaginatedList(snapshot.selectedRequestCategory.requestsDetails ?? [], snapshot.isRequestCategoryLoading, snapshot.selectedRequestCategory.total.count, _scrollController); } bool isLoading = widget.index == 0 diff --git a/lib/service_request_latest/views/components/activities_list_view.dart b/lib/service_request_latest/views/components/activities_list_view.dart index c654cf9e..144c1dae 100644 --- a/lib/service_request_latest/views/components/activities_list_view.dart +++ b/lib/service_request_latest/views/components/activities_list_view.dart @@ -12,7 +12,6 @@ import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; -import 'package:test_sa/service_request_latest/views/components/bottom_sheets/activity_type_bottomsheet.dart'; import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart'; import 'package:test_sa/views/pages/user/requests/work_order/create_service_report.dart'; import 'package:test_sa/views/pages/user/requests/work_order/update_service_report.dart'; diff --git a/lib/service_request_latest/views/components/bottom_sheets/action_bottomsheet.dart b/lib/service_request_latest/views/components/bottom_sheets/action_bottomsheet.dart deleted file mode 100644 index e7c1e563..00000000 --- a/lib/service_request_latest/views/components/bottom_sheets/action_bottomsheet.dart +++ /dev/null @@ -1,89 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/extensions/context_extension.dart'; -import 'package:test_sa/extensions/int_extensions.dart'; -import 'package:test_sa/extensions/string_extensions.dart'; -import 'package:test_sa/extensions/text_extensions.dart'; -import 'package:test_sa/extensions/widget_extensions.dart'; -import 'package:test_sa/service_request_latest/views/components/verify_arrival_view.dart'; -import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import '../../../../controllers/providers/api/service_requests_provider.dart'; -import '../../../../new_views/app_style/app_color.dart'; -import '../../../../new_views/common_widgets/app_filled_button.dart'; -import '../../../../new_views/common_widgets/app_text_form_field.dart'; - -class ActionBottomSheet extends StatelessWidget { - final String title; - final String button1Text; - final String button2Text; - final VoidCallback button1Tap; - final VoidCallback button2Tap; - - ActionBottomSheet({Key key, @required this.title, this.button1Text, this.button2Text, this.button1Tap, this.button2Tap}) : super(key: key); - - final GlobalKey _formKey = GlobalKey(); - - @override - Widget build(BuildContext context) { - return Consumer(builder: (context, serviceRequestProvider, child) { - return Wrap( - children: [ - Container( - clipBehavior: Clip.antiAlias, - margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), - decoration: BoxDecoration( - color: Theme.of(context).scaffoldBackgroundColor, - borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), - ), - padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 40.toScreenWidth, - height: 5.toScreenHeight, - decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)), - ), - Align( - alignment: AlignmentDirectional.centerStart, - child: title.heading4(context).custom(fontWeight: FontWeight.w500).paddingOnly(top: 16, bottom: 16), - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SizedBox( - width: 200.toScreenHeight, - child: AppFilledButton( - label: button1Text ?? context.translation.no, - loading: false, - buttonColor: AppColor.neutral40, - textColor: AppColor.black10, - onPressed: button1Tap ?? - () async { - Navigator.pop(context); - // await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest); - // Navigator.pop(context, true); - }, - ), - ), - SizedBox( - width: 200.toScreenHeight, - child: AppFilledButton( - label: context.translation.yes, - buttonColor: AppColor.primary10, - loading: false, - onPressed:button2Tap, - ), - ), - ], - ) - ], - ), - ) - ], - ); - }); - } -} diff --git a/lib/service_request_latest/views/components/bottom_sheets/activity_type_bottomsheet.dart b/lib/service_request_latest/views/components/bottom_sheets/activity_type_bottomsheet.dart deleted file mode 100644 index ed66fe34..00000000 --- a/lib/service_request_latest/views/components/bottom_sheets/activity_type_bottomsheet.dart +++ /dev/null @@ -1,129 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/app_strings/app_asset.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; -import 'package:test_sa/extensions/context_extension.dart'; -import 'package:test_sa/extensions/int_extensions.dart'; -import 'package:test_sa/extensions/text_extensions.dart'; -import 'package:test_sa/extensions/widget_extensions.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/new_views/app_style/app_color.dart'; -import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; -import 'package:test_sa/service_request_latest/views/components/spare_part_request.dart'; -import 'package:test_sa/views/pages/user/requests/work_order/create_service_report.dart'; - -class ActivityTypeBottomSheet extends StatelessWidget { - ActivityTypeBottomSheet({Key key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final List> items = [ - {'heading': context.translation.sparePartRequest, 'subHeading': context.translation.sparePartRequestDetail, 'icon': AppAsset.sparePartIcon}, - {'heading': context.translation.maintenanceRequest, 'subHeading': context.translation.sparePartRequestDetail, 'icon': AppAsset.maintenanceIcon}, - {'heading': context.translation.assetToBeRetired, 'subHeading': context.translation.sparePartRequestDetail, 'icon': AppAsset.retiredAssetIcon}, - ]; - return Wrap( - children: [ - Consumer(builder: (context, serviceRequestsProvider, child) { - return Container( - clipBehavior: Clip.antiAlias, - margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), - decoration: BoxDecoration( - color: AppColor.background(context), - borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), - ), - padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), - child: SafeArea( - child: Column( - children: [ - Align( - alignment: AlignmentDirectional.centerStart, - child: context.translation.selectActivityType.heading4(context).paddingOnly(top: 16, bottom: 16), - ), - ListView.builder( - shrinkWrap: true, - padding: EdgeInsets.zero, - itemCount: items.length, - itemBuilder: (context, index) { - final item = items[index]; - return listItem( - icon: item['icon'], - heading: item['heading'], - subHeading: item['subHeading'], - context: context, - onTap: () { - onItemTap(serviceRequest: serviceRequestsProvider.currentSelectedRequest, index: index, context: context); - }); - }, - ), - ], - ), - ), - ); - }), - ], - ); - } - - Widget listItem({@required BuildContext context, @required String icon, @required String heading, @required String subHeading, @required VoidCallback onTap}) { - return Padding( - padding: EdgeInsets.only(bottom: 8.toScreenHeight), - child: Card( - color: AppColor.neutral80, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(15), - // Circular border radius - ), - // color: Colors.white, - child: ListTile( - minVerticalPadding: 8, - horizontalTitleGap: 10, - onTap: onTap, - contentPadding: const EdgeInsets.all(8), - leading: SvgPicture.asset(icon), - title: Text( - heading, - style: AppTextStyles.heading5, - ), - subtitle: Text( - subHeading, - style: AppTextStyles.bodyText, - ), - ), - ), - ); - } - - void onItemTap({@required int index, @required ServiceRequest serviceRequest, @required BuildContext context}) { - print('on item tap i got index is $index'); - switch (index) { - case 0: - Navigator.of(context).push(MaterialPageRoute(builder: (_) =>const SparePartRequest())); - - break; - case 1: - //push to specific screen... - // Navigator.push( - // context, - // MaterialPageRoute(builder: (context) => ActivitiesListView()), - // ); - break; - case 2: - //push to specific screen... - // Navigator.push( - // context, - // MaterialPageRoute(builder: (context) => const ScanQrView()), - // ); - break; - case 2: - //push to specific screen... - // Navigator.push( - // context, - // MaterialPageRoute(builder: (context) => const ScanQrView()), - // ); - break; - } - // ScanQr - } -} diff --git a/lib/service_request_latest/views/components/bottom_sheets/initial_visit_bottomsheet.dart b/lib/service_request_latest/views/components/bottom_sheets/initial_visit_bottomsheet.dart deleted file mode 100644 index 3c04ce0f..00000000 --- a/lib/service_request_latest/views/components/bottom_sheets/initial_visit_bottomsheet.dart +++ /dev/null @@ -1,217 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/extensions/context_extension.dart'; -import 'package:test_sa/extensions/int_extensions.dart'; -import 'package:test_sa/extensions/string_extensions.dart'; -import 'package:test_sa/extensions/text_extensions.dart'; -import 'package:test_sa/extensions/widget_extensions.dart'; -import 'package:test_sa/service_request_latest/views/components/verify_arrival_view.dart'; -import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import '../../../../controllers/providers/api/service_requests_provider.dart'; -import '../../../../new_views/app_style/app_color.dart'; -import '../../../../new_views/common_widgets/app_filled_button.dart'; -import '../../../../new_views/common_widgets/app_text_form_field.dart'; - -class InitialVisitBottomSheet extends StatelessWidget { - - InitialVisitBottomSheet({Key key,}) : super(key: key); - - final GlobalKey _formKey = GlobalKey(); - - @override - Widget build(BuildContext context) { - final userProvider = Provider.of(context, listen: false); - return Consumer( - builder: (context, serviceRequestProvider,child) { - return Wrap( - children: [ - Container( - clipBehavior: Clip.antiAlias, - margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), - decoration: BoxDecoration( - color: Theme.of(context).scaffoldBackgroundColor, - borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), - ), - padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), - child: Form( - key: _formKey, - child: SingleChildScrollView( - child: Column( - children: [ - Container( - width: 40.toScreenWidth, - height: 5.toScreenHeight, - decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)), - ), - Align( - alignment: AlignmentDirectional.centerStart, - child: context.translation.setVisitDate.heading5(context).custom(fontWeight: FontWeight.w500).paddingOnly(top: 16, bottom: 16), - ), - - 8.height, - ADatePicker( - label: context.translation.visitDate, - date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.visitDate ?? ""), - formatDateWithTime: true, - onDatePicker: (selectedDate) { - if (selectedDate != null) { - showTimePicker( - context: context, - initialTime: TimeOfDay.now(), - ).then((selectedTime) { - // Handle the selected date and time here. - if (selectedTime != null) { - DateTime selectedDateTime = DateTime( - selectedDate.year, - selectedDate.month, - selectedDate.day, - selectedTime.hour, - selectedTime.minute, - ); - if (selectedDateTime != null) { - if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest.date))) { - "Visit Date time must be greater then request date".showToast; - return; - } - serviceRequestProvider.currentSelectedRequest.visitDate = selectedDateTime?.toIso8601String(); - } - } - }); - } - }, - ), - // ], - - if (serviceRequestProvider.currentSelectedRequest.firstAction?.id == 404 && Provider.of(context, listen: false).assetGroup.id == 1) ...[ - 8.height, - Row( - children: [ - ADatePicker( - label: context.translation.startDate, - date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.startDate ?? ""), - formatDateWithTime: true, - onDatePicker: (selectedDate) { - if (selectedDate != null) { - showTimePicker( - context: context, - initialTime: TimeOfDay.now(), - ).then((selectedTime) { - // Handle the selected date and time here. - if (selectedTime != null) { - DateTime selectedDateTime = DateTime( - selectedDate.year, - selectedDate.month, - selectedDate.day, - selectedTime.hour, - selectedTime.minute, - ); - if (selectedDateTime != null) { - - serviceRequestProvider.currentSelectedRequest.startDate = selectedDateTime?.toIso8601String(); - - } - } - }); - } - }, - ).expanded, - 8.width, - ADatePicker( - label: context.translation.endDate, - date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.endDate ?? ""), - formatDateWithTime: true, - onDatePicker: (selectedDate) { - if (selectedDate != null) { - showTimePicker( - context: context, - initialTime: TimeOfDay.now(), - ).then((selectedTime) { - // Handle the selected date and time here. - if (selectedTime != null) { - DateTime selectedDateTime = DateTime( - selectedDate.year, - selectedDate.month, - selectedDate.day, - selectedTime.hour, - selectedTime.minute, - ); - if (selectedDateTime != null) { - serviceRequestProvider.currentSelectedRequest.endDate = selectedDateTime?.toIso8601String(); - serviceRequestProvider.currentSelectedRequest.workingHours = - (((DateTime.parse(serviceRequestProvider.currentSelectedRequest.endDate).difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest.startDate)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2); - } - } - }); - } - }, - ).expanded, - ], - ) - ], - - /// Loan availability not required - // 8.height, - // SingleItemDropDownMenu( - // context: context, - // title: context.translation.loanAvailability, - // initialValue: _serviceRequest.loanAvailability, - // onSelect: (status) { - // setState(() { - // _serviceRequest.loanAvailability = status; - // if (_serviceRequest.loanAvailability.value != 1) { - // asset = null; - // } - // }); - // }, - // ), - // if (_serviceRequest?.loanAvailability?.value == 1) 8.height, - // if (_serviceRequest?.loanAvailability?.value == 1) - // PickAsset( - // device: asset ?? _serviceRequest.device, - // onPickAsset: (asset) { - // setState(() { - // this.asset = asset; - // }); - // }, - // ), - 8.height, - AppTextFormField( - labelText: context.translation.comments, - textInputType: TextInputType.multiline, - alignLabelWithHint: true, - onChange: (text) { - serviceRequestProvider.currentSelectedRequest.comments = text; - }, - onSaved: (text) { - serviceRequestProvider.currentSelectedRequest.comments = text; - }, - ), - 16.height, - Consumer( - builder: (context, snapshot, _) => AppFilledButton( - label: context.translation.save, - loading: snapshot.isLoading ?? false, - onPressed: () async { - _formKey.currentState.save(); - - // await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest); - // Navigator.pop(context, true); - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => VerifyArrivalView())); - }, - ), - ), - 16.height, - ], - ), - ), - ), - ) - ], - ); - } - ); - } -} diff --git a/lib/service_request_latest/views/components/bottom_sheets/reject_request_bottomsheet.dart b/lib/service_request_latest/views/components/bottom_sheets/reject_request_bottomsheet.dart deleted file mode 100644 index 2566c764..00000000 --- a/lib/service_request_latest/views/components/bottom_sheets/reject_request_bottomsheet.dart +++ /dev/null @@ -1,236 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/extensions/context_extension.dart'; -import 'package:test_sa/extensions/int_extensions.dart'; -import 'package:test_sa/extensions/text_extensions.dart'; -import 'package:test_sa/extensions/widget_extensions.dart'; -import 'package:test_sa/models/device/asset.dart'; -import '../../../../controllers/providers/api/service_requests_provider.dart'; -import '../../../../models/lookup.dart'; -import '../../../../new_views/app_style/app_color.dart'; -import '../../../../new_views/common_widgets/app_filled_button.dart'; -import '../../../../new_views/common_widgets/app_text_form_field.dart'; -import '../../../../new_views/common_widgets/single_item_drop_down_menu.dart'; -import '../../../../providers/service_request_providers/first_action_provider.dart'; - -class RejectRequestBottomSheet extends StatelessWidget { - - RejectRequestBottomSheet({Key key,}) : super(key: key); - - final GlobalKey _formKey = GlobalKey(); - Asset asset; - - - @override - Widget build(BuildContext context) { - final userProvider = Provider.of(context, listen: false); - return Consumer( - builder: (context, requestDetailProvider,child) { - return Wrap( - children: [ - Container( - clipBehavior: Clip.antiAlias, - margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), - decoration: BoxDecoration( - color: Theme.of(context).scaffoldBackgroundColor, - borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), - ), - padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), - child: Form( - key: _formKey, - child: SingleChildScrollView( - child: Column( - children: [ - Container( - width: 40.toScreenWidth, - height: 5.toScreenHeight, - decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)), - ), - Align( - alignment: AlignmentDirectional.centerStart, - child: context.translation.rejectionReason.heading3(context).custom(fontWeight: FontWeight.w600).paddingOnly(top: 16, bottom: 16), - ), - SingleItemDropDownMenu( - context: context, - title: context.translation.rejectionReason, - initialValue: requestDetailProvider.currentSelectedRequest.firstAction, //_currentSelectedRequest.firstAction, - onSelect: (value) { - // setState(() { - //_currentSelectedRequest.firstAction = value; - requestDetailProvider.currentSelectedRequest.firstAction = value; - if (requestDetailProvider.currentSelectedRequest.firstAction.value != 2) { - requestDetailProvider.currentSelectedRequest.visitDate = null; - } - // }); - }, - ), - // if (requestDetailProvider.currentSelectedRequest.firstAction?.value == 2) ...[ - // 8.height, - // ADatePicker( - // label: context.translation.visitDate, - // date: DateTime.tryParse(requestDetailProvider.currentSelectedRequest.visitDate ?? ""), - // formatDateWithTime: true, - // onDatePicker: (selectedDate) { - // if (selectedDate != null) { - // showTimePicker( - // context: context, - // initialTime: TimeOfDay.now(), - // ).then((selectedTime) { - // // Handle the selected date and time here. - // if (selectedTime != null) { - // DateTime selectedDateTime = DateTime( - // selectedDate.year, - // selectedDate.month, - // selectedDate.day, - // selectedTime.hour, - // selectedTime.minute, - // ); - // if (selectedDateTime != null) { - // if (selectedDateTime.isBefore(DateTime.parse(requestDetailProvider.currentSelectedRequest.date))) { - // "Visit Date time must be greater then request date".showToast; - // return; - // } - // - // // setState(() { - // requestDetailProvider.currentSelectedRequest.visitDate = selectedDateTime?.toIso8601String(); - // // }); - // } - // } - // }); - // } - // }, - // ), - // ], - // - // if (requestDetailProvider.currentSelectedRequest.firstAction?.id == 404 && Provider.of(context, listen: false).assetGroup.id == 1) ...[ - // 8.height, - // Row( - // children: [ - // ADatePicker( - // label: context.translation.startDate, - // date: DateTime.tryParse(requestDetailProvider.currentSelectedRequest.startDate ?? ""), - // formatDateWithTime: true, - // onDatePicker: (selectedDate) { - // if (selectedDate != null) { - // showTimePicker( - // context: context, - // initialTime: TimeOfDay.now(), - // ).then((selectedTime) { - // // Handle the selected date and time here. - // if (selectedTime != null) { - // DateTime selectedDateTime = DateTime( - // selectedDate.year, - // selectedDate.month, - // selectedDate.day, - // selectedTime.hour, - // selectedTime.minute, - // ); - // if (selectedDateTime != null) { - // requestDetailProvider.currentSelectedRequest.startDate = selectedDateTime?.toIso8601String(); - // } - // } - // }); - // } - // }, - // ).expanded, - // 8.width, - // ADatePicker( - // label: context.translation.endDate, - // date: DateTime.tryParse(requestDetailProvider.currentSelectedRequest.endDate ?? ""), - // formatDateWithTime: true, - // onDatePicker: (selectedDate) { - // if (selectedDate != null) { - // showTimePicker( - // context: context, - // initialTime: TimeOfDay.now(), - // ).then((selectedTime) { - // // Handle the selected date and time here. - // if (selectedTime != null) { - // DateTime selectedDateTime = DateTime( - // selectedDate.year, - // selectedDate.month, - // selectedDate.day, - // selectedTime.hour, - // selectedTime.minute, - // ); - // if (selectedDateTime != null) { - // requestDetailProvider.currentSelectedRequest.endDate = selectedDateTime?.toIso8601String(); - // requestDetailProvider.currentSelectedRequest.workingHours = - // (((DateTime.parse(requestDetailProvider.currentSelectedRequest.endDate).difference(DateTime.parse(requestDetailProvider.currentSelectedRequest.startDate)).inSeconds ?? 0) / 60) / 60).toStringAsFixed(2); - // } - // } - // }); - // } - // }, - // ).expanded, - // ], - // ) - // ], - - /// Loan availability not required - // 8.height, - // SingleItemDropDownMenu( - // context: context, - // title: context.translation.loanAvailability, - // initialValue: _currentSelectedRequest.loanAvailability, - // onSelect: (status) { - // setState(() { - // _currentSelectedRequest.loanAvailability = status; - // if (_currentSelectedRequest.loanAvailability.value != 1) { - // asset = null; - // } - // }); - // }, - // ), - // if (_currentSelectedRequest?.loanAvailability?.value == 1) 8.height, - // if (_currentSelectedRequest?.loanAvailability?.value == 1) - // PickAsset( - // device: asset ?? _currentSelectedRequest.device, - // onPickAsset: (asset) { - // setState(() { - // this.asset = asset; - // }); - // }, - // ), - 8.height, - AppTextFormField( - labelText: context.translation.comments, - textInputType: TextInputType.multiline, - alignLabelWithHint: true, - onChange: (text) { - requestDetailProvider.currentSelectedRequest.comments = text; - }, - onSaved: (text) { - requestDetailProvider.currentSelectedRequest.comments = text; - }, - ), - 16.height, - Consumer( - builder: (context, snapshot, _) => AppFilledButton( - label: context.translation.reject, - maxWidth: true, - buttonColor: Colors.white54, - textColor: AppColor.red50, - showBorder: true, - loading: snapshot.isLoading ?? false, - onPressed: () async { - _formKey.currentState.save(); - // requestDetailProvider.serviceRequest.device = asset; - await snapshot.updateRequest(user: userProvider.user, request: requestDetailProvider.currentSelectedRequest); - Navigator.pop(context, true); - }, - ), - ), - 16.height, - ], - ), - ), - ), - ) - ], - ); - } - ); - } -} diff --git a/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart b/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart index 5a17b604..05230e79 100644 --- a/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart +++ b/lib/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart @@ -249,25 +249,20 @@ class ServiceRequestBottomSheet { child: SingleChildScrollView( child: StatefulBuilder(builder: (context, setState) { return Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Center( - child: Container( - width: 40.toScreenWidth, - height: 5.toScreenHeight, - decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)), - ), - ), + const SizedBox().indicatorWidget(), + 16.height, Align( alignment: AlignmentDirectional.centerStart, - child: context.translation.fillDetails.heading5(context).custom(fontWeight: FontWeight.w500).paddingOnly(top: 16, bottom: 16), + child: context.translation.fillDetails.bottomSheetHeadingTextStyle(context), ), - 8.height, + 16.height, ADatePicker( label: context.translation.date, hideShadow: true, height: 80.toScreenHeight, - backgroundColor: AppColor.neutral90, + backgroundColor: AppColor.neutral100, date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.startDate ?? ""), formatDateWithTime: true, onDatePicker: (selectedDate) { @@ -301,53 +296,6 @@ class ServiceRequestBottomSheet { } }, ), - - // ATimePicker( - // label: context.translation.startTime, - // height: 80.toScreenHeight, - // backgroundColor: AppColor.neutral90, - // hint: context.translation.pickTime, - // time: serviceRequestProvider.selectedTime, - // onTimePicker: (selectedTime) { - // //TODO handle selected time here. - // if (selectedTime != null) { - // // setState(() { - // serviceRequestProvider.selectedTime = selectedTime; - // // }); - // // DateTime selectedDateTime = DateTime( - // // selectedDate.year, - // // selectedDate.month, - // // selectedDate.day, - // // selectedTime.hour, - // // selectedTime.minute, - // // ); - // // if (selectedDateTime != null) { - // // if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.serviceRequest.date))) { - // // "Visit Date time must be greater then request date".showToast; - // // return; - // // } - // // - // - // // } - // } - // }, - // ), - // 8.height, - // ATimePicker( - // label: context.translation.endTime, - // height: 80.toScreenHeight, - // backgroundColor: AppColor.neutral90, - // hint: context.translation.pickTime, - // time: serviceRequestProvider.selectedTime, - // onTimePicker: (selectedTime) { - // //TODO handle selected time here. - // if (selectedTime != null) { - // // setState(() { - // serviceRequestProvider.selectedTime = selectedTime; - // // }); - // } - // }, - // ), 8.height, SizedBox( width: double.infinity, @@ -357,7 +305,7 @@ class ServiceRequestBottomSheet { label: context.translation.workingHours, timer: TimerModel(), decoration: BoxDecoration( - color: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + color: context.isDark ? AppColor.neutral20 : AppColor.neutral100, borderRadius: BorderRadius.circular(10), // boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], ), @@ -368,22 +316,14 @@ class ServiceRequestBottomSheet { return true; }, ), - // Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // mainAxisAlignment: MainAxisAlignment.start, - // children: [ - // context.translation.workingHours.bodyText2(context), - // //TODo calculate the hours and write here. - // 'No of hours'.bodyText(context).custom(color: AppColor.balck10), - // ], - // ), + ), 8.height, AppTextFormField( labelText: context.translation.comments, textInputType: TextInputType.multiline, showWithoutDecoration: true, - backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral100, alignLabelWithHint: true, onChange: (text) { serviceRequestProvider.currentSelectedRequest.comments = text; @@ -403,7 +343,7 @@ class ServiceRequestBottomSheet { loading: false, buttonColor: Colors.transparent, showBorder: true, - textColor: AppColor.black10, + textColor: AppColor.black20, onPressed: () async { Navigator.pop(context); // await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest); @@ -440,244 +380,228 @@ class ServiceRequestBottomSheet { isScrollControlled: true, backgroundColor: Colors.transparent, builder: (context) => Consumer(builder: (context, serviceRequestProvider, child) { - return Container( - clipBehavior: Clip.antiAlias, - margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), - decoration: BoxDecoration( - color: Theme.of(context).scaffoldBackgroundColor, - borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), - ), - padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), - child: Form( - key: _formKey, - child: SingleChildScrollView( - child: Column( - children: [ - Container( - width: 40.toScreenWidth, - height: 5.toScreenHeight, - decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)), - ), - Align( - alignment: AlignmentDirectional.centerStart, - child: context.translation.setVisitDate.heading5(context).custom(fontWeight: FontWeight.w500).paddingOnly(top: 16, bottom: 16), - ), + return Form( + key: _formKey, + child: SingleChildScrollView( + child: Column( + children: [ + const SizedBox().indicatorWidget(), + 8.height, + Align( + alignment: AlignmentDirectional.centerStart, + child: context.translation.setVisitDate.bottomSheetHeadingTextStyle(context), + ), - 8.height, - ADatePicker( - label: context.translation.visitDate, - date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.visitDate ?? ""), - formatDateWithTime: true, - onDatePicker: (selectedDate) { - if (selectedDate != null) { - showTimePicker( - context: context, - initialTime: TimeOfDay.now(), - ).then((selectedTime) { - // Handle the selected date and time here. - if (selectedTime != null) { - DateTime selectedDateTime = DateTime( - selectedDate.year, - selectedDate.month, - selectedDate.day, - selectedTime.hour, - selectedTime.minute, - ); - if (selectedDateTime != null) { - if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest.date))) { - "Visit Date time must be greater then request date".showToast; - return; - } - serviceRequestProvider.currentSelectedRequest.visitDate = selectedDateTime?.toIso8601String(); + 15.height, + ADatePicker( + label: context.translation.visitDate, + hideShadow: true, + backgroundColor: AppColor.neutral100, + height: 70.toScreenHeight, + date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.visitDate ?? ""), + formatDateWithTime: true, + onDatePicker: (selectedDate) { + if (selectedDate != null) { + showTimePicker( + context: context, + initialTime: TimeOfDay.now(), + ).then((selectedTime) { + // Handle the selected date and time here. + if (selectedTime != null) { + DateTime selectedDateTime = DateTime( + selectedDate.year, + selectedDate.month, + selectedDate.day, + selectedTime.hour, + selectedTime.minute, + ); + if (selectedDateTime != null) { + if (selectedDateTime.isBefore(DateTime.parse(serviceRequestProvider.currentSelectedRequest.date))) { + "Visit Date time must be greater then request date".showToast; + return; } + serviceRequestProvider.currentSelectedRequest.visitDate = selectedDateTime?.toIso8601String(); } - }); - } - }, - ), - // ], + } + }); + } + }, + ), + // ], - if (serviceRequestProvider.currentSelectedRequest.firstAction?.id == 404 && Provider.of(context, listen: false).assetGroup.id == 1) ...[ - 8.height, - Row( - children: [ - ADatePicker( - label: context.translation.startDate, - date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.startDate ?? ""), - formatDateWithTime: true, - onDatePicker: (selectedDate) { - if (selectedDate != null) { - showTimePicker( - context: context, - initialTime: TimeOfDay.now(), - ).then((selectedTime) { - // Handle the selected date and time here. - if (selectedTime != null) { - DateTime selectedDateTime = DateTime( - selectedDate.year, - selectedDate.month, - selectedDate.day, - selectedTime.hour, - selectedTime.minute, - ); - if (selectedDateTime != null) { - serviceRequestProvider.currentSelectedRequest.startDate = selectedDateTime?.toIso8601String(); - } + if (serviceRequestProvider.currentSelectedRequest.firstAction?.id == 404 && Provider.of(context, listen: false).assetGroup.id == 1) ...[ + 8.height, + Row( + children: [ + ADatePicker( + label: context.translation.startDate, + date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.startDate ?? ""), + formatDateWithTime: true, + onDatePicker: (selectedDate) { + if (selectedDate != null) { + showTimePicker( + context: context, + initialTime: TimeOfDay.now(), + ).then((selectedTime) { + // Handle the selected date and time here. + if (selectedTime != null) { + DateTime selectedDateTime = DateTime( + selectedDate.year, + selectedDate.month, + selectedDate.day, + selectedTime.hour, + selectedTime.minute, + ); + if (selectedDateTime != null) { + serviceRequestProvider.currentSelectedRequest.startDate = selectedDateTime?.toIso8601String(); } - }); - } - }, - ).expanded, - 8.width, - ADatePicker( - label: context.translation.endDate, - date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.endDate ?? ""), - formatDateWithTime: true, - onDatePicker: (selectedDate) { - if (selectedDate != null) { - showTimePicker( - context: context, - initialTime: TimeOfDay.now(), - ).then((selectedTime) { - // Handle the selected date and time here. - if (selectedTime != null) { - DateTime selectedDateTime = DateTime( - selectedDate.year, - selectedDate.month, - selectedDate.day, - selectedTime.hour, - selectedTime.minute, - ); - if (selectedDateTime != null) { - serviceRequestProvider.currentSelectedRequest.endDate = selectedDateTime?.toIso8601String(); - serviceRequestProvider.currentSelectedRequest.workingHours = (((DateTime.parse(serviceRequestProvider.currentSelectedRequest.endDate) - .difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest.startDate)) - .inSeconds ?? - 0) / - 60) / - 60) - .toStringAsFixed(2); - } + } + }); + } + }, + ).expanded, + 8.width, + ADatePicker( + label: context.translation.endDate, + date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest.endDate ?? ""), + formatDateWithTime: true, + onDatePicker: (selectedDate) { + if (selectedDate != null) { + showTimePicker( + context: context, + initialTime: TimeOfDay.now(), + ).then((selectedTime) { + // Handle the selected date and time here. + if (selectedTime != null) { + DateTime selectedDateTime = DateTime( + selectedDate.year, + selectedDate.month, + selectedDate.day, + selectedTime.hour, + selectedTime.minute, + ); + if (selectedDateTime != null) { + serviceRequestProvider.currentSelectedRequest.endDate = selectedDateTime?.toIso8601String(); + serviceRequestProvider.currentSelectedRequest.workingHours = (((DateTime.parse(serviceRequestProvider.currentSelectedRequest.endDate) + .difference(DateTime.parse(serviceRequestProvider.currentSelectedRequest.startDate)) + .inSeconds ?? + 0) / + 60) / + 60) + .toStringAsFixed(2); } - }); - } - }, - ).expanded, - ], - ) - ], - 8.height, - AppTextFormField( - labelText: context.translation.comments, - textInputType: TextInputType.multiline, - alignLabelWithHint: true, - onChange: (text) { - serviceRequestProvider.currentSelectedRequest.comments = text; - }, - onSaved: (text) { - serviceRequestProvider.currentSelectedRequest.comments = text; - }, - ), - 16.height, - Consumer( - builder: (context, snapshot, _) => AppFilledButton( - label: context.translation.save, - loading: snapshot.isLoading ?? false, - onPressed: () async { - _formKey.currentState.save(); - - // await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest); - // Navigator.pop(context, true); - Navigator.of(context).push(MaterialPageRoute(builder: (_) => VerifyArrivalView())); - }, - ), - ), - 16.height, + } + }); + } + }, + ).expanded, + ], + ) ], - ), + 8.height, + AppTextFormField( + labelText: context.translation.comments, + backgroundColor: AppColor.neutral100, + showShadow: false, + textInputType: TextInputType.multiline, + alignLabelWithHint: true, + onChange: (text) { + serviceRequestProvider.currentSelectedRequest.comments = text; + }, + onSaved: (text) { + serviceRequestProvider.currentSelectedRequest.comments = text; + }, + ), + 12.height, + AppFilledButton( + label: context.translation.save, + buttonColor: AppColor.primary10, + + loading: serviceRequestProvider.isLoading ?? false, + onPressed: () async { + _formKey.currentState.save(); + + // await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest); + // Navigator.pop(context, true); + Navigator.of(context).push(MaterialPageRoute(builder: (_) => VerifyArrivalView())); + }, + ), + 16.height, + ], ), ), - ); + ).bottomSheetContainer(context); })); } static Future rejectRequestBottomSheet({@required BuildContext context}) { final GlobalKey _formKey = GlobalKey(); - final userProvider = Provider.of(context, listen: false); return showModalBottomSheet( context: context, useSafeArea: true, isScrollControlled: true, backgroundColor: Colors.transparent, builder: (context) => Consumer(builder: (context, serviceRequestProvider, child) { - return Container( - clipBehavior: Clip.antiAlias, - margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), - decoration: BoxDecoration( - color: Theme.of(context).scaffoldBackgroundColor, - borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), - ), - padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), - child: Form( - key: _formKey, - child: SingleChildScrollView( - child: Column( - children: [ - Container( - width: 40.toScreenWidth, - height: 5.toScreenHeight, - decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)), - ), - Align( - alignment: AlignmentDirectional.centerStart, - child: context.translation.rejectionReason.heading3(context).custom(fontWeight: FontWeight.w600).paddingOnly(top: 16, bottom: 16), - ), - SingleItemDropDownMenu( - context: context, - title: context.translation.rejectionReason, - initialValue: serviceRequestProvider.currentSelectedRequest.firstAction, //_serviceRequest.firstAction, - onSelect: (value) { - serviceRequestProvider.currentSelectedRequest.firstAction = value; - if (serviceRequestProvider.currentSelectedRequest.firstAction.value != 2) { - serviceRequestProvider.currentSelectedRequest.visitDate = null; - } - }, - ), - 8.height, - AppTextFormField( - labelText: context.translation.comments, - textInputType: TextInputType.multiline, - alignLabelWithHint: true, - onChange: (text) { - serviceRequestProvider.currentSelectedRequest.comments = text; - }, - onSaved: (text) { - serviceRequestProvider.currentSelectedRequest.comments = text; + return Form( + key: _formKey, + child: SingleChildScrollView( + child: Column( + children: [ + const SizedBox().indicatorWidget(), + Align( + alignment: AlignmentDirectional.centerStart, + child: context.translation.rejectionReason.heading4(context).paddingOnly(top: 21), + ), + 15.height, + SingleItemDropDownMenu( + context: context, + backgroundColor: AppColor.neutral100, + height: 70.toScreenHeight, + title: context.translation.rejectionReason, + initialValue: serviceRequestProvider.currentSelectedRequest.firstAction, //_serviceRequest.firstAction, + onSelect: (value) { + serviceRequestProvider.currentSelectedRequest.firstAction = value; + if (serviceRequestProvider.currentSelectedRequest.firstAction.value != 2) { + serviceRequestProvider.currentSelectedRequest.visitDate = null; + } + }, + ), + 12.height, + AppTextFormField( + backgroundColor: AppColor.neutral100, + labelText: context.translation.comments, + textInputType: TextInputType.multiline, + alignLabelWithHint: true, + onChange: (text) { + serviceRequestProvider.currentSelectedRequest.comments = text; + }, + onSaved: (text) { + serviceRequestProvider.currentSelectedRequest.comments = text; + }, + ), + 16.height, + Consumer( + builder: (context, snapshot, _) => AppFilledButton( + label: context.translation.reject, + maxWidth: true, + buttonColor: Colors.white54, + textColor: AppColor.red30, + showBorder: true, + loading: snapshot.isLoading ?? false, + onPressed: () async { + _formKey.currentState.save(); + //Todo implement backend logic.. + // serviceRequestProvider.serviceRequest.device = asset; + // await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.currentSelectedRequest); + Navigator.pop(context, true); }, ), - 16.height, - Consumer( - builder: (context, snapshot, _) => AppFilledButton( - label: context.translation.reject, - maxWidth: true, - buttonColor: Colors.white54, - textColor: AppColor.red50, - showBorder: true, - loading: snapshot.isLoading ?? false, - onPressed: () async { - _formKey.currentState.save(); - // serviceRequestProvider.serviceRequest.device = asset; - await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.currentSelectedRequest); - Navigator.pop(context, true); - }, - ), - ), - 16.height, - ], - ), + ), + 16.height, + ], ), ), - ); + ).bottomSheetContainer(context); })); } @@ -688,36 +612,32 @@ class ServiceRequestBottomSheet { {'heading': context.translation.assetToBeRetired, 'subHeading': context.translation.sparePartRequestDetail, 'icon': AppAsset.retiredAssetIcon}, ]; Widget listItem({@required BuildContext context, @required String icon, @required String heading, @required String subHeading, @required VoidCallback onTap}) { - return Padding( - padding: EdgeInsets.only(bottom: 8.toScreenHeight), - child: Card( - color: AppColor.neutral80, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(15), - // Circular border radius + return Card( + color: AppColor.neutral80, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14), + // Circular border radius + ), + // color: Colors.white, + child: ListTile( + minVerticalPadding:12.toScreenWidth, + horizontalTitleGap: 2.toScreenHeight, + onTap: onTap, + contentPadding: const EdgeInsets.all(8), + leading: SvgPicture.asset(icon), + title: Text( + heading, + style: AppTextStyles.heading6, ), - // color: Colors.white, - child: ListTile( - minVerticalPadding: 8, - horizontalTitleGap: 10, - onTap: onTap, - contentPadding: const EdgeInsets.all(8), - leading: SvgPicture.asset(icon), - title: Text( - heading, - style: AppTextStyles.heading5, - ), - subtitle: Text( - subHeading, - style: AppTextStyles.bodyText, - ), + subtitle: Text( + subHeading, + style: AppTextStyles.bodyText2, ), ), ); } void onItemTap({@required int index, @required ServiceRequest serviceRequest, @required BuildContext context}) { - print('on item tap i got index is $index'); switch (index) { case 0: Navigator.of(context).push(MaterialPageRoute(builder: (_) => const SparePartRequest())); @@ -751,7 +671,7 @@ class ServiceRequestBottomSheet { return showModalBottomSheet( context: context, useSafeArea: true, - isScrollControlled: false, + isScrollControlled: true, backgroundColor: Colors.transparent, builder: (context) => Consumer(builder: (context, serviceRequestProvider, child) { return Container( @@ -762,39 +682,39 @@ class ServiceRequestBottomSheet { borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), ), padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), - child: SafeArea( - child: Column( - children: [ - Align( - alignment: AlignmentDirectional.centerStart, - child: context.translation.selectActivityType.heading4(context).paddingOnly(top: 16, bottom: 16), - ), - ListView.builder( - shrinkWrap: true, - padding: EdgeInsets.zero, - itemCount: items.length, - itemBuilder: (context, index) { - final item = items[index]; - return listItem( - icon: item['icon'], - heading: item['heading'], - subHeading: item['subHeading'], - context: context, - onTap: () { - onItemTap(serviceRequest: serviceRequestProvider.currentSelectedRequest, index: index, context: context); - }); - }, - ), - ], - ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox().indicatorWidget(), + 8.height, + Align( + alignment: AlignmentDirectional.centerStart, + child: context.translation.selectActivityType.bottomSheetHeadingTextStyle(context), + ), + 16.height, + ListView.builder( + shrinkWrap: true, + padding: EdgeInsets.zero, + itemCount: items.length, + itemBuilder: (context, index) { + final item = items[index]; + return listItem( + icon: item['icon'], + heading: item['heading'], + subHeading: item['subHeading'], + context: context, + onTap: () { + onItemTap(serviceRequest: serviceRequestProvider.currentSelectedRequest, index: index, context: context); + }); + }, + ), + ], ), ); })); } static Future actionBottomSheet({@required BuildContext context, @required String title, String button1Text, String button2Text, VoidCallback button1Tap, VoidCallback button2Tap}) { - final GlobalKey _formKey = GlobalKey(); - final userProvider = Provider.of(context, listen: false); return showModalBottomSheet( context: context, useSafeArea: true, @@ -808,46 +728,39 @@ class ServiceRequestBottomSheet { color: Theme.of(context).scaffoldBackgroundColor, borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), ), - padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), + padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 12.toScreenHeight), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Container( - width: 40.toScreenWidth, - height: 5.toScreenHeight, - decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)), - ), + const SizedBox().indicatorWidget(), + 8.height, Align( alignment: AlignmentDirectional.centerStart, - child: title.heading4(context).custom(fontWeight: FontWeight.w500).paddingOnly(top: 16, bottom: 16), + child: title.bottomSheetHeadingTextStyle(context), ), + 41.height, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - SizedBox( - width: 200.toScreenHeight, - child: AppFilledButton( - label: button1Text ?? context.translation.no, - loading: false, - buttonColor: AppColor.neutral40, - textColor: AppColor.black10, - onPressed: button1Tap ?? - () async { - Navigator.pop(context); - // await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest); - // Navigator.pop(context, true); - }, - ), - ), - SizedBox( - width: 200.toScreenHeight, - child: AppFilledButton( - label: context.translation.yes, - buttonColor: AppColor.primary10, - loading: false, - onPressed: button2Tap, - ), - ), + AppFilledButton( + label: button1Text ?? context.translation.no, + loading: false, + buttonColor: AppColor.white60, + textColor: AppColor.black10, + onPressed: button1Tap ?? + () async { + Navigator.pop(context); + // await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest); + // Navigator.pop(context, true); + }, + ).expanded, + 12.width, + AppFilledButton( + label: context.translation.yes, + buttonColor: AppColor.primary10, + loading: false, + onPressed: button2Tap, + ).expanded, ], ) ], @@ -855,4 +768,62 @@ class ServiceRequestBottomSheet { ); })); } + static Future feedBackBottomSheet({@required BuildContext context}) { + final GlobalKey _formKey = GlobalKey(); + return showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (context) => Consumer(builder: (context, serviceRequestProvider, child) { + return Container( + clipBehavior: Clip.antiAlias, + margin: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), + decoration: BoxDecoration( + color: AppColor.background(context), + borderRadius: const BorderRadius.only(topRight: Radius.circular(20), topLeft: Radius.circular(20)), + ), + padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 16.toScreenHeight), + child: Form( + key: _formKey, + child: SingleChildScrollView( + child: StatefulBuilder(builder: (context, setState) { + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const SizedBox().indicatorWidget(), + 8.height, + Align( + alignment: AlignmentDirectional.centerStart, + child: context.translation.feedBack.bottomSheetHeadingTextStyle(context), + ), + 21.height, + AppTextFormField( + labelText: context.translation.comments, + textInputType: TextInputType.multiline, + showWithoutDecoration: true, + backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral100, + alignLabelWithHint: true, + onChange: (text) { + serviceRequestProvider.currentSelectedRequest.comments = text; + }, + onSaved: (text) { + serviceRequestProvider.currentSelectedRequest.comments = text; + }, + ), + 16.height, + AppFilledButton( + label: context.translation.fixed, + buttonColor: AppColor.green70, + loading: false, + onPressed: () {}, + ), + ], + ); + }), + ), + ), + ); + })); + } } diff --git a/lib/service_request_latest/views/components/request_detail_view.dart b/lib/service_request_latest/views/components/request_detail_view.dart index 6f51e5a3..f85551e3 100644 --- a/lib/service_request_latest/views/components/request_detail_view.dart +++ b/lib/service_request_latest/views/components/request_detail_view.dart @@ -1,4 +1,3 @@ -import 'package:another_flushbar/flushbar.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; @@ -16,11 +15,7 @@ import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart'; -import 'package:test_sa/service_request_latest/views/components/bottom_sheets/reject_request_bottomsheet.dart'; -import 'package:test_sa/service_request_latest/views/components/verify_otp_view.dart'; -import 'package:test_sa/utilities/general_utils.dart'; import 'package:test_sa/views/pages/user/requests/comments_bottom_sheet.dart'; -import 'package:test_sa/views/pages/user/requests/first_action_bottom_sheet.dart'; import 'package:test_sa/views/pages/user/requests/update_service_request_page.dart'; import 'package:test_sa/views/pages/user/requests/work_order/work_orders_list_page.dart'; import 'package:test_sa/views/widgets/images/files_list.dart'; @@ -28,8 +23,6 @@ import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/sound/sound_player.dart'; -import 'bottom_sheets/initial_visit_bottomsheet.dart'; - class RequestDetailView extends StatefulWidget { static const String id = "/call-details"; ServiceRequest serviceRequest; @@ -121,7 +114,7 @@ class _RequestDetailViewState extends State { label: context.translation.reject, maxWidth: true, buttonColor: Colors.white54, - textColor: AppColor.red50, + textColor: AppColor.red30, showBorder: true, onPressed: () async { ServiceRequestBottomSheet.rejectRequestBottomSheet(context: context); @@ -145,8 +138,8 @@ class _RequestDetailViewState extends State { maxWidth: true, buttonColor: AppColor.green70, onPressed: () async { - // GeneralUtils.showFlushBar(context: context); - Navigator.of(context).push(MaterialPageRoute(builder: (_) => const VerifyOtpView())); + // const SizedBox().flushBar(context: context); + ServiceRequestBottomSheet.feedBackBottomSheet(context: context); // ServiceRequestBottomSheet.fixRemotelyBottomSheet(context: context); // bool shouldReloadData = (await showModalBottomSheet( @@ -163,22 +156,6 @@ class _RequestDetailViewState extends State { ).expanded, ], ) - // ? AppFilledButton( - // label: context.translation.firstAction, - // maxWidth: true, - // onPressed: () async { - // bool shouldReloadData = (await showModalBottomSheet( - // context: context, - // useSafeArea: true, - // isScrollControlled: true, - // backgroundColor: Colors.transparent, - // builder: (context) => FirstActionBottomSheet(request: serviceRequestsProvider.serviceRequest), - // )) as bool; - // if (shouldReloadData ?? false) { - // getServiceRequest(); - // } - // }, - // ) : AppFilledButton( label: context.translation.viewWorkOrder, maxWidth: true, diff --git a/lib/service_request_latest/views/components/spare_part_request.dart b/lib/service_request_latest/views/components/spare_part_request.dart index 68077dec..c2e4cd2e 100644 --- a/lib/service_request_latest/views/components/spare_part_request.dart +++ b/lib/service_request_latest/views/components/spare_part_request.dart @@ -1,9 +1,7 @@ -import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/attachment.dart'; import 'package:test_sa/controllers/providers/api/parts_provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -19,9 +17,7 @@ import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; import 'package:test_sa/providers/loading_list_notifier.dart'; import 'package:test_sa/providers/work_order/reason_provider.dart'; -import 'package:test_sa/service_request_latest/views/components/bottom_sheets/action_bottomsheet.dart'; import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart'; -import 'package:test_sa/views/pages/user/requests/work_order/part_no_button.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; diff --git a/lib/service_request_latest/views/components/verify_assets_details.dart b/lib/service_request_latest/views/components/verify_assets_details.dart new file mode 100644 index 00000000..7b702b26 --- /dev/null +++ b/lib/service_request_latest/views/components/verify_assets_details.dart @@ -0,0 +1,246 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/parts_provider.dart'; +import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/models/device/asset.dart'; +import 'package:test_sa/models/service_request/service_report.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; +import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; +import 'package:test_sa/providers/loading_list_notifier.dart'; +import 'package:test_sa/providers/work_order/reason_provider.dart'; +import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart'; +import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; +import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart'; +import '../../../../../models/lookup.dart'; +import '../../../../../models/service_request/spare_parts.dart'; +import '../../../../../new_views/common_widgets/app_text_form_field.dart'; +import '../../../../../new_views/common_widgets/default_app_bar.dart'; +import '../../../controllers/validator/validator.dart'; + +class SparePartRequest extends StatefulWidget { + static const String id = "/verify-assets-detail"; + + const SparePartRequest({Key key}) : super(key: key); + + @override + _SparePartRequestState createState() => _SparePartRequestState(); +} + +class _SparePartRequestState extends State with TickerProviderStateMixin { + UserProvider _userProvider; + SettingProvider _settingProvider; + ServiceRequestsProvider _serviceRequestsProvider; + ServiceStatusProvider _assetTypeProvider; + PartsProvider _partsProvider; + ServiceReport _serviceReport; + bool _isLoading = false; + List _spareParts = []; + + final List _files = []; + final GlobalKey _formKey = GlobalKey(); + final GlobalKey _scaffoldKey = GlobalKey(); + final TextEditingController _faultController = TextEditingController(); + final TextEditingController _workPreformedController = TextEditingController(); + final TextEditingController _partQtyController = TextEditingController(); + final TextEditingController _oracleNoController = TextEditingController(); + + @override + void initState() { + _serviceReport = ServiceReport( + // returnToService: DateTime.now(), + // //type: const Lookup(value: 2), + // device: widget.request.device, + sparePartsWorkOrders: [], + ); + super.initState(); + if (context.mounted) { + ServiceRequestsProvider serviceRequestsProvider = Provider.of(context, listen: false); + Provider.of(context, listen: false).reset(); + Provider.of(context, listen: false).reset(); + Provider.of(context, listen: false).serviceRequestId = serviceRequestsProvider.currentSelectedRequest.id; + } + // _isLoading = true; + } + + Asset loanAvailabilityAsset; + + @override + void dispose() { + _faultController.dispose(); + _workPreformedController.dispose(); + _partQtyController.dispose(); + super.dispose(); + } + + void getRequestForWorkOrder() async { + _isLoading = true; + setState(() {}); + ServiceRequestsProvider serviceRequestsProvider = Provider.of(context, listen: false); + _serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: serviceRequestsProvider.currentSelectedRequest.id); + await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); + _serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee; + _serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType; + _serviceReport.serviceType = Lookup(id: 65, name: "Interval", value: 1); // default value in service type as in web + _spareParts = await _partsProvider.getPartsList(assetId: serviceRequestsProvider.currentSelectedRequest.deviceId); + _isLoading = false; + setState(() {}); + } + + @override + Widget build(BuildContext context) { + _userProvider = Provider.of(context); + _settingProvider = Provider.of(context); + _serviceRequestsProvider = Provider.of(context); + _assetTypeProvider = Provider.of(context); + _partsProvider = Provider.of(context); + if (_serviceReport.callRequest == null) { + getRequestForWorkOrder(); + } + _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere( + (element) => element.value == _serviceReport.callRequest?.assetType, + orElse: () => null, + ); + + return Scaffold( + key: _scaffoldKey, + appBar: DefaultAppBar(title: context.translation.sparePartRequest), + body: Consumer(builder: (context, serviceRequestProvider, child) { + return SafeArea( + child: LoadingManager( + isLoading: _isLoading, + isFailedLoading: false, + stateCode: 200, + onRefresh: () async {}, + child: Form( + key: _formKey, + child: Column( + children: [ + SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Card( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + context.translation.sparePartDetails.heading5(context), + 12.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.partNo, + staticData: _spareParts, + height: 80.toScreenHeight, + showShadow: false, + initialValue: serviceRequestProvider.initialSelectedSparePart.sparePart, + backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + onSelect: (part) { + serviceRequestProvider.initialSelectedSparePart = SparePartsWorkOrders(id: 0, sparePart: part, qty: 0); + }, + ), + 15.height, + AppTextFormField( + controller: _partQtyController, + labelText: context.translation.quantity, + textInputType: TextInputType.number, + contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight), + showWithoutDecoration: true, + backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + enable: serviceRequestProvider.initialSelectedSparePart != null && serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null, + validator: (value) => value == null || value.isEmpty + ? context.translation.requiredField + : Validator.isNumeric(value) + ? null + : context.translation.onlyNumbers, + onSaved: (text) { + serviceRequestProvider.initialSelectedSparePart.qty = num.tryParse(text ?? ""); + }, + ), + 15.height, + AppTextFormField( + controller: _oracleNoController, + labelText: context.translation.oracleNo, + textInputType: TextInputType.number, + contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight), + showWithoutDecoration: true, + backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + enable: serviceRequestProvider.initialSelectedSparePart != null && serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null, + validator: (value) => value == null || value.isEmpty + ? context.translation.requiredField + : Validator.isNumeric(value) + ? null + : context.translation.onlyNumbers, + onSaved: (text) { + //TODO set the values... + // serviceRequestProvider.initialSelectedSparePart. = num.tryParse(text ?? ""); + }, + ), + 15.height, + AppTextFormField( + initialValue: _serviceReport?.comment, + backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + labelText: context.translation.description, + alignLabelWithHint: true, + showWithoutDecoration: true, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.comment = value; + }, + ), + 15.height, + MultiFilesPicker(label: context.translation.attachQuotation, files: _files), + ], + ).paddingAll(16), + ), + 8.height, + ], + ), + ).expanded, + AppFilledButton( + label: context.translation.addSparePartActivity, + buttonColor: AppColor.green70, + onPressed: () async { + ServiceRequestBottomSheet.actionBottomSheet(context: context, title: context.translation.addSparePartActionHeading); + // bool shouldReloadData = (await showModalBottomSheet( + // context: context, + // useSafeArea: true, + // isScrollControlled: true, + // backgroundColor: Colors.transparent, + // builder: (context) => ActionBottomSheet(title: context.translation.addSparePartActionHeading), + // )) as bool; + // if (shouldReloadData ?? false) {} + //TODO write add sparepart logic + + // if ((!_formKey.currentState.validate()) || (!(await _serviceReport.validate(context)))) { + // setState(() {}); + // return; + // } + // _formKey.currentState.save(); + // _serviceReport.attachmentsWorkOrder ??= []; + // if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = []; + // for (var file in _files) { + // _serviceReport.attachmentsWorkOrder.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); + // } + // final user = Provider.of(context, listen: false).user; + // await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: serviceRequestProvider.serviceRequest, user: user); + }, + ), + ], + ).paddingAll(16), + ), + ), + ); + }), + ); + } +} diff --git a/lib/utilities/general_utils.dart b/lib/utilities/general_utils.dart deleted file mode 100644 index 43633bc4..00000000 --- a/lib/utilities/general_utils.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:another_flushbar/flushbar.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:test_sa/new_views/app_style/app_color.dart'; - -class GeneralUtils{ - - static Duration parseTimeString(String timeString) { - try { - print('time string i got is ${timeString}'); - List timeParts = timeString.split(':'); - - int hours = int.parse(timeParts[0]); - int minutes = int.parse(timeParts[1]); - int seconds = int.parse(timeParts[2]); - - print(''); - - return Duration(hours: hours, minutes: minutes, seconds: seconds); - } catch (e) { - if (kDebugMode) { - print("Error parsing time string: $e"); - } - return Duration.zero; // Return zero duration in case of an error - } - } - static Widget showFlushBar({@required BuildContext context,String title,String message,double duration}){ - return Flushbar( - flushbarPosition: FlushbarPosition.TOP, - backgroundColor: AppColor.green70, - title:title?? "Hey Ninja", - message:message?? "Lorem Ipsum is simply dummy text of the printing and typesetting industry", - duration: Duration(seconds:duration?? 3), - flushbarStyle: FlushbarStyle.GROUNDED, - reverseAnimationCurve: Curves.easeInOut, - mainButton: IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: const Icon( - Icons.close, - color: AppColor.white20, - ), - ), - )..show(context); - } -} \ No newline at end of file