service detail new flow ui

design_3.0_latest
muhammad.abbasi 1 year ago
parent d5ee12abbb
commit 667e12a548

@ -0,0 +1,4 @@
<svg width="38" height="38" viewBox="0 0 38 38" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="19" cy="19" r="19" fill="#3B3D4A"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M18 20.6666V28.6667H20V20.6666H28.6667V18.6666H20V10L18 10V18.6666H10V20.6666H18Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 298 B

@ -1,5 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.26821 0C3.56161 0 2.90522 0.350859 2.51311 0.939328L0.590535 3.82327C0.50841 3.94627 0.468988 4.08787 0.403503 4.2188H11.2969V0H4.26821Z" fill="#767676"/>
<path d="M23.4095 3.82322L21.4868 0.939328C21.0948 0.350859 20.3915 0 19.6849 0H12.7031V4.21875H23.5965C23.531 4.08787 23.4916 3.94627 23.4095 3.82322Z" fill="#767676"/>
<path d="M23.9781 5.625H0.0218906C0.0197344 5.67548 0 5.72259 0 5.77331V21.8906C0 23.0538 0.946219 24 2.10938 24H21.8906C23.0538 24 24 23.0538 24 21.8906V5.77331C24 5.72259 23.9803 5.67548 23.9781 5.625ZM14.8125 12.6562H9.1875C8.02434 12.6562 7.07812 11.71 7.07812 10.5469C7.07812 9.38372 8.02434 8.4375 9.1875 8.4375H14.8125C15.9757 8.4375 16.9219 9.38372 16.9219 10.5469C16.9219 11.71 15.9757 12.6562 14.8125 12.6562Z" fill="#767676"/>
<svg width="27" height="27" viewBox="0 0 27 27" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M26.3534 13.804L20.5662 11.875V2.9003C20.5662 2.55985 20.3483 2.25758 20.0253 2.1499L13.6973 0.0405392C13.5349 -0.0135658 13.3593 -0.0134603 13.197 0.0405392L6.86891 2.1499C6.54591 2.25753 6.32807 2.5598 6.32807 2.9003V11.875L0.540839 13.804C0.217844 13.9117 0 14.214 0 14.5545V24.0993C0 24.4398 0.217844 24.7421 0.540839 24.8497L6.86891 26.9591C6.95012 26.9861 7.0346 26.9997 7.11908 26.9997C7.20356 26.9997 7.28804 26.9861 7.36925 26.9591L13.4471 24.9331L19.5251 26.9591C19.6063 26.9861 19.6908 26.9997 19.7752 26.9997C19.8596 26.9997 19.9442 26.9861 20.0253 26.9591L26.3534 24.8497C26.6764 24.7421 26.8943 24.4398 26.8943 24.0993V14.5545C26.8943 14.214 26.6764 13.9117 26.3534 13.804ZM19.7752 15.83L15.9485 14.5545L19.7752 13.2789L23.6019 14.5545L19.7752 15.83ZM7.11908 13.2789L10.9457 14.5545L7.11908 15.83L3.29239 14.5545L7.11908 13.2789ZM12.6561 5.57976V13.457L7.91009 11.875V3.99774L12.6561 5.57976ZM18.9842 11.875L14.2382 13.457V5.57976L18.9842 3.99774V11.875ZM7.91009 17.234L12.6561 15.6519V23.5292L7.91009 25.1112V17.234ZM13.4471 1.62472L17.2738 2.9003L13.4471 4.17583L9.62046 2.9003L13.4471 1.62472ZM1.58202 15.6519L6.32807 17.234V25.1112L1.58202 23.5292V15.6519ZM14.2382 15.6519L18.9842 17.234V25.1112L14.2382 23.5292V15.6519ZM20.5662 25.1112V17.234L25.3123 15.6519V23.5292L20.5662 25.1112Z" fill="#7D859A"/>
</svg>

Before

Width:  |  Height:  |  Size: 878 B

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1,5 @@
<svg width="27" height="27" viewBox="0 0 27 27" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M22.7103 3.53696C20.4293 1.25596 17.3964 -0.000127577 14.1708 9.71869e-09C13.6422 9.71869e-09 13.2139 0.428436 13.2139 0.956899C13.2139 1.48536 13.6423 1.9138 14.1708 1.9138C16.8853 1.91367 19.4374 2.97073 21.357 4.89027C23.2766 6.80981 24.3337 9.36205 24.3335 12.0767C24.3335 12.6052 24.7619 13.0336 25.2904 13.0336C25.8189 13.0336 26.2473 12.6052 26.2473 12.0768C26.2475 8.85081 24.9914 5.81795 22.7103 3.53696Z" fill="#7D859A"/>
<path d="M18.774 12.0768C18.774 12.6053 19.2024 13.0337 19.731 13.0336C20.2595 13.0336 20.6878 12.6052 20.6878 12.0767C20.6875 8.48387 17.764 5.56048 14.1709 5.55997C14.1708 5.55997 14.171 5.55997 14.1709 5.55997C13.6424 5.55997 13.214 5.98828 13.2139 6.51674C13.2139 7.0452 13.6422 7.47364 14.1706 7.47377C16.7087 7.47415 18.7737 9.53901 18.774 12.0768Z" fill="#7D859A"/>
<path d="M16.6566 16.9557C15.198 16.8802 14.4549 17.965 14.0986 18.486C13.8001 18.9222 13.9119 19.5177 14.3481 19.8161C14.7844 20.1145 15.3798 20.0028 15.6782 19.5665C16.0993 18.9509 16.29 18.8541 16.5487 18.8664C17.3769 18.9637 20.6387 21.3539 20.9653 22.1013C21.0472 22.3214 21.0441 22.5372 20.9562 22.7996C20.6138 23.816 20.0469 24.5302 19.3166 24.865C18.6228 25.183 17.7722 25.1542 16.8573 24.7819C13.4409 23.3894 10.4561 21.4462 7.98603 19.0059C7.98501 19.0049 7.98399 19.004 7.98309 19.003C5.54797 16.5353 3.60828 13.5544 2.21809 10.1433C1.84567 9.22757 1.81683 8.37682 2.13491 7.68314C2.46969 6.95283 3.18392 6.38596 4.19938 6.0439C4.46272 5.95561 4.67809 5.95281 4.89614 6.03395C5.64622 6.36172 8.0363 9.62335 8.13275 10.4422C8.14653 10.7106 8.04893 10.9013 7.43383 11.3215C6.99749 11.6196 6.88534 12.215 7.18351 12.6514C7.48155 13.0877 8.07687 13.1997 8.51334 12.9017C9.03466 12.5457 10.1191 11.8047 10.0439 10.3411C9.96094 8.81241 6.98715 4.76395 5.56622 4.24149C4.93428 4.00596 4.26956 4.00188 3.58978 4.23C2.06027 4.74507 0.955624 5.66344 0.395263 6.88572C-0.148256 8.07151 -0.131032 9.44728 0.44566 10.865C1.93345 14.5155 4.01502 17.7097 6.63246 20.359C6.63884 20.3655 6.64535 20.3719 6.65198 20.3781C9.2994 22.9907 12.4898 25.0685 16.1355 26.5545C16.8655 26.8514 17.5845 27 18.2721 27C18.9194 27 19.5392 26.8683 20.1142 26.6047C21.3366 26.0445 22.2548 24.94 22.7703 23.4095C22.9979 22.731 22.9942 22.0665 22.7604 21.4375C22.2362 20.0127 18.1877 17.0389 16.6566 16.9557Z" fill="#7D859A"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

@ -1,5 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.0106 24C15.0694 24 17.8642 22.85 19.987 20.9604L11.5133 12.4867C11.3814 12.3549 11.3073 12.176 11.3073 11.9895V0C5.01077 0.365427 0 5.60294 0 11.9894C0 18.6121 5.38796 24 12.0106 24Z" fill="#163A51"/>
<path d="M13.7084 12.6927L20.9816 19.9659C22.7252 18.007 23.8384 15.4757 24 12.6927H13.7084Z" fill="#163A51"/>
<path d="M12.7141 11.2861H24.0002C23.6483 5.22241 18.7778 0.351924 12.7141 0V11.2861Z" fill="#163A51"/>
<svg width="28" height="26" viewBox="0 0 28 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.696 26H0.820312C0.367218 26 0 25.6363 0 25.1875V25V3V2.4374C0 1.98885 0.367218 1.62493 0.820312 1.62493H3.28146V0.812467C3.28146 0.363706 3.64868 0 4.10178 0H12.4145C12.6354 0 12.8458 0.0903446 12.9947 0.238027L17.9166 5.11283C18.0642 5.25882 18.1569 5.4649 18.1569 5.68748V8.67372C18.736 8.94518 19.2782 9.31713 19.7565 9.79086C21.7985 11.8134 21.9778 14.9923 20.2948 17.2184L21.4384 18.351L22.0186 17.7763C22.3388 17.4592 22.8583 17.4592 23.1785 17.7763L27.2803 21.8389C28.2399 22.7893 28.2399 24.3357 27.2803 25.2861C26.3207 26.2363 24.7593 26.2363 23.8 25.2861L19.6982 21.2236C19.3777 20.9062 19.3777 20.3919 19.6982 20.0745L20.2782 19.5001L19.1349 18.3675C18.8253 18.597 18.4974 18.7917 18.1569 18.9512V21.9375C18.1569 22.3862 17.7897 22.7499 17.3366 22.7499H16.5163V25.1875C16.5163 25.6363 16.149 26 15.696 26ZM26.1201 24.137C26.4401 23.8203 26.4401 23.3047 26.1201 22.9879L22.5985 19.5001L21.4384 20.6491L24.9599 24.137C25.2799 24.4538 25.8003 24.4538 26.1201 24.137ZM12.7956 16.6852C14.3948 18.2691 16.9971 18.2691 18.5963 16.6852C20.1955 15.1011 20.1955 12.5238 18.5963 10.94C16.9969 9.35585 14.3948 9.35606 12.7956 10.94C11.1964 12.5238 11.1964 15.1011 12.7956 16.6852ZM15.3561 4.87501L13.235 2.77402V4.87501H15.3561ZM11.5942 1.62493H4.92209V21.125H16.5163V19.4393C14.7635 19.6879 12.9481 19.1342 11.6354 17.8341C9.39642 15.6165 9.39642 12.0084 11.6354 9.79086C12.9637 8.47526 14.7861 7.94017 16.5163 8.1856V6.49995H12.4145C11.9616 6.49995 11.5942 6.13624 11.5942 5.68748V1.62493Z" fill="#1E95DE"/>
</svg>

Before

Width:  |  Height:  |  Size: 532 B

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1,3 @@
<svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.1512 17.6694C22.3808 19.8946 23.6086 22.8531 23.6086 26H21.5734C21.5734 20.6238 17.191 16.25 11.8043 16.25C6.41762 16.25 2.03522 20.6238 2.03522 26H0C0 22.8531 1.22785 19.8946 3.45739 17.6694C4.71521 16.414 6.20703 15.477 7.83455 14.8986C6.11025 13.6519 4.9863 11.6265 4.9863 9.34375C4.9863 5.56364 8.06768 2.48828 11.8552 2.48828C12.2747 2.48828 12.6856 2.52616 13.0845 2.59843C12.8894 3.22568 12.7838 3.89909 12.7727 4.60708C12.4755 4.54985 12.1689 4.51953 11.8552 4.51953C9.18991 4.51953 7.02153 6.68368 7.02153 9.34375C7.02153 12.0038 9.18991 14.168 11.8552 14.168C13.4103 14.168 14.7959 13.4311 15.6806 12.2891H17.1971C17.2008 12.2891 17.2045 12.2891 17.2082 12.2891C17.3927 12.2891 17.7054 12.2756 18.0946 12.2087C17.5909 13.2973 16.809 14.2321 15.841 14.923C17.4425 15.5032 18.9107 16.4313 20.1512 17.6694ZM26 4.7321C26 7.67066 23.8554 9.49609 20.4031 9.49609C20.0731 9.49609 19.757 9.46679 19.4635 9.42744C18.5533 10.1879 17.546 10.2578 17.2107 10.2578C17.2074 10.2578 17.2041 10.2578 17.2008 10.2578L15.3395 10.25L16.3354 8.70873C16.3483 8.68649 16.4185 8.56233 16.5012 8.35763C15.4014 7.52934 14.8062 6.27032 14.8062 4.73205C14.8062 3.15783 15.4159 1.88632 16.5693 1.05498C17.5269 0.364812 18.8526 0 20.4031 0C21.9537 0 23.2794 0.364812 24.2369 1.05498C25.3903 1.88632 26 3.15788 26 4.7321ZM23.9648 4.7321C23.9648 3.81179 23.664 3.14768 23.0454 2.70177C22.4368 2.26307 21.5231 2.03125 20.4031 2.03125C19.2831 2.03125 18.3694 2.26307 17.7609 2.70171C17.1422 3.14762 16.8415 3.81174 16.8415 4.73205C16.8415 5.821 17.2703 6.56134 18.1522 6.99532L18.705 7.2673L18.7209 7.24882L19.2873 7.3448C19.6457 7.40548 20.0271 7.46479 20.4031 7.46479C22.028 7.46484 23.9648 6.99075 23.9648 4.7321Z" fill="#7D859A"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -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,

@ -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(

@ -269,9 +269,10 @@
"requiredField" : "الحقل مطلوب",
"passwordLengthMessage" : "يجب أن تتكون كلمة السر من 6 خانات على الأقل",
"overview" : "نظرة عامة",
"myRequests" : "طلباتي",
"myAssets" : "ممتلكاتي",
"contactUs": "اتصل بنا",
"request" : "طلب",
"assets" : "الأصول",
"contact": "اتصال",
"feedBack": "تعليقات",
"welcome" : "مرحبا،",
"openWhatsapp" : "الإنتقال الى الواتس اب",
"callUs" : "إتصل بنا",

@ -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",

@ -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);

@ -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)),

@ -17,10 +17,8 @@ class AppBottomNavigationBar extends StatelessWidget {
@override
Widget build(BuildContext context) {
bool isEngineer = (Provider.of<UserProvider>(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,
return Container(
// height: 86.toScreenHeight,
decoration: BoxDecoration(
color: AppColor.background(context),
boxShadow: [boxShadowR14],
@ -28,31 +26,35 @@ class AppBottomNavigationBar extends StatelessWidget {
child: BottomNavigationBar(
items: <BottomNavigationBarItem>[
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),
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.tinyFont,
unselectedLabelStyle: AppTextStyles.tinyFont,
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 : '',
);
}
}

@ -107,7 +107,7 @@ class _MonthlyFragmentState extends State<MonthlyFragment> {
children: [
const CircleAvatar(backgroundColor: AppColor.primary40, radius: 8),
8.width,
context.translation.myRequests.heading6(context),
context.translation.request.heading6(context),
],
),
16.height,

@ -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),
),
),

@ -107,8 +107,8 @@ class _LandPageState extends State<LandPage> {
})),
// 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<LandPage> {
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,

@ -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(

@ -77,7 +77,9 @@ class _RequestsListPageState extends State<RequestsListPage> {
},
);
} else {
WidgetsBinding.instance.addPostFrameCallback((_) {
snapshot.requestDetailList = snapshot.selectedRequestCategory;
});
return RequestPaginatedList(snapshot.selectedRequestCategory.requestsDetails ?? [], snapshot.isRequestCategoryLoading, snapshot.selectedRequestCategory.total.count, _scrollController);
}
bool isLoading = widget.index == 0

@ -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';

@ -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<FormState> _formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Consumer<ServiceRequestsProvider>(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,
),
),
],
)
],
),
)
],
);
});
}
}

@ -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<Map<String, String>> 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<ServiceRequestsProvider>(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
}
}

@ -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<FormState> _formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
final userProvider = Provider.of<UserProvider>(context, listen: false);
return Consumer<ServiceRequestsProvider>(
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<SettingProvider>(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<Lookup, LoanAvailabilityProvider>(
// 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<ServiceRequestsProvider>(
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,
],
),
),
),
)
],
);
}
);
}
}

@ -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<FormState> _formKey = GlobalKey<FormState>();
Asset asset;
@override
Widget build(BuildContext context) {
final userProvider = Provider.of<UserProvider>(context, listen: false);
return Consumer<ServiceRequestsProvider>(
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<Lookup, FirstActionStatusProvider>(
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<SettingProvider>(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<Lookup, LoanAvailabilityProvider>(
// 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<ServiceRequestsProvider>(
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,
],
),
),
),
)
],
);
}
);
}
}

@ -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,32 +380,24 @@ class ServiceRequestBottomSheet {
isScrollControlled: true,
backgroundColor: Colors.transparent,
builder: (context) => Consumer<ServiceRequestsProvider>(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(
return Form(
key: _formKey,
child: SingleChildScrollView(
child: Column(
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: context.translation.setVisitDate.heading5(context).custom(fontWeight: FontWeight.w500).paddingOnly(top: 16, bottom: 16),
child: context.translation.setVisitDate.bottomSheetHeadingTextStyle(context),
),
8.height,
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) {
@ -569,6 +501,8 @@ class ServiceRequestBottomSheet {
8.height,
AppTextFormField(
labelText: context.translation.comments,
backgroundColor: AppColor.neutral100,
showShadow: false,
textInputType: TextInputType.multiline,
alignLabelWithHint: true,
onChange: (text) {
@ -578,11 +512,12 @@ class ServiceRequestBottomSheet {
serviceRequestProvider.currentSelectedRequest.comments = text;
},
),
16.height,
Consumer<ServiceRequestsProvider>(
builder: (context, snapshot, _) => AppFilledButton(
12.height,
AppFilledButton(
label: context.translation.save,
loading: snapshot.isLoading ?? false,
buttonColor: AppColor.primary10,
loading: serviceRequestProvider.isLoading ?? false,
onPressed: () async {
_formKey.currentState.save();
@ -591,49 +526,37 @@ class ServiceRequestBottomSheet {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => VerifyArrivalView()));
},
),
),
16.height,
],
),
),
),
);
).bottomSheetContainer(context);
}));
}
static Future rejectRequestBottomSheet({@required BuildContext context}) {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final userProvider = Provider.of<UserProvider>(context, listen: false);
return showModalBottomSheet(
context: context,
useSafeArea: true,
isScrollControlled: true,
backgroundColor: Colors.transparent,
builder: (context) => Consumer<ServiceRequestsProvider>(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(
return Form(
key: _formKey,
child: SingleChildScrollView(
child: Column(
children: [
Container(
width: 40.toScreenWidth,
height: 5.toScreenHeight,
decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)),
),
const SizedBox().indicatorWidget(),
Align(
alignment: AlignmentDirectional.centerStart,
child: context.translation.rejectionReason.heading3(context).custom(fontWeight: FontWeight.w600).paddingOnly(top: 16, bottom: 16),
child: context.translation.rejectionReason.heading4(context).paddingOnly(top: 21),
),
15.height,
SingleItemDropDownMenu<Lookup, FirstActionStatusProvider>(
context: context,
backgroundColor: AppColor.neutral100,
height: 70.toScreenHeight,
title: context.translation.rejectionReason,
initialValue: serviceRequestProvider.currentSelectedRequest.firstAction, //_serviceRequest.firstAction,
onSelect: (value) {
@ -643,8 +566,9 @@ class ServiceRequestBottomSheet {
}
},
),
8.height,
12.height,
AppTextFormField(
backgroundColor: AppColor.neutral100,
labelText: context.translation.comments,
textInputType: TextInputType.multiline,
alignLabelWithHint: true,
@ -661,13 +585,14 @@ class ServiceRequestBottomSheet {
label: context.translation.reject,
maxWidth: true,
buttonColor: Colors.white54,
textColor: AppColor.red50,
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);
// await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.currentSelectedRequest);
Navigator.pop(context, true);
},
),
@ -676,8 +601,7 @@ class ServiceRequestBottomSheet {
],
),
),
),
);
).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(
return Card(
color: AppColor.neutral80,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15),
borderRadius: BorderRadius.circular(14),
// Circular border radius
),
// color: Colors.white,
child: ListTile(
minVerticalPadding: 8,
horizontalTitleGap: 10,
minVerticalPadding:12.toScreenWidth,
horizontalTitleGap: 2.toScreenHeight,
onTap: onTap,
contentPadding: const EdgeInsets.all(8),
leading: SvgPicture.asset(icon),
title: Text(
heading,
style: AppTextStyles.heading5,
style: AppTextStyles.heading6,
),
subtitle: Text(
subHeading,
style: AppTextStyles.bodyText,
),
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<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
return Container(
@ -762,13 +682,16 @@ 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(
mainAxisSize: MainAxisSize.min,
children: [
const SizedBox().indicatorWidget(),
8.height,
Align(
alignment: AlignmentDirectional.centerStart,
child: context.translation.selectActivityType.heading4(context).paddingOnly(top: 16, bottom: 16),
child: context.translation.selectActivityType.bottomSheetHeadingTextStyle(context),
),
16.height,
ListView.builder(
shrinkWrap: true,
padding: EdgeInsets.zero,
@ -787,14 +710,11 @@ class ServiceRequestBottomSheet {
),
],
),
),
);
}));
}
static Future actionBottomSheet({@required BuildContext context, @required String title, String button1Text, String button2Text, VoidCallback button1Tap, VoidCallback button2Tap}) {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final userProvider = Provider.of<UserProvider>(context, listen: false);
return showModalBottomSheet(
context: context,
useSafeArea: true,
@ -808,28 +728,24 @@ 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(
AppFilledButton(
label: button1Text ?? context.translation.no,
loading: false,
buttonColor: AppColor.neutral40,
buttonColor: AppColor.white60,
textColor: AppColor.black10,
onPressed: button1Tap ??
() async {
@ -837,17 +753,14 @@ class ServiceRequestBottomSheet {
// await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest);
// Navigator.pop(context, true);
},
),
),
SizedBox(
width: 200.toScreenHeight,
child: AppFilledButton(
).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<FormState> _formKey = GlobalKey<FormState>();
return showModalBottomSheet(
context: context,
useSafeArea: true,
isScrollControlled: true,
backgroundColor: Colors.transparent,
builder: (context) => Consumer<ServiceRequestsProvider>(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: () {},
),
],
);
}),
),
),
);
}));
}
}

@ -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<RequestDetailView> {
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<RequestDetailView> {
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<RequestDetailView> {
).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,

@ -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';

@ -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<SparePartRequest> with TickerProviderStateMixin {
UserProvider _userProvider;
SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider;
ServiceStatusProvider _assetTypeProvider;
PartsProvider _partsProvider;
ServiceReport _serviceReport;
bool _isLoading = false;
List<SparePart> _spareParts = [];
final List<File> _files = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
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<ServiceRequestsProvider>(context, listen: false);
Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(context, listen: false).reset();
Provider.of<ReasonProvider>(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<ServiceRequestsProvider>(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<UserProvider>(context);
_settingProvider = Provider.of<SettingProvider>(context);
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
_assetTypeProvider = Provider.of<ServiceStatusProvider>(context);
_partsProvider = Provider.of<PartsProvider>(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<ServiceRequestsProvider>(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<SparePart, NullableLoadingProvider>(
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<UserProvider>(context, listen: false).user;
// await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: serviceRequestProvider.serviceRequest, user: user);
},
),
],
).paddingAll(16),
),
),
);
}),
);
}
}

@ -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<String> 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);
}
}
Loading…
Cancel
Save