Merge remote-tracking branch 'origin/main_design2.0' into main_design2.0

# Conflicts:
#	lib/l10n/app_en.arb
design_3.0_demo_module
zaid_daoud 2 years ago
commit 4cf650702f

@ -94,6 +94,7 @@ class URLs {
static get requestGasRefill => "$_baseUrl/GazRefill/AddGazRefill"; // get static get requestGasRefill => "$_baseUrl/GazRefill/AddGazRefill"; // get
static get updateGasRefill => "$_baseUrl/GazRefill/UpdateGazRefill"; // get static get updateGasRefill => "$_baseUrl/GazRefill/UpdateGazRefill"; // get
static get getGasRefill => "$_baseUrl/GazRefill/GetGazRefills"; // get static get getGasRefill => "$_baseUrl/GazRefill/GetGazRefills"; // get
static get getGasRefillById => "$_baseUrl/GazRefill/GetGazRefillById"; // get
//device transfer //device transfer
static get requestDeviceTransfer => "$_baseUrl/AssetTransfer/AddAssetTransfer"; // get static get requestDeviceTransfer => "$_baseUrl/AssetTransfer/AddAssetTransfer"; // get

@ -45,6 +45,19 @@ class GasRefillProvider extends ChangeNotifier {
// failed _loading = false // failed _loading = false
bool isLoading; bool isLoading;
Future<GasRefillModel> getGasRefillObjectById(num id) async {
try {
Response response = await ApiManager.instance.get(URLs.getGasRefillById + "?gazRefillId=$id");
if (response.statusCode >= 200 && response.statusCode < 300) {
return GasRefillModel.fromJson(json.decode(response.body)["data"]);
} else {
return null;
}
} catch (error) {
return null;
}
}
/// return -2 if request in progress /// return -2 if request in progress
/// return -1 if error happen when sending request /// return -1 if error happen when sending request
/// return state code if request complete may be 200, 404 or 403 /// return state code if request complete may be 200, 404 or 403

@ -103,6 +103,31 @@ class RegularVisitsProvider extends ChangeNotifier {
return response.statusCode; return response.statusCode;
} }
Future<Visit> getVisitObjectById(num id) async {
try {
Map<String, dynamic> body = {};
body.addAll(visitsSearch.toMap());
body["pageNumber"] = 1;
body["pageSize"] = 3;
body["id"] = id;
Response response = await ApiManager.instance.post(
URLs.getRegularVisits,
body: body,
);
if (response.statusCode >= 200 && response.statusCode < 300) {
List requestsListJson = json.decode(response.body)["data"];
List<Visit> visits = requestsListJson.map((request) => Visit.fromJson(request)).toList();
return visits?.first;
} else {
return null;
}
} catch (error) {
return null;
}
}
/// return -2 if request in progress /// return -2 if request in progress
/// return -1 if error happen when sending request /// return -1 if error happen when sending request
/// return state code if request complete may be 200, 404 or 403 /// return state code if request complete may be 200, 404 or 403

@ -145,6 +145,7 @@ extension FilesExtension on String {
BoxFit fit = BoxFit.contain, BoxFit fit = BoxFit.contain,
}) => }) =>
Image.asset("assets/images/$this.png", width: width?.toScreenWidth, height: height?.toScreenHeight, color: color, fit: fit); Image.asset("assets/images/$this.png", width: width?.toScreenWidth, height: height?.toScreenHeight, color: color, fit: fit);
LottieBuilder toLottieAsset({ LottieBuilder toLottieAsset({
int width, int width,
int height, int height,

@ -48,9 +48,9 @@ extension WidgetExtensions on Widget {
).toShadowContainer(context) ).toShadowContainer(context)
: this; : this;
Widget toShadowContainer(BuildContext context, {bool showShadow = true}) => showShadow Widget toShadowContainer(BuildContext context, {bool showShadow = true, double padding = 16}) => showShadow
? Container( ? Container(
padding: const EdgeInsets.all(16), padding: EdgeInsets.all(padding),
decoration: ShapeDecoration( decoration: ShapeDecoration(
color: Theme.of(context).cardColor, color: Theme.of(context).cardColor,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(

@ -341,6 +341,7 @@
"nurseSignature" : "توقيع الممرض", "nurseSignature" : "توقيع الممرض",
"actualVisitDate": "تاريخ الزيارة الفعلي", "actualVisitDate": "تاريخ الزيارة الفعلي",
"ppmVisit": "موعد زيارة الصيانة الوقائية", "ppmVisit": "موعد زيارة الصيانة الوقائية",
"ppmRequest": "طلب الصيانة الوقائية",
"timer": "مؤقت", "timer": "مؤقت",
"deviceStatus" : "حالة الجهاز", "deviceStatus" : "حالة الجهاز",
"addAsset" : "اضافة جهاز", "addAsset" : "اضافة جهاز",

@ -341,6 +341,7 @@
"commentHere" : "Comment Here", "commentHere" : "Comment Here",
"nurseSignature" : "Nurse Signature", "nurseSignature" : "Nurse Signature",
"ppmVisit": "PPM Visit Status", "ppmVisit": "PPM Visit Status",
"ppmRequest": "PPMs Request",
"timer": "Timer", "timer": "Timer",
"deviceStatus" : "Device Status", "deviceStatus" : "Device Status",
"addAsset" : "Add Asset", "addAsset" : "Add Asset",
@ -350,17 +351,19 @@
"item" : "Item", "item" : "Item",
"measuredValue": "Measured Value", "measuredValue": "Measured Value",
"overdue": "Overdue", "overdue": "Overdue",
"sureExit" : "Are you sure ypu want to Exit? ", "sureExit" : "Are you sure ypu want to Exit? ",
"daily" : "Daily", "daily" : "Daily",
"weekly" : "Weekly", "weekly" : "Weekly",
"monthly" : "Monthly", "monthly" : "Monthly",
"myShift" : "My Shift", "myShift" : "My Shift",
"myTeamRequest" : "My Team Request", "myTeamRequest" : "My Team Request",
"sunToThurs": "Sunday to Thursday", "sunToThurs": "Sunday to Thursday",
"requestGasRefill" : "Request Gas Refill", "requestGasRefill" : "Request Gas Refill",
"trackGasRefill" : "Track Gas Refill", "trackGasRefill" : "Track Gas Refill",
"trackAssetTransfer" : "Track Asset Transfer", "trackAssetTransfer" : "Track Asset Transfer",
"total" : "Total", "deviceTransferRequest" : "Device Transfer Requests",
"allRequests" : "All Requests", "total" : "Total",
"requestStatus" : "Request Status" "noDataFound" : "No Data Found",
"allRequests" : "All Requests",
"requestStatus" : "Request Status"
} }

@ -14,11 +14,13 @@ class Comment {
createdBy = json['createdBy'] != null ? CreatedBy.fromJson(json['createdBy']) : null; createdBy = json['createdBy'] != null ? CreatedBy.fromJson(json['createdBy']) : null;
comment = json['comment']; comment = json['comment'];
} }
num id; num id;
num callRequestId; num callRequestId;
String createdOn; String createdOn;
CreatedBy createdBy; CreatedBy createdBy;
String comment; String comment;
Comment copyWith({ Comment copyWith({
num id, num id,
num callRequestId, num callRequestId,
@ -33,6 +35,7 @@ class Comment {
createdBy: createdBy ?? this.createdBy, createdBy: createdBy ?? this.createdBy,
comment: comment ?? this.comment, comment: comment ?? this.comment,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id; map['id'] = id;
@ -56,8 +59,10 @@ class CreatedBy {
userId = json['userId']; userId = json['userId'];
userName = json['userName']; userName = json['userName'];
} }
String userId; String userId;
String userName; String userName;
CreatedBy copyWith({ CreatedBy copyWith({
String userId, String userId,
String userName, String userName,
@ -66,6 +71,7 @@ class CreatedBy {
userId: userId ?? this.userId, userId: userId ?? this.userId,
userName: userName ?? this.userName, userName: userName ?? this.userName,
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['userId'] = userId; map['userId'] = userId;

@ -27,6 +27,7 @@ class AppTextFormField extends StatefulWidget {
final VoidCallback onAction; final VoidCallback onAction;
final Color backgroundColor; final Color backgroundColor;
final bool alignLabelWithHint; final bool alignLabelWithHint;
final bool showShadow;
const AppTextFormField( const AppTextFormField(
{Key key, {Key key,
@ -51,6 +52,7 @@ class AppTextFormField extends StatefulWidget {
this.textInputAction, this.textInputAction,
this.onAction, this.onAction,
this.backgroundColor, this.backgroundColor,
this.showShadow = true,
this.alignLabelWithHint}) this.alignLabelWithHint})
: super(key: key); : super(key: key);
@ -71,7 +73,7 @@ class _AppTextFormFieldState extends State<AppTextFormField> {
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], boxShadow: widget.showShadow ? [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)] : null,
), ),
child: TextFormField( child: TextFormField(
focusNode: widget.node, focusNode: widget.node,

@ -66,7 +66,7 @@ class _MonthlyFragmentState extends State<MonthlyFragment> {
}), }),
dowBuilder: (context, dateTime) { dowBuilder: (context, dateTime) {
final day = DateFormat("EE", context.isAr ? "ar" : "en").format(dateTime).toUpperCase(); final day = DateFormat("EE", context.isAr ? "ar" : "en").format(dateTime).toUpperCase();
return Align(alignment: Alignment.center, child: day.bodyText(context).custom(color: AppColor.neutral50)); return Align(alignment: Alignment.center, child: day.bodyText(context).custom(color: context.isDark? AppColor.neutral10 : AppColor.neutral50));
}, },
defaultBuilder: (context, dateTime, _) { defaultBuilder: (context, dateTime, _) {
final day = DateFormat("d").format(dateTime); final day = DateFormat("d").format(dateTime);

@ -71,7 +71,7 @@ class _WeeklyFragmentState extends State<WeeklyFragment> {
), ),
dowBuilder: (context, dateTime) { dowBuilder: (context, dateTime) {
final day = DateFormat("EE", context.isAr ? "ar" : "en").format(dateTime).toUpperCase(); final day = DateFormat("EE", context.isAr ? "ar" : "en").format(dateTime).toUpperCase();
return Align(alignment: Alignment.center, child: day.bodyText(context).custom(color: AppColor.neutral50)); return Align(alignment: Alignment.center, child: day.bodyText(context).custom(color: context.isDark? AppColor.neutral10: AppColor.neutral50));
}, },
defaultBuilder: (context, dateTime, _) { defaultBuilder: (context, dateTime, _) {
final day = DateFormat("d").format(dateTime); final day = DateFormat("d").format(dateTime);

@ -64,7 +64,7 @@ class ProgressFragment extends StatelessWidget {
unselectedLabelStyle: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575)), unselectedLabelStyle: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575)),
labelStyle: AppTextStyles.bodyText.copyWith(color: AppColor.neutral60), labelStyle: AppTextStyles.bodyText.copyWith(color: AppColor.neutral60),
indicatorPadding: const EdgeInsets.all(4), indicatorPadding: const EdgeInsets.all(4),
indicator: BoxDecoration(color: Theme.of(context).cardColor, borderRadius: BorderRadius.circular(13)), indicator: BoxDecoration(color: context.isDark? AppColor.neutral20:Theme.of(context).cardColor, borderRadius: BorderRadius.circular(13)),
onTap: (index) { onTap: (index) {
// setState(() {}); // setState(() {});
}, },

@ -6,6 +6,7 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/search_all_requests_model.dart'; import 'package:test_sa/models/search_all_requests_model.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/pages/land_page/my_request/all_requests_filter_page.dart'; import 'package:test_sa/new_views/pages/land_page/my_request/all_requests_filter_page.dart';
import 'package:test_sa/new_views/pages/land_page/my_request/all_requests_search_page.dart'; import 'package:test_sa/new_views/pages/land_page/my_request/all_requests_search_page.dart';
import 'package:test_sa/new_views/pages/land_page/widgets/request_item_view_list.dart'; import 'package:test_sa/new_views/pages/land_page/widgets/request_item_view_list.dart';
@ -21,9 +22,20 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
AllRequestsProvider _provider; AllRequestsProvider _provider;
SearchAllRequestsModel _search; SearchAllRequestsModel _search;
List<String> requestsList;
int selectedRequest;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (_provider == null) { if (_provider == null) {
requestsList = [
context.translation.allRequests,
context.translation.serviceRequest,
context.translation.gasRefillRequest,
context.translation.deviceTransferRequest,
context.translation.preventiveMaintenance,
];
selectedRequest = 0;
_provider = Provider.of<AllRequestsProvider>(context, listen: false); _provider = Provider.of<AllRequestsProvider>(context, listen: false);
_provider.getAllRequests(context); _provider.getAllRequests(context);
} }
@ -40,8 +52,10 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
padding: const EdgeInsets.only(left: 16, right: 8), padding: const EdgeInsets.only(left: 16, right: 8),
alignment: Alignment.center, alignment: Alignment.center,
decoration: ShapeDecoration( decoration: ShapeDecoration(
color: const Color(0xFFEAF1F4), color: context.isDark ? Color(0xFF3B3D4A) : Color(0xFFEAF1F4),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
), ),
child: Row( child: Row(
children: [ children: [
@ -74,8 +88,47 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
], ],
).paddingOnly(start: 16, end: 16), ).paddingOnly(start: 16, end: 16),
), ),
body: Consumer<AllRequestsProvider>(builder: (context, snapshot, _) { body: Column(
return RequestItemViewList(snapshot.allRequestsAndCount?.requestsDetails ?? [], snapshot.isAllLoading); children: [
})); SizedBox(
height: 34 + 16.0,
child: ListView.separated(
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.only(top: 16, right: 16, left: 16),
itemBuilder: (cxt, index) => Container(
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(horizontal: 8),
decoration: ShapeDecoration(
color: selectedRequest == index ? const Color(0xFFEAF1F4) : Colors.white,
shape: RoundedRectangleBorder(
side: BorderSide(width: 1, color: selectedRequest == index ? Color(0xFF4A8DB7) : Colors.white),
borderRadius: BorderRadius.circular(7),
),
shadows: const [
BoxShadow(
color: Color(0x07000000),
blurRadius: 14,
offset: Offset(0, 0),
spreadRadius: 0,
)
],
),
child: Text(requestsList[index], style: AppTextStyles.bodyText2.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, height: 1)),
).onPress(() {
if (selectedRequest != index) {
setState(() {
selectedRequest = index;
});
_provider.getAllRequests(typeTransaction: selectedRequest == 0 ? null : selectedRequest);
}
}),
separatorBuilder: (cxt, index) => 8.width,
itemCount: requestsList.length),
),
Consumer<AllRequestsProvider>(builder: (context, snapshot, _) {
return RequestItemViewList(snapshot.allRequestsAndCount?.requestsDetails ?? [], snapshot.isAllLoading);
}).expanded,
],
));
} }
} }

@ -5,10 +5,14 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/models/new_models/gas_refill_model.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/pages/user/gas_refill/gas_refill_details.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart';
import '../../../app_style/app_color.dart';
class GasRefillItemView extends StatelessWidget { class GasRefillItemView extends StatelessWidget {
final RequestsDetails request; final RequestsDetails request;
final bool showShadow; final bool showShadow;
@ -31,19 +35,13 @@ class GasRefillItemView extends StatelessWidget {
8.width, 8.width,
StatusLabel(label: request.status, textColor: AColors.getRequestStatusTextColorByName(request.status), backgroundColor: AColors.getRequestStatusColorByName(request.status)), StatusLabel(label: request.status, textColor: AColors.getRequestStatusTextColorByName(request.status), backgroundColor: AColors.getRequestStatusColorByName(request.status)),
1.width.expanded, 1.width.expanded,
Text(request.date?.toServiceRequestCardFormat ?? "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: const Color(0xFF3B3D4A))), Text(request.date?.toServiceRequestCardFormat ?? "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark?AppColor.neutral10: Color(0xFF3B3D4A))),
], ],
), ),
8.height, 8.height,
Text(context.translation.gasRefillRequest, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))), context.translation.gasRefillRequest.heading5(context),
Text( '${context.translation.gasType}: ${request.gasType}'.bodyText(context),
'${context.translation.gasType}: ${request.gasType}', '${context.translation.site}: ${request.site}'.bodyText(context),
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
Text(
'${context.translation.site}: ${request.site}',
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
8.height, 8.height,
Row( Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@ -61,6 +59,11 @@ class GasRefillItemView extends StatelessWidget {
], ],
), ),
], ],
).toShadowContainer(context, showShadow: showShadow).onPress(() {}); ).toShadowContainer(context, showShadow: showShadow).onPress(() {
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => GasRefillDetailsPage(
model: GasRefillModel(id: request.id),
)));
});
} }
} }

@ -12,6 +12,8 @@ import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/pages/user/visits/visit_details.dart'; import 'package:test_sa/views/pages/user/visits/visit_details.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart';
import '../../../app_style/app_color.dart';
class PpmItemView extends StatelessWidget { class PpmItemView extends StatelessWidget {
final RequestsDetails request; final RequestsDetails request;
final bool showShadow; final bool showShadow;
@ -34,24 +36,15 @@ class PpmItemView extends StatelessWidget {
backgroundColor: AColors.getRequestStatusColorByName(request.status), backgroundColor: AColors.getRequestStatusColorByName(request.status),
), ),
1.width.expanded, 1.width.expanded,
Text(request.date?.toServiceRequestCardFormat ?? "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: const Color(0xFF3B3D4A))), Text(request.date?.toServiceRequestCardFormat ?? "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark?AppColor.neutral10: Color(0xFF3B3D4A))),
], ],
), ),
8.height, 8.height,
Text("PPMs Request", style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))), context.translation.ppmRequest.heading5(context),
8.height, 8.height,
Text( '${context.translation.assetNumber}: ${request.assetName}'.bodyText(context),
'${context.translation.assetNumber}: ${request.assetName}', '${context.translation.assetSN}: ${request.assetNo}'.bodyText(context),
style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575)), '${context.translation.code}: ${request.code}'.bodyText(context),
),
Text(
'${context.translation.assetSN}: ${request.assetNo}',
style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575)),
),
Text(
'${context.translation.code}: ${request.code}',
style: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575)),
),
16.height, 16.height,
Row( Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@ -65,6 +58,8 @@ class PpmItemView extends StatelessWidget {
], ],
), ),
], ],
).toShadowContainer(context, showShadow: showShadow).onPress(() {}); ).toShadowContainer(context, showShadow: showShadow).onPress(() {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => VisitDetailsPage(visit: Visit(id: request.id))));
});
} }
} }

@ -5,7 +5,10 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/models/all_requests_and_count_model.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/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/pages/user/requests/service_request_details.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart';
class ServiceRequestItemView extends StatelessWidget { class ServiceRequestItemView extends StatelessWidget {
@ -27,27 +30,15 @@ class ServiceRequestItemView extends StatelessWidget {
8.width, 8.width,
StatusLabel(label: request.status, textColor: AColors.getRequestStatusTextColorByName(request.status), backgroundColor: AColors.getRequestStatusColorByName(request.status)), StatusLabel(label: request.status, textColor: AColors.getRequestStatusTextColorByName(request.status), backgroundColor: AColors.getRequestStatusColorByName(request.status)),
1.width.expanded, 1.width.expanded,
Text(request.date.toServiceRequestCardFormat, textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: const Color(0xFF3B3D4A))), Text(request.date.toServiceRequestCardFormat, textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark?AppColor.neutral10: Color(0xFF3B3D4A))),
], ],
), ),
8.height, 8.height,
Text(context.translation.serviceRequest, style: AppTextStyles.heading5.copyWith(color: const Color(0xFF3B3D4A))), context.translation.serviceRequest.heading5(context),
Text( '${context.translation.assetName}: ${request.assetName}'.bodyText(context),
'${context.translation.assetName}: ${request.assetName}', '${context.translation.assetNumber}: ${request.assetNo}'.bodyText(context),
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)), '${context.translation.requestType}: ${request.requestType}'.bodyText(context),
), '${context.translation.requestNo}: ${request.requestNo}'.bodyText(context),
Text(
'${context.translation.assetNumber}: ${request.assetNo}',
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
Text(
'${context.translation.requestType}: ${request.requestType}',
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
Text(
'${context.translation.requestNo}: ${request.requestNo}',
style: AppTextStyles.bodyText.copyWith(color: Color(0xFF757575)),
),
8.height, 8.height,
Row( Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@ -65,6 +56,11 @@ class ServiceRequestItemView extends StatelessWidget {
], ],
), ),
], ],
).toShadowContainer(context, showShadow: showShadow).onPress(() {}); ).toShadowContainer(context, showShadow: showShadow).onPress(() {
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => ServiceRequestDetailsPage(
serviceRequest: ServiceRequest(id: request.id.toString()),
)));
});
} }
} }

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart';
@ -6,6 +7,7 @@ import 'package:test_sa/new_views/pages/land_page/requests/asset_item_view.dart'
import 'package:test_sa/new_views/pages/land_page/requests/gas_refill_item_view.dart'; import 'package:test_sa/new_views/pages/land_page/requests/gas_refill_item_view.dart';
import 'package:test_sa/new_views/pages/land_page/requests/ppm_item_view.dart'; import 'package:test_sa/new_views/pages/land_page/requests/ppm_item_view.dart';
import 'package:test_sa/new_views/pages/land_page/requests/service_request_item_view.dart'; import 'package:test_sa/new_views/pages/land_page/requests/service_request_item_view.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
class RequestItemViewList extends StatelessWidget { class RequestItemViewList extends StatelessWidget {
List<RequestsDetails> list; List<RequestsDetails> list;
@ -15,30 +17,32 @@ class RequestItemViewList extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ListView.separated( return (list.isEmpty && !isLoading)
padding: const EdgeInsets.all(16), ? NoItemFound(message: context.translation.noDataFound)
itemBuilder: (cxt, index) { : ListView.separated(
if (isLoading) return SizedBox().toRequestShimmer(cxt, isLoading); padding: const EdgeInsets.all(16),
bool isServiceRequest = list[index].nameOfType == "ServiceRequest"; itemBuilder: (cxt, index) {
bool isGasRefill = list[index].nameOfType == "GasRefill"; if (isLoading) return SizedBox().toRequestShimmer(cxt, isLoading);
bool isAssetTransfer = list[index].nameOfType == "AssetTransfer"; bool isServiceRequest = list[index].nameOfType == "ServiceRequest";
bool isPPMs = list[index].nameOfType == "PPMs"; bool isGasRefill = list[index].nameOfType == "GasRefill";
bool isAssetTransfer = list[index].nameOfType == "AssetTransfer";
bool isPPMs = list[index].nameOfType == "PPMs";
return isServiceRequest return isServiceRequest
? ServiceRequestItemView(list[index]) ? ServiceRequestItemView(list[index])
: isGasRefill : isGasRefill
? GasRefillItemView(list[index]) ? GasRefillItemView(list[index])
: isPPMs : isPPMs
? PpmItemView(list[index]) ? PpmItemView(list[index])
: isAssetTransfer : isAssetTransfer
? AssetItemView(list[index]) ? AssetItemView(list[index])
: Container( : Container(
height: 100, height: 100,
width: double.infinity, width: double.infinity,
color: Colors.grey, color: Colors.grey,
); );
}, },
separatorBuilder: (cxt, index) => 8.height, separatorBuilder: (cxt, index) => 8.height,
itemCount: isLoading ? 6 : list.length); itemCount: isLoading ? 6 : list.length);
} }
} }

@ -30,35 +30,31 @@ class DeviceTransferDetails extends StatefulWidget {
} }
class _DeviceTransferDetailsState extends State<DeviceTransferDetails> { class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
AssetTransfer _model;
UserProvider _userProvider; UserProvider _userProvider;
AssetTransfer _model;
bool _isLoading = false; bool _isLoading = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override @override
void initState() { void initState() {
_model = widget.model;
super.initState(); super.initState();
} }
Future<void> _getDeviceTransfer() async {
_model = await Provider.of<AssetTransferProvider>(context).getRequestById(assetTransferId: widget.model.id);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider ??= Provider.of<UserProvider>(context);
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.deviceTransferDetails), appBar: DefaultAppBar(title: context.translation.deviceTransferDetails),
key: _scaffoldKey, key: _scaffoldKey,
body: SafeArea( body: SafeArea(
child: FutureBuilder( child: FutureBuilder(
future: _getDeviceTransfer(), future: Provider.of<AssetTransferProvider>(context).getRequestById(assetTransferId: widget.model.id),
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) { if (snapshot.connectionState == ConnectionState.waiting) {
return const ALoading(); return const ALoading();
} else { } else {
_userProvider = Provider.of<UserProvider>(context); _model = snapshot.data;
return Form( return Form(
key: _formKey, key: _formKey,
child: LoadingManager( child: LoadingManager(
@ -108,8 +104,8 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
// ], // ],
// ), // ),
1.width, 1.width,
Text(widget.model.createdOn != null ? widget.model.createdOn.toServiceRequestCardFormat : "", Text(_model.createdOn != null ? _model.createdOn.toServiceRequestCardFormat : "",
textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color:context.isDark? AppColor.neutral10: Color(0xFF3B3D4A))), textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF3B3D4A))),
], ],
), ),
], ],

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart';
import 'package:test_sa/controllers/providers/api/user_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/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
@ -8,7 +9,9 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart';
import '../../../../extensions/text_extensions.dart'; import '../../../../extensions/text_extensions.dart';
@ -37,35 +40,44 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
@override @override
void initState() { void initState() {
_model.fromGasRefillModel(widget.model); // _model.fromGasRefillModel(gasRefillModel);
super.initState(); super.initState();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
GasRefillProvider _gasRefillProvider = Provider.of<GasRefillProvider>(context);
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.gasRefillDetails), appBar: DefaultAppBar(title: context.translation.gasRefillDetails),
key: _scaffoldKey, key: _scaffoldKey,
body: SafeArea( body: SafeArea(
child: Form( child: FutureBuilder(
key: _formKey, future: _gasRefillProvider.getGasRefillObjectById(widget.model.id),
child: LoadingManager( builder: (context, snap) {
isLoading: _isLoading, if (snap.connectionState == ConnectionState.waiting) {
isFailedLoading: false, return const ALoading();
stateCode: 200, } else if (!snap.hasData) {
onRefresh: () async {}, _model = snap.data;
child: Column( return Column(
children: [informationCard()], crossAxisAlignment: CrossAxisAlignment.start,
), children: [
), SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: informationCard(_model),
).expanded,
],
);
}
return NoItemFound(message: context.translation.noDataFound);
},
), ),
), ),
); );
} }
Widget informationCard() { Widget informationCard(GasRefillModel gasRefillModel) {
return Column( return Column(
children: [ children: [
Column( Column(
@ -87,24 +99,24 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
//), //),
// 8.width, // 8.width,
StatusLabel( StatusLabel(
label: widget.model.status?.name ?? "", label: gasRefillModel.status?.name ?? "",
textColor: AColors.getRequestStatusTextColor(widget.model.status?.value ?? 0), textColor: AColors.getRequestStatusTextColor(gasRefillModel.status?.value ?? 0),
backgroundColor: AColors.getRequestStatusColor(widget.model.status?.value ?? 0)), backgroundColor: AColors.getRequestStatusColor(gasRefillModel.status?.value ?? 0)),
8.height, 8.height,
context.translation.gasRefillRequest.heading5(context), context.translation.gasRefillRequest.heading5(context),
8.height, 8.height,
///TBD ///TBD
context.translation.gasRequest.bodyText(context), context.translation.gasRequest.bodyText(context),
'${context.translation.cylinderSize}: ${widget.model.gazRefillDetails[0].cylinderSize.value}'.bodyText(context), '${context.translation.cylinderSize}: ${gasRefillModel.gazRefillDetails[0].cylinderSize.value}'.bodyText(context),
'${context.translation.site}: ${widget.model.site.name}'.bodyText(context), '${context.translation.site}: ${gasRefillModel.site.name}'.bodyText(context),
], ],
), ),
1.width.expanded, 1.width.expanded,
Column( Column(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
if (_userProvider.user.type == UsersTypes.engineer && (widget.model.status?.value ?? 0) != 2) if (_userProvider.user.type == UsersTypes.engineer && (gasRefillModel.status?.value ?? 0) != 2)
CircleAvatar( CircleAvatar(
radius: 25, radius: 25,
backgroundColor: AppColor.neutral30, backgroundColor: AppColor.neutral30,
@ -118,13 +130,13 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
), ),
).onPress( ).onPress(
() async { () async {
_model?.fromGasRefillModel(widget.model); _model?.fromGasRefillModel(gasRefillModel);
// setState(() {}); // setState(() {});
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: (context) => RequestGasRefill( builder: (context) => RequestGasRefill(
gasRefillModel: widget.model, gasRefillModel: gasRefillModel,
), ),
), ),
).then((value) { ).then((value) {
@ -135,7 +147,7 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
setState(() {}); setState(() {});
}, },
), ),
Text(widget.model.startDate?.toServiceRequestCardFormat ?? "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: const Color(0xFF3B3D4A))), Text(gasRefillModel.startDate?.toServiceRequestCardFormat ?? "", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: const Color(0xFF3B3D4A))),
], ],
) )
], ],
@ -143,8 +155,8 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
8.height, 8.height,
const Divider(color: Color(0xFFEAF1F4), height: 1, thickness: 1), const Divider(color: Color(0xFFEAF1F4), height: 1, thickness: 1),
8.height, 8.height,
'${context.translation.requestedQuantity}: ${widget.model.gazRefillDetails[0].requestedQty}'.bodyText(context), '${context.translation.requestedQuantity}: ${gasRefillModel.gazRefillDetails[0].requestedQty}'.bodyText(context),
'${context.translation.deliveredQuantity}: ${widget.model.gazRefillDetails[0].deliverdQty}'.bodyText(context), '${context.translation.deliveredQuantity}: ${gasRefillModel.gazRefillDetails[0].deliverdQty}'.bodyText(context),
8.height, 8.height,
], ],
).paddingAll(16), ).paddingAll(16),
@ -173,7 +185,7 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
color: AppColor.neutral50.withOpacity(.6), color: AppColor.neutral50.withOpacity(.6),
), ),
).expanded, ).expanded,
SvgPicture.asset("assets/images/comment_send.svg", width: 24 * AppStyle.getScaleFactor(context), height: 24 * AppStyle.getScaleFactor(context), color: AppColor.primary70), SvgPicture.asset("assets/images/comment_send.svg", width: 24 * AppStyle.getScaleFactor(context), height: 20 * AppStyle.getScaleFactor(context), color: AppColor.primary70),
], ],
), ),
) )
@ -202,6 +214,6 @@ class _GasRefillDetailsPageState extends State<GasRefillDetailsPage> {
).paddingOnly(bottom: 16, start: 16, end: 16)) ).paddingOnly(bottom: 16, start: 16, end: 16))
.onPress(() {}), .onPress(() {}),
], ],
).toShadowContainer(context).paddingAll(16); ).toShadowContainer(context, padding: 0);
} }
} }

@ -19,6 +19,7 @@ import '../../../widgets/loaders/loading_manager.dart';
class CommentsBottomSheet extends StatefulWidget { class CommentsBottomSheet extends StatefulWidget {
final String requestId; final String requestId;
const CommentsBottomSheet({Key key, @required this.requestId}) : super(key: key); const CommentsBottomSheet({Key key, @required this.requestId}) : super(key: key);
@override @override
@ -58,50 +59,53 @@ class _CommentsBottomSheetState extends State<CommentsBottomSheet> {
await commentsProvider.getComments(callId: widget.requestId); await commentsProvider.getComments(callId: widget.requestId);
}, },
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Container( Container(
width: 40.toScreenWidth, width: 40.toScreenWidth,
height: 5.toScreenHeight, height: 5.toScreenHeight,
decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)), decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)),
), ),
16.height,
Align( Align(
alignment: AlignmentDirectional.centerStart, alignment: AlignmentDirectional.centerStart,
child: context.translation.comments.heading3(context).custom(fontWeight: FontWeight.w600).paddingOnly(top: 16, bottom: 16), child: context.translation.comments.heading3(context).custom(fontWeight: FontWeight.w600),
), ),
commentsProvider.comments.isEmpty commentsProvider.comments.isEmpty
? NoItemFound(message: context.translation.noServiceRequestFound).expanded ? NoItemFound(message: context.translation.noDataFound).expanded
: LazyLoading( : LazyLoading(
nextPage: commentsProvider.nextPage, nextPage: commentsProvider.nextPage,
onLazyLoad: () async => await commentsProvider.getComments(callId: widget.requestId), onLazyLoad: () async => await commentsProvider.getComments(callId: widget.requestId),
child: ListView.separated( child: ListView.separated(
itemCount: commentsProvider.comments.length, itemCount: commentsProvider.comments.length,
padding: const EdgeInsets.only(top: 16, bottom: 8),
separatorBuilder: (cxt, index) => 8.height, separatorBuilder: (cxt, index) => 8.height,
itemBuilder: (context, itemIndex) { itemBuilder: (context, itemIndex) {
final model = commentsProvider.comments[itemIndex]; final model = commentsProvider.comments[itemIndex];
return Card( return Column(
child: Column( crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.stretch, children: [
children: [ (model?.createdBy?.userName ?? "Nurse").heading6(context),
(model?.createdBy?.userName ?? "Nurse").heading6(context), 8.height,
8.height, (model?.comment ?? "").bodyText(context),
(model?.comment ?? "").bodyText(context), 8.height,
8.height, Align(
Align( alignment: AlignmentDirectional.bottomEnd,
alignment: AlignmentDirectional.bottomEnd, child: Text(DateTime.tryParse(model.createdOn).toIso8601String().toServiceRequestDetailsFormat,
child: DateTime.tryParse(model.createdOn).toIso8601String().toServiceRequestDetailsFormat.tinyFont(context), style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)),
), ),
], ],
).paddingAll(16), ).toShadowContainer(context);
);
}, },
), ),
).expanded, ).expanded,
if (userProvider.user.type == UsersTypes.normal_user) 16.height, if (userProvider.user.type == UsersTypes.normal_user) 8.height,
if (userProvider.user.type == UsersTypes.normal_user) if (userProvider.user.type == UsersTypes.normal_user)
AppTextFormField( AppTextFormField(
labelText: "Type any comment", labelText: "Type any comment",
backgroundColor: AppColor.neutral30, backgroundColor: AppColor.neutral30,
alignLabelWithHint: true, alignLabelWithHint: true,
showShadow: false,
validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredField, validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredField,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
suffixIcon: "comment_send".toSvgAsset().paddingOnly(end: 16).onPress(() { suffixIcon: "comment_send".toSvgAsset().paddingOnly(end: 16).onPress(() {

@ -49,7 +49,7 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
ServiceRequestsProvider _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context); ServiceRequestsProvider _serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
// _serviceRequestsProvider.getServiceRequestObjectById(requestId: serviceRequest.id); // _serviceRequestsProvider.getServiceRequestObjectById(requestId: serviceRequest.id);
Widget informationCard() { Widget informationCard(ServiceRequest serviceRequest) {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -66,32 +66,32 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
Row( Row(
children: [ children: [
StatusLabel( StatusLabel(
label: widget.serviceRequest.priority.name, label: serviceRequest.priority.name,
id: widget.serviceRequest.priority.id, id: serviceRequest.priority.id,
textColor: AColors.getPriorityStatusTextColor(widget.serviceRequest.priority.id), textColor: AColors.getPriorityStatusTextColor(serviceRequest.priority.id),
backgroundColor: AColors.getPriorityStatusColor(widget.serviceRequest.priority.id)), backgroundColor: AColors.getPriorityStatusColor(serviceRequest.priority.id)),
8.width, 8.width,
StatusLabel( StatusLabel(
label: widget.serviceRequest.statusLabel, label: serviceRequest.statusLabel,
textColor: AColors.getRequestStatusTextColor(widget.serviceRequest.statusValue), textColor: AColors.getRequestStatusTextColor(serviceRequest.statusValue),
backgroundColor: AColors.getRequestStatusColor(widget.serviceRequest.statusValue)), backgroundColor: AColors.getRequestStatusColor(serviceRequest.statusValue)),
1.width.expanded, 1.width.expanded,
], ],
), ),
8.height, 8.height,
Text(widget.serviceRequest.deviceEnName, style: AppTextStyles.heading5.copyWith(color: context.isDark?AppColor.neutral30: const Color(0xFF3B3D4A))), Text(serviceRequest.deviceEnName, style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))),
8.height, 8.height,
Text( Text(
'${context.translation.assetNumber}: ${widget.serviceRequest.device.assetNumber}', '${context.translation.assetNumber}: ${serviceRequest.device.assetNumber}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
), ),
Text( Text(
'${context.translation.requestType}: ${widget.serviceRequest.type.name}', '${context.translation.requestType}: ${serviceRequest.type.name}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
), ),
Text( Text(
'${context.translation.requestNo}: ${widget.serviceRequest.requestCode}', '${context.translation.requestNo}: ${serviceRequest.requestCode}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
), ),
], ],
).expanded, ).expanded,
@ -100,10 +100,11 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
children: [ children: [
if (_userProvider.user.type == UsersTypes.normal_user) if (_userProvider.user.type == UsersTypes.normal_user)
context.translation.code.toSvgAsset(width: 48).onPress(() { context.translation.code.toSvgAsset(width: 48).onPress(() {
Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateServiceRequestPage(serviceRequest: widget.serviceRequest))); Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateServiceRequestPage(serviceRequest: serviceRequest)));
}), }),
if (_userProvider.user.type == UsersTypes.engineer) 16.height, if (_userProvider.user.type == UsersTypes.engineer) 16.height,
Text(widget.serviceRequest.date.toServiceRequestCardFormat, textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark?AppColor.neutral30:const Color(0xFF3B3D4A))), Text(serviceRequest.date.toServiceRequestCardFormat,
textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))),
], ],
) )
], ],
@ -112,34 +113,35 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
const Divider(color: Color(0xFFEAF1F4), height: 1, thickness: 1), const Divider(color: Color(0xFFEAF1F4), height: 1, thickness: 1),
8.height, 8.height,
Text( Text(
'${context.translation.manufacture}: ${widget.serviceRequest.device.modelDefinition.manufacturerName}', '${context.translation.manufacture}: ${serviceRequest.device.modelDefinition.manufacturerName}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
), ),
Text( Text(
'${context.translation.model}: ${widget.serviceRequest.device.modelDefinition.modelName}', '${context.translation.model}: ${serviceRequest.device.modelDefinition.modelName}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
), ),
8.height, 8.height,
if ((widget.serviceRequest.callComments ?? "").isNotEmpty) ...[ if ((serviceRequest.callComments ?? "").isNotEmpty) ...[
const Divider(color: Color(0xFFEAF1F4), height: 1, thickness: 1), const Divider(color: Color(0xFFEAF1F4), height: 1, thickness: 1),
8.height, 8.height,
Text( Text(
widget.serviceRequest.callComments, serviceRequest.callComments,
style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
), ),
], ],
if (widget.serviceRequest.devicePhotos.isNotEmpty) ...[ if (serviceRequest.devicePhotos.isNotEmpty) ...[
8.height, 8.height,
const Divider(color: Color(0xFFEAF1F4), height: 1, thickness: 1), const Divider(color: Color(0xFFEAF1F4), height: 1, thickness: 1),
FilesList(images: widget.serviceRequest.devicePhotos), FilesList(images: serviceRequest.devicePhotos),
], ],
if (widget.serviceRequest.audio?.isNotEmpty ?? false) ...[ if (serviceRequest.audio?.isNotEmpty ?? false) ...[
const Divider(color: Color(0xFFEAF1F4), height: 1, thickness: 1), const Divider(color: Color(0xFFEAF1F4), height: 1, thickness: 1),
16.height, 16.height,
ASoundPlayer(audio: widget.serviceRequest.audio), ASoundPlayer(audio: serviceRequest.audio),
8.height,
], ],
], ],
).paddingAll(16), ).paddingOnly(start: 16, end: 16, top: 16, bottom: 8),
(_userProvider.user.type == UsersTypes.normal_user (_userProvider.user.type == UsersTypes.normal_user
? Container( ? Container(
height: 50, height: 50,
@ -158,12 +160,12 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
child: Row( child: Row(
children: [ children: [
Text( Text(
'${context.translation.viewComments}...', '${context.translation.commentHere}...',
style: AppTextStyles.heading6.copyWith( style: AppTextStyles.heading6.copyWith(
color: AppColor.neutral50.withOpacity(.6), color: AppColor.neutral50.withOpacity(.6),
), ),
).expanded, ).expanded,
SvgPicture.asset("assets/images/comment_send.svg", width: 24 * AppStyle.getScaleFactor(context), height: 24 * AppStyle.getScaleFactor(context), color: AppColor.primary70), SvgPicture.asset("assets/images/comment_send.svg", width: 24 * AppStyle.getScaleFactor(context), height: 20 * AppStyle.getScaleFactor(context), color: AppColor.primary70),
], ],
), ),
) )
@ -190,17 +192,18 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
), ),
], ],
).paddingOnly(bottom: 16, start: 16, end: 16)) ).paddingOnly(bottom: 16, start: 16, end: 16))
.onPress(() async { .onPress(() {
await showModalBottomSheet( showModalBottomSheet(
context: context, context: context,
useSafeArea: true, useSafeArea: true,
isScrollControlled: true, isScrollControlled: true,
useRootNavigator: true,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
builder: (context) => CommentsBottomSheet(requestId: widget.serviceRequest.id), builder: (context) => CommentsBottomSheet(requestId: serviceRequest.id),
); );
}), }),
], ],
).toShadowContainer(context); ).toShadowContainer(context, padding: 0);
} }
return Scaffold( return Scaffold(
@ -213,13 +216,13 @@ class _ServiceRequestDetailsPageState extends State<ServiceRequestDetailsPage> {
if (snap.connectionState == ConnectionState.waiting) { if (snap.connectionState == ConnectionState.waiting) {
return const ALoading(); return const ALoading();
} else if (snap.hasData) { } else if (snap.hasData) {
final serviceRequest = snap.data; ServiceRequest serviceRequest = snap.data;
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
SingleChildScrollView( SingleChildScrollView(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
child: informationCard(), child: informationCard(serviceRequest),
).expanded, ).expanded,
if (_userProvider.user.type == UsersTypes.engineer || (serviceRequest.statusValue == 5 || serviceRequest.statusValue == 3)) if (_userProvider.user.type == UsersTypes.engineer || (serviceRequest.statusValue == 5 || serviceRequest.statusValue == 3))
(serviceRequest.firstAction == null (serviceRequest.firstAction == null

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
@ -8,6 +9,8 @@ import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visit.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart'; import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import '../../../../controllers/providers/api/user_provider.dart'; import '../../../../controllers/providers/api/user_provider.dart';
import '../../../../models/enums/user_types.dart'; import '../../../../models/enums/user_types.dart';
@ -25,58 +28,68 @@ class VisitDetailsPage extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
UserProvider userProvider = Provider.of<UserProvider>(context); UserProvider userProvider = Provider.of<UserProvider>(context);
RegularVisitsProvider _visitsProvider = Provider.of<RegularVisitsProvider>(context);
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.preventiveMaintenance), appBar: DefaultAppBar(title: context.translation.preventiveMaintenance),
body: SafeArea( body: SafeArea(
child: Column( child: FutureBuilder(
children: [ future: _visitsProvider.getVisitObjectById(visit.id),
SingleChildScrollView( builder: (context, snap) {
child: Column( if (snap.connectionState == ConnectionState.waiting) {
//mainAxisSize: MainAxisSize.min, return const ALoading();
crossAxisAlignment: CrossAxisAlignment.start, } else if (snap.hasData) {
children: [ Visit visit = snap.data;
Row(
children: [ return Column(children: [
// StatusLabel( SingleChildScrollView(
// label: visit.priority.name, child: Column(
// id: visit.priority.id, crossAxisAlignment: CrossAxisAlignment.start,
// textColor: AColors.getPriorityStatusTextColor(visit.priority.id), children: [
// backgroundColor: AColors.getPriorityStatusColor(visit.priority.id)), Row(
// 8.width, children: [
StatusLabel( // StatusLabel(
label: visit.status.name, // label: visit.priority.name,
id: visit.status.id, // id: visit.priority.id,
textColor: AColors.getRequestStatusTextColorByName(visit.status.name), // textColor: AColors.getPriorityStatusTextColor(visit.priority.id),
backgroundColor: AColors.getRequestStatusColorByName(visit.status.name), // backgroundColor: AColors.getPriorityStatusColor(visit.priority.id)),
), // 8.width,
1.width.expanded, StatusLabel(
], label: visit.status.name,
), id: visit.status.id,
8.height, textColor: AColors.getRequestStatusTextColorByName(visit.status.name),
visit.deviceEnglishName.heading5(context), backgroundColor: AColors.getRequestStatusColorByName(visit.status.name),
8.height, ),
'${context.translation.assetNumber}: ${visit.deviceNumber}'.bodyText(context), 1.width.expanded,
'${context.translation.assetSN}: ${visit.deviceSerialNumber}'.bodyText(context), ],
'${context.translation.code}: ${visit.serialNumber}'.bodyText(context), ),
const Divider().defaultStyle(context), 8.height,
'${context.translation.expectDate}: ${visit.expectDate?.toServiceRequestDetailsFormat}'.bodyText(context), visit.deviceEnglishName.heading5(context),
'${context.translation.actualDate}: ${visit.actualDate?.toServiceRequestDetailsFormat}'.bodyText(context), 8.height,
const Divider().defaultStyle(context), '${context.translation.assetNumber}: ${visit.deviceNumber}'.bodyText(context),
'${context.translation.assignedTo}: ${visit.assignTo}'.bodyText(context), '${context.translation.assetSN}: ${visit.deviceSerialNumber}'.bodyText(context),
'${context.translation.engineerName}: ${visit.employName}'.bodyText(context), '${context.translation.code}: ${visit.serialNumber}'.bodyText(context),
'${context.translation.site}: ${visit.hospitalName}'.bodyText(context), const Divider().defaultStyle(context),
], '${context.translation.expectDate}: ${visit.expectDate?.toServiceRequestDetailsFormat}'.bodyText(context),
).toShadowContainer(context).paddingAll(16), '${context.translation.actualDate}: ${visit.actualDate?.toServiceRequestDetailsFormat}'.bodyText(context),
).expanded, const Divider().defaultStyle(context),
if (userProvider.user.type == UsersTypes.engineer && visit.status.id != 270) '${context.translation.assignedTo}: ${visit.assignTo}'.bodyText(context),
AppFilledButton( '${context.translation.engineerName}: ${visit.employName}'.bodyText(context),
onPressed: () { '${context.translation.site}: ${visit.hospitalName}'.bodyText(context),
Navigator.of(context).push(MaterialPageRoute(builder: (_) => EditPentry(visit: visit, pentry: visit.pentry))); ],
}, ).toShadowContainer(context).paddingAll(16),
label: context.translation.updateRequest, ).expanded,
).paddingAll(16), if (userProvider.user.type == UsersTypes.engineer && visit.status.id != 270)
], AppFilledButton(
), onPressed: () {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => EditPentry(visit: visit, pentry: visit.pentry)));
},
label: context.translation.updateRequest,
).paddingAll(16)
]);
}
return NoItemFound(message: context.translation.noDataFound);
}),
), ),
); );
} }

@ -15,6 +15,7 @@ class AssetItemListView extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Row( return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Container( Container(
width: 95, width: 95,
@ -38,15 +39,15 @@ class AssetItemListView extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
device.modelDefinition.assetName.heading5(context), device.modelDefinition.assetName.heading6(context),
"${context.translation.assetNumber} : ${device.assetNumber}".bodyText(context), "${context.translation.assetNumber} : ${device.assetNumber}".bodyText(context),
"${context.translation.model} : ${device.modelDefinition.modelDefCode}".bodyText(context), "${context.translation.model} : ${device.modelDefinition.modelDefCode}".bodyText(context),
], ],
), ),
Row( Row(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
"${context.translation.serialNo} : ${device.assetSerialNo}".bodyText(context).expanded, "${context.translation.serialNo} : ${device.assetSerialNo}".bodyText(context).expanded,
Row( Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [

@ -152,9 +152,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
children: [ children: [
Expanded( Expanded(
child: _searchableList.isEmpty child: _searchableList.isEmpty
? NoItemFound( ? NoItemFound(message: context.translation.noDeviceFound)
message: context.translation.noDeviceFound,
)
: LazyLoading( : LazyLoading(
nextPage: _devicesProvider.nextPage, nextPage: _devicesProvider.nextPage,
onLazyLoad: () async { onLazyLoad: () async {
@ -186,8 +184,6 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
device: _searchableList[index], device: _searchableList[index],
onPressed: (device) { onPressed: (device) {
Navigator.of(context).pushNamed(AssetDetailPage.id, arguments: device.id); Navigator.of(context).pushNamed(AssetDetailPage.id, arguments: device.id);
return;
Navigator.of(context).pop(device);
}, },
); );
}, },

@ -1,4 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/app_style/app_text_style.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
class NoItemFound extends StatelessWidget { class NoItemFound extends StatelessWidget {
@ -14,11 +18,7 @@ class NoItemFound extends StatelessWidget {
return Stack( return Stack(
children: [ children: [
Center( Center(
child: Text( child: Text(message ?? "no item found", style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)),
message ?? "no item found",
style: Theme.of(context).textTheme.headline6,
textScaleFactor: AppStyle.getScaleFactor(context),
),
), ),
ListView(), ListView(),
], ],

@ -27,11 +27,11 @@ class ServiceRequestItem extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
User _user = Provider.of<UserProvider>(context, listen: false).user; // User _user = Provider.of<UserProvider>(context, listen: false).user;
final servicesProvider = Provider.of<ServiceRequestsProvider>(context, listen: false); // final servicesProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
final settingProvider = Provider.of<SettingProvider>(context, listen: false); // final settingProvider = Provider.of<SettingProvider>(context, listen: false);
Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; // Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; // Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
return Column( return Column(
children: [ children: [
@ -50,26 +50,26 @@ class ServiceRequestItem extends StatelessWidget {
8.width, 8.width,
StatusLabel(label: request.statusLabel, textColor: AColors.getRequestStatusTextColor(request.statusValue), backgroundColor: AColors.getRequestStatusColor(request.statusValue)), StatusLabel(label: request.statusLabel, textColor: AColors.getRequestStatusTextColor(request.statusValue), backgroundColor: AColors.getRequestStatusColor(request.statusValue)),
1.width.expanded, 1.width.expanded,
Text(request.date.toServiceRequestCardFormat, textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark? AppColor.neutral30:const Color(0xFF3B3D4A))), Text(request.date.toServiceRequestCardFormat, textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))),
], ],
), ),
8.height, 8.height,
Text(context.translation.serviceRequest, style: AppTextStyles.heading5.copyWith(color: context.isDark? AppColor.neutral30:const Color(0xFF3B3D4A))), Text(context.translation.serviceRequest, style: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : const Color(0xFF3B3D4A))),
Text( Text(
'${context.translation.assetName}: ${request.deviceEnName}', '${context.translation.assetName}: ${request.deviceEnName}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
), ),
Text( Text(
'${context.translation.assetNumber}: ${request.device.assetNumber}', '${context.translation.assetNumber}: ${request.device.assetNumber}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
), ),
Text( Text(
'${context.translation.requestType}: ${request.type.name}', '${context.translation.requestType}: ${request.type.name}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
), ),
Text( Text(
'${context.translation.requestNo}: ${request.requestCode}', '${context.translation.requestNo}: ${request.requestCode}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark?AppColor.neutral10:Color(0xFF757575)), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : Color(0xFF757575)),
), ),
8.height, 8.height,
Row( Row(

Loading…
Cancel
Save