Merge remote-tracking branch 'origin/design_3.0_sdk_upgrade' into design_3.0_sdk_upgrade

# Conflicts:
#	lib/new_views/common_widgets/single_item_drop_down_menu.dart
design_3.0_latest
muhammad.abbasi 1 year ago
commit 457455a1b5

@ -107,9 +107,7 @@ class DashBoardProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
Response response; Response response;
try { try {
response = await ApiManager.instance.get( response = await ApiManager.instance.get(URLs.getWorkOrderByIdUrl + "?workOrderId=$id");
URLs.getWorkOrderByIdUrl + "?workOrderId=$id",
);
stateCode = response.statusCode; stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
@ -178,19 +176,14 @@ class DashBoardProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
if (_requestDetailList == null) { if (_requestDetailList == null) {
_requestDetailList = DD.DashboardDetail.fromJson(json.decode(response.body)); _requestDetailList = DD.DashboardDetail.fromJson(json.decode(response.body));
//notifyListeners();
} else { } else {
_requestDetailList!.data!.addAll(DD.DashboardDetail.fromJson(json.decode(response.body)["data"][0]).data ?? []); _requestDetailList!.data!.addAll(DD.DashboardDetail.fromJson(json.decode(response.body)).data ?? []);
//notifyListeners();
} }
if (_requestDetailList!.data!.length >= pageItemNumber) { if (_requestDetailList!.data!.length >= pageItemNumber) {
nextPage = true; nextPage = true;
} else { } else {
nextPage = false; nextPage = false;
} }
//notifyListeners();
} else { } else {
requestDetailList = null; requestDetailList = null;
} }

@ -5,7 +5,6 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/notification/firebase_notification_manger.dart'; import 'package:test_sa/controllers/notification/firebase_notification_manger.dart';
import 'package:test_sa/controllers/notification/notification_manger.dart'; import 'package:test_sa/controllers/notification/notification_manger.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; import 'package:test_sa/controllers/providers/api/notifications_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/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
@ -36,8 +35,8 @@ class _DashboardViewState extends State<DashboardView> {
late SettingProvider settingProvider; late SettingProvider settingProvider;
late UserProvider userProvider; late UserProvider userProvider;
late AllRequestsProvider allRequestsProvider;
late DashBoardProvider dashBoardProvider; // late AllRequestsProvider allRequestsProvider;
late NotificationsProvider notificationsProvider; late NotificationsProvider notificationsProvider;
late ScrollController _scrollController; late ScrollController _scrollController;
late DashBoardProvider _dashBoardProvider; late DashBoardProvider _dashBoardProvider;
@ -51,6 +50,7 @@ class _DashboardViewState extends State<DashboardView> {
void getRequests() { void getRequests() {
_dashBoardProvider.getDashBoardCount(usersType: userProvider.user!.type!); _dashBoardProvider.getDashBoardCount(usersType: userProvider.user!.type!);
_dashBoardProvider.resetRequestDataList();
_dashBoardProvider.getRequestDetail(usersType: userProvider.user!.type!, status: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].tag); _dashBoardProvider.getRequestDetail(usersType: userProvider.user!.type!, status: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].tag);
} }
@ -59,7 +59,7 @@ class _DashboardViewState extends State<DashboardView> {
userProvider = Provider.of<UserProvider>(context, listen: false); userProvider = Provider.of<UserProvider>(context, listen: false);
settingProvider = Provider.of<SettingProvider>(context, listen: false); settingProvider = Provider.of<SettingProvider>(context, listen: false);
RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false); RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false); //allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
_dashBoardProvider = Provider.of<DashBoardProvider>(context, listen: false); _dashBoardProvider = Provider.of<DashBoardProvider>(context, listen: false);
_dashBoardProvider.setTabs(userProvider.user!.type!, context); _dashBoardProvider.setTabs(userProvider.user!.type!, context);
notificationsProvider = Provider.of<NotificationsProvider>(context, listen: false); notificationsProvider = Provider.of<NotificationsProvider>(context, listen: false);
@ -99,9 +99,9 @@ class _DashboardViewState extends State<DashboardView> {
void handleScroll() async { void handleScroll() async {
_scrollController = ScrollController(); _scrollController = ScrollController();
_scrollController.addListener(() async { _scrollController.addListener(() async {
if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent && !allRequestsProvider.isFilterRequestLoading) { if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent && !_dashBoardProvider.isDetailLoading) {
allRequestsProvider.pageNum = allRequestsProvider.pageNum + 1; _dashBoardProvider.pageNum = _dashBoardProvider.pageNum + 1;
await allRequestsProvider.getFilterRequests(showLoader: false, status: allRequestsProvider.status); _dashBoardProvider.getRequestDetail(usersType: user.type!, showLoader: false, status: _dashBoardProvider.currentListIndex);
} }
}); });
} }
@ -115,7 +115,7 @@ class _DashboardViewState extends State<DashboardView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
bool isNurse = (Provider.of<UserProvider>(context, listen: false).user!.type) == UsersTypes.normal_user; bool isNurse = (Provider.of<UserProvider>(context, listen: false).user!.type) == UsersTypes.normal_user;
print('user data is ${Provider.of<UserProvider>(context, listen: false).user?.toJson()}'); print('user data is ${Provider.of<UserProvider>(context, listen: false).user?.toJson()}');
return Scaffold( return Scaffold(
// backgroundColor: AppColor.background(context), // backgroundColor: AppColor.background(context),
appBar: PreferredSize( appBar: PreferredSize(

@ -10,6 +10,7 @@ import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/new_views/common_widgets/tab_button.dart'; import 'package:test_sa/new_views/common_widgets/tab_button.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
class RequestCategoryFragment extends StatelessWidget { class RequestCategoryFragment extends StatelessWidget {
const RequestCategoryFragment({Key? key}) : super(key: key); const RequestCategoryFragment({Key? key}) : super(key: key);
@ -33,7 +34,9 @@ class RequestCategoryFragment extends StatelessWidget {
child: const SizedBox().toRequestShimmer(context, dashboardProvider.isDetailLoading), child: const SizedBox().toRequestShimmer(context, dashboardProvider.isDetailLoading),
); );
})).paddingOnly(start: 16, end: 16, top: 16) })).paddingOnly(start: 16, end: 16, top: 16)
: RequestCategoryList(dashboardProvider.requestDetailList?.data ?? <Data>[], dashboardProvider.isDetailLoading, dashboardProvider.requestDetailList?.totalRows ?? 0), : (dashboardProvider.requestDetailList?.data?.isEmpty ?? true)
? const NoDataFound().paddingOnly(top: 50).center
: RequestCategoryList(dashboardProvider.requestDetailList?.data ?? <Data>[], dashboardProvider.isDetailLoading, dashboardProvider.requestDetailList?.totalRows ?? 0),
]); ]);
}); });
} }

@ -1,5 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/dashboard_latest/widgets/app_bar_widget.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/models/new_models/dashboard_detail.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/pages/land_page/requests/asset_item_view.dart'; import 'package:test_sa/new_views/pages/land_page/requests/asset_item_view.dart';
@ -23,14 +25,7 @@ class RequestCategoryList extends StatelessWidget {
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index == list.length) { if (index == list.length) {
return const ListTile( return const CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 1).center;
title: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 1),
],
),
);
} }
return Padding(padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight), child: _buildRequestItem(list[index])); return Padding(padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight), child: _buildRequestItem(list[index]));
}, },

@ -1,14 +1,15 @@
import 'package:test_sa/models/fault_description.dart'; import 'package:test_sa/models/fault_description.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import '../../new_models/work_order_detail_model.dart'; import '../../new_models/work_order_detail_model.dart';
class FixRemotelyHelperModel { class FixRemotelyHelperModel {
int? workOrderId; int? workOrderId;
DateTime? startDate; DateTime? startDate;
DateTime? endDate; DateTime? endDate;
int? workingHour; int? workingHour;
String? comment; String? comment;
FixRemotelyHelperModel({this.workOrderId, this.startDate, this.endDate, this.workingHour, this.comment}); FixRemotelyHelperModel({this.workOrderId, this.startDate, this.endDate, this.workingHour, this.comment});
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@ -25,17 +26,10 @@ class WorkOrderHelperModel {
String? voiceNote; String? voiceNote;
List<WorkOrderAttachments>? workOrderAttachments; List<WorkOrderAttachments>? workOrderAttachments;
WorkOrderHelperModel( WorkOrderHelperModel({this.assetId, this.equipmentStatusId, this.priorityId, this.problemDescriptionId, this.comments, this.voiceNote, this.workOrderAttachments});
{this.assetId,
this.equipmentStatusId,
this.priorityId,
this.problemDescriptionId,
this.comments,
this.voiceNote,
this.workOrderAttachments});
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{}; final Map<String, dynamic> data = <String, dynamic>{};
data['assetId'] = assetId; data['assetId'] = assetId;
data['equipmentStatusId'] = equipmentStatusId; data['equipmentStatusId'] = equipmentStatusId;
data['priorityId'] = priorityId; data['priorityId'] = priorityId;
@ -43,54 +37,58 @@ class WorkOrderHelperModel {
data['comments'] = comments; data['comments'] = comments;
data['voiceNote'] = voiceNote; data['voiceNote'] = voiceNote;
if (workOrderAttachments != null) { if (workOrderAttachments != null) {
data['workOrderAttachments'] = data['workOrderAttachments'] = workOrderAttachments!.map((v) => v.toJson()).toList();
workOrderAttachments!.map((v) => v.toJson()).toList();
} }
return data; return data;
} }
} }
class WorkOrderAttachments { class WorkOrderAttachments {
WorkOrderAttachments({this.id, this.name});
int? id; int? id;
String? name; String? name;
WorkOrderAttachments({this.id, this.name}); WorkOrderAttachments.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
}
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{}; final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id; data['id'] = id;
data['name'] = name; data['name'] = name;
return data; return data;
} }
} }
class EngineerUpdateWorkOrderHelperModel { class EngineerUpdateWorkOrderHelperModel {
int? workOrderId; int? workOrderId;
Lookup?equipmentStatus; Lookup? equipmentStatus;
String? returnToService; String? returnToService;
Lookup? serviceType; Lookup? serviceType;
Lookup? loanAvailability; Lookup? loanAvailability;
num?loanAssetId; num? loanAssetId;
WorkOrderAsset? loanAsset; WorkOrderAsset? loanAsset;
Lookup? failureReason; Lookup? failureReason;
FaultDescription? faultDescription; FaultDescription? faultDescription;
String? solution; String? solution;
EngineerUpdateWorkOrderHelperModel( EngineerUpdateWorkOrderHelperModel({
{this.workOrderId, this.workOrderId,
this.equipmentStatus, this.equipmentStatus,
this.failureReason, this.failureReason,
this.faultDescription, this.faultDescription,
this.loanAvailability, this.loanAvailability,
this.loanAssetId, this.loanAssetId,
this.loanAsset, this.loanAsset,
this.serviceType, this.serviceType,
this.solution, this.solution,
this.returnToService, this.returnToService,
}); });
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{}; final Map<String, dynamic> data = <String, dynamic>{};
data['workOrderId'] = workOrderId; data['workOrderId'] = workOrderId;
data['equipmentStatusId'] = equipmentStatus?.id; data['equipmentStatusId'] = equipmentStatus?.id;
data['returnToService'] = returnToService; data['returnToService'] = returnToService;
@ -118,6 +116,7 @@ class NurseActionHelperModel {
return {'workOrderId': workOrderId, 'feedback': feedback, 'signatureNurse': signatureNurse}; return {'workOrderId': workOrderId, 'feedback': feedback, 'signatureNurse': signatureNurse};
} }
} }
class NeedVisitHelperModel { class NeedVisitHelperModel {
int? workOrderId; int? workOrderId;
DateTime? visitDate; DateTime? visitDate;
@ -125,7 +124,6 @@ class NeedVisitHelperModel {
NeedVisitHelperModel({this.workOrderId, this.visitDate, this.comment}); NeedVisitHelperModel({this.workOrderId, this.visitDate, this.comment});
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return {'workOrderId': workOrderId, 'visitDate': visitDate?.toIso8601String(), 'comment': comment}; return {'workOrderId': workOrderId, 'visitDate': visitDate?.toIso8601String(), 'comment': comment};
} }
@ -136,9 +134,9 @@ class EngineerRejectHelperModel {
String? feedback; String? feedback;
Lookup? rejectionReason; Lookup? rejectionReason;
EngineerRejectHelperModel({this.workOrderId, this.feedback,this.rejectionReason}); EngineerRejectHelperModel({this.workOrderId, this.feedback, this.rejectionReason});
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return {'workOrderId': workOrderId, 'feedback': feedback, 'rejectReasonId': rejectionReason?.id}; return {'workOrderId': workOrderId, 'feedback': feedback, 'rejectReasonId': rejectionReason?.id};
} }
} }

@ -117,7 +117,7 @@ class WorkOrderData {
Lookup? problemDescription; Lookup? problemDescription;
String? comments; String? comments;
String? voiceNote; String? voiceNote;
List<String> workOrderAttachments; List<WorkOrderAttachments> workOrderAttachments;
String? returnToService; String? returnToService;
Lookup? serviceType; Lookup? serviceType;
Lookup? failureReasone; Lookup? failureReasone;
@ -164,7 +164,7 @@ class WorkOrderData {
problemDescription: json["problemDescription"] == null ? null : Lookup.fromJson(json["problemDescription"]), problemDescription: json["problemDescription"] == null ? null : Lookup.fromJson(json["problemDescription"]),
comments: json["comments"], comments: json["comments"],
voiceNote: json["voiceNote"], voiceNote: json["voiceNote"],
workOrderAttachments: json["workOrderAttachments"] == null ? [] : List<String>.from(json["workOrderAttachments"]!.map((x) => x)), workOrderAttachments: json["workOrderAttachments"] == null ? [] : List.from(json['workOrderAttachments']).map((e)=>WorkOrderAttachments.fromJson(e)).toList(),
returnToService: json["returnToService"], returnToService: json["returnToService"],
serviceType: json["serviceType"] == null ? null : Lookup.fromJson(json["serviceType"]), serviceType: json["serviceType"] == null ? null : Lookup.fromJson(json["serviceType"]),
failureReasone: json["failureReasone"] == null ? null : Lookup.fromJson(json["failureReasone"]), failureReasone: json["failureReasone"] == null ? null : Lookup.fromJson(json["failureReasone"]),
@ -212,7 +212,7 @@ class WorkOrderData {
"problemDescription": problemDescription?.toJson(), "problemDescription": problemDescription?.toJson(),
"comments": comments, "comments": comments,
"voiceNote": voiceNote, "voiceNote": voiceNote,
"workOrderAttachments": workOrderAttachments.map((x) => x).toList(), "workOrderAttachments": workOrderAttachments.map((e)=>e.toJson()).toList(),
"returnToService": returnToService, "returnToService": returnToService,
"serviceType": serviceType?.toJson(), "serviceType": serviceType?.toJson(),
"failureReasone": failureReasone?.toJson(), "failureReasone": failureReasone?.toJson(),
@ -403,12 +403,14 @@ class ActivitySparePart {
int? id; int? id;
PartCatalogItem? partCatalogItem; PartCatalogItem? partCatalogItem;
double? quantity; double? quantity;
String? comment;
List<SparePartAttachments>? acitiySparePartAttachments; List<SparePartAttachments>? acitiySparePartAttachments;
ActivitySparePart( ActivitySparePart(
{this.id, {this.id,
this.partCatalogItem, this.partCatalogItem,
this.quantity, this.quantity,
this.comment,
this.acitiySparePartAttachments}); this.acitiySparePartAttachments});
ActivitySparePart.fromJson(Map<String, dynamic> json) { ActivitySparePart.fromJson(Map<String, dynamic> json) {
@ -417,6 +419,7 @@ class ActivitySparePart {
? new PartCatalogItem.fromJson(json['partCatalogItem']) ? new PartCatalogItem.fromJson(json['partCatalogItem'])
: null; : null;
quantity = json['quantity']; quantity = json['quantity'];
comment = json['comment'];
if (json['acitiySparePartAttachments'] != null) { if (json['acitiySparePartAttachments'] != null) {
acitiySparePartAttachments = <SparePartAttachments>[]; acitiySparePartAttachments = <SparePartAttachments>[];
json['acitiySparePartAttachments'].forEach((v) { json['acitiySparePartAttachments'].forEach((v) {
@ -432,6 +435,7 @@ class ActivitySparePart {
data['partCatalogItem'] = partCatalogItem!.toJson(); data['partCatalogItem'] = partCatalogItem!.toJson();
} }
data['quantity'] = quantity; data['quantity'] = quantity;
data['comment'] = comment;
if (acitiySparePartAttachments != null) { if (acitiySparePartAttachments != null) {
data['acitiySparePartAttachments'] = data['acitiySparePartAttachments'] =
acitiySparePartAttachments!.map((v) => v.toJson()).toList(); acitiySparePartAttachments!.map((v) => v.toJson()).toList();

@ -75,7 +75,7 @@ class AppColor {
static const Color orange70 = Color(0xffFFC945); static const Color orange70 = Color(0xffFFC945);
// static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff1FA269) : green50; // static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff1FA269) : green50;
static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff54C166) : green70; static Color greenStatus(BuildContext context) => context.isDark ? const Color(0xff54C166) : green70.withOpacity(.5);
// static Color blueStatus(BuildContext context) => context.isDark ? primary40 : primary50; // static Color blueStatus(BuildContext context) => context.isDark ? primary40 : primary50;
static Color blueStatus(BuildContext context) => context.isDark ? primary40 : primary90; static Color blueStatus(BuildContext context) => context.isDark ? primary40 : primary90;
@ -101,6 +101,12 @@ class AppColor {
return orange60; return orange60;
case "high priority": case "high priority":
return white10; return white10;
case "yes":
return white10;
case "low priority":
return green15;
case "low":
return green15;
default: default:
return Colors.white; return Colors.white;
} }
@ -152,6 +158,8 @@ class AppColor {
return greenStatus(context); return greenStatus(context);
case "high priority": case "high priority":
return redStatus(context); return redStatus(context);
case "yes":
return redStatus(context);
case "low priority": case "low priority":
return greenStatus(context); return greenStatus(context);
case "open": case "open":
@ -202,6 +210,8 @@ class AppColor {
//low priority //low priority
case 81: case 81:
return Colors.white; return Colors.white;
case 370:
return green15;
case 82: case 82:
//high priority //high priority
return white10; return white10;
@ -215,6 +225,8 @@ class AppColor {
//low priority //low priority
case 81: case 81:
return greenStatus(context); return greenStatus(context);
case 370:
return greenStatus(context);
//high priority //high priority
case 82: case 82:
return redStatus(context); return redStatus(context);

@ -46,15 +46,15 @@ class AppBottomNavigationBar extends StatelessWidget {
return BottomNavigationBarItem( return BottomNavigationBarItem(
icon: iconName icon: iconName
.toSvgAsset( .toSvgAsset(
width: showLabel ? 28 : 38, width: showLabel ? 26 : 38,
height: showLabel ? 26 : 37, height: showLabel ? 26 : 38,
color: showLabel || (showLabel && selectedIndex != 2) color: showLabel || (showLabel && selectedIndex != 2)
? selectedIndex == index ? selectedIndex == index
? Theme.of(context).bottomNavigationBarTheme.selectedItemColor ? Theme.of(context).bottomNavigationBarTheme.selectedItemColor
: Theme.of(context).bottomNavigationBarTheme.unselectedItemColor : Theme.of(context).bottomNavigationBarTheme.unselectedItemColor
: null, : null,
) )
.paddingOnly(top: 21, bottom: showLabel ? 4 : 0), .paddingOnly(top: showLabel ? 0 : 12, bottom: showLabel ? 6 : 0),
label: showLabel ? label : '', label: showLabel ? label : '',
); );
} }

@ -138,7 +138,7 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
isEmpty || widget.enabled == false ? context.translation.noDataFound : context.translation.select, isEmpty || widget.enabled == false ? context.translation.noDataFound : context.translation.select,
style: Theme.of(context).textTheme.bodyLarge, style: Theme.of(context).textTheme.bodyLarge,
), ),
style: TextStyle(color: Theme.of(context).primaryColor), style: TextStyle(color: Theme.of(context).primaryColor, fontSize: 12),
underline: const SizedBox.shrink(), underline: const SizedBox.shrink(),
onChanged: (widget.enabled == false || widget.showAsBottomSheet) onChanged: (widget.enabled == false || widget.showAsBottomSheet)
? null ? null
@ -155,7 +155,7 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
value: value, value: value,
child: Text( child: Text(
value.name ?? "", // Null-aware operator for value.name value.name ?? "", // Null-aware operator for value.name
style: Theme.of(context).textTheme.bodyLarge, style: Theme.of(context).textTheme.bodyMedium,
), ),
); );
}).toList(), }).toList(),

@ -9,40 +9,52 @@ import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart
class CreateRequestTypeBottomSheet extends StatelessWidget { class CreateRequestTypeBottomSheet extends StatelessWidget {
const CreateRequestTypeBottomSheet({super.key}); const CreateRequestTypeBottomSheet({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
//TODO replace all the icons with new icons... //TODO replace all the icons with new icons...
return Container( return Container(
padding: const EdgeInsets.all(16.0), padding: const EdgeInsets.all(16.0),
child: Row( child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisSize: MainAxisSize.min,
children: <Widget>[ crossAxisAlignment: CrossAxisAlignment.start,
listCard( children: [
context: context, "Select Request".heading4(context),
icon: 'add_icon', 16.height,
label: '${context.translation.create}\n${context.translation.serviceRequest}', GridView(
onTap: () { padding: EdgeInsets.all(0),
Navigator.pushReplacementNamed(context, CreateNewRequest.id); shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
}, gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 1, crossAxisSpacing: 16, mainAxisSpacing: 16),
), children: <Widget>[
listCard( listCard(
context: context, context: context,
icon: 'add_icon', icon: 'add_icon',
label: '${context.translation.create}\n${context.translation.gasRefill}', label: '${context.translation.create}\n${context.translation.serviceRequest}',
onTap: () { onTap: () {
//NewGasRefillRequestPage.routeName) Navigator.pushReplacementNamed(context, CreateNewRequest.id);
Navigator.pushReplacementNamed(context, NewGasRefillRequestPage.routeName); },
}, ),
), listCard(
listCard( context: context,
context: context, icon: 'add_icon',
icon: 'add_icon', label: '${context.translation.create}\n${context.translation.gasRefill}',
label: '${context.translation.create}\n${context.translation.deviceTransfer}', onTap: () {
onTap: () async { //NewGasRefillRequestPage.routeName)
Navigator.pushReplacementNamed(context, RequestDeviceTransfer.id); Navigator.pushReplacementNamed(context, NewGasRefillRequestPage.routeName);
}, },
),
listCard(
context: context,
icon: 'add_icon',
label: '${context.translation.create}\n${context.translation.deviceTransfer}',
onTap: () async {
Navigator.pushReplacementNamed(context, RequestDeviceTransfer.id);
},
),
],
), ),
16.height,
], ],
), ),
); );
@ -59,9 +71,14 @@ class CreateRequestTypeBottomSheet extends StatelessWidget {
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
icon.toSvgAsset(), const Icon(
24.height, Icons.add_circle,
color: AppColor.neutral120,
size: 32,
),
//24.height,
label.bodyText2(context).custom(color: AppColor.black20), label.bodyText2(context).custom(color: AppColor.black20),
], ],
), ),

@ -37,8 +37,8 @@ class ServiceRequestItemView extends StatelessWidget {
8.width, 8.width,
StatusLabel( StatusLabel(
label: requestData!.statusName!, label: requestData!.statusName!,
textColor: AppColor.getRequestStatusTextColorByName(context, requestData!.statusName!), textColor: AppColor.getHistoryLogStatusTextColorByName( requestData!.statusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, requestData!.statusName!), backgroundColor: AppColor.getHistoryLogStatusColorByName( requestData!.statusName!),
), ),
1.width.expanded, 1.width.expanded,
Text(requestData!.transactionDate!.toServiceRequestCardFormat, Text(requestData!.transactionDate!.toServiceRequestCardFormat,

@ -9,6 +9,7 @@ import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart'; import 'package:test_sa/models/new_models/dashboard_detail.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/new_views/pages/land_page/requests/request_paginated_listview.dart'; import 'package:test_sa/new_views/pages/land_page/requests/request_paginated_listview.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
class RequestsListPage extends StatefulWidget { class RequestsListPage extends StatefulWidget {
static const String routeName = "/requests-list-page"; static const String routeName = "/requests-list-page";
@ -67,6 +68,8 @@ class _RequestsListPageState extends State<RequestsListPage> {
); );
}, },
); );
} else if (snapshot.requestDetailList?.data?.isEmpty ?? true) {
return const NoDataFound().center;
} else { } else {
return RequestPaginatedListview(snapshot.requestDetailList?.data ?? <Data>[], snapshot.isDetailLoading, snapshot.requestDetailList?.totalRows ?? 0, _scrollController); return RequestPaginatedListview(snapshot.requestDetailList?.data ?? <Data>[], snapshot.isDetailLoading, snapshot.requestDetailList?.totalRows ?? 0, _scrollController);
} }

@ -1,19 +1,14 @@
import 'dart:async';
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/service_requests_provider.dart'; import 'package:test_sa/controllers/api_routes/urls.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';
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/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart'; import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart';
import 'package:test_sa/models/new_models/work_order_detail_model.dart'; import 'package:test_sa/models/new_models/work_order_detail_model.dart';
import 'package:test_sa/models/service_request/search_work_order.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/service_request/spare_parts.dart'; import 'package:test_sa/models/service_request/spare_parts.dart';
import 'package:test_sa/new_views/app_style/app_color.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/app_filled_button.dart';
@ -23,8 +18,7 @@ import 'package:test_sa/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.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/service_request_bottomsheet.dart';
import 'package:test_sa/service_request_latest/views/forms/spare_part/spare_part_request.dart'; import 'package:test_sa/service_request_latest/views/forms/spare_part/spare_part_request.dart';
import 'package:test_sa/views/pages/user/requests/work_order/update_service_report.dart'; import 'package:test_sa/views/widgets/images/files_list.dart';
import 'package:test_sa/views/pages/user/requests/work_order/work_order_details_page.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart';
@ -52,99 +46,107 @@ class ActivitiesListView extends StatelessWidget {
itemCount: activities.length, itemCount: activities.length,
separatorBuilder: (czt, index) => 8.height, separatorBuilder: (czt, index) => 8.height,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return Row( return Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Column( Row(
mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Row( StatusLabel(
mainAxisAlignment: MainAxisAlignment.spaceBetween, label: activities[index].activityStatus?.name,
children: [ textColor: AppColor.getHistoryLogStatusTextColorByName(activities[index].activityStatus!.name!),
StatusLabel( backgroundColor: AppColor.getHistoryLogStatusColorByName(activities[index].activityStatus!.name!),
label: activities[index].activityStatus?.name,
textColor: AppColor.getRequestStatusTextColorByName(context, activities[index].activityStatus?.name),
backgroundColor: AppColor.getRequestStatusColorByName(context, activities[index].activityStatus?.name),
),
"drag_icon".toSvgAsset(height: 12, width: 23, color: AppColor.neutral160),
if (userProvider.user!.type == UsersTypes.engineer &&
requestDetailProvider.currentWorkOrder?.data?.status?.value != 5 &&
requestDetailProvider.currentWorkOrder?.data?.status?.value != 3)
Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
"edit_icon".toSvgAsset(height: 21, width: 21).onPress(() {
print('attachments in activity model is ${activities[index].activitySparePart?.acitiySparePartAttachments}');
requestDetailProvider.sparePartHelperModel=SparePartHelperModel(
id: activities[index].id,
workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId,
sparePartAttachments:activities[index].activitySparePart?.acitiySparePartAttachments??[],
sparePart:SparePart(
id: activities[index].activitySparePart?.partCatalogItem?.id,
partName: activities[index].activitySparePart?.partCatalogItem?.partName,
partNo: activities[index].activitySparePart?.partCatalogItem?.partNumber),
quantity: activities[index].activitySparePart?.quantity,
activityStatusId: activities[index].activityStatus?.id,
//TODO commets are missing in api response..
// comment: activities[index].activitySparePart?.description,
);
requestDetailProvider.updateSparePartHelperModel(requestDetailProvider.sparePartHelperModel);
print('model in activity page is ${requestDetailProvider.sparePartHelperModel?.toJson()}');
Navigator.of(context).push(
MaterialPageRoute(builder: (_) => const SparePartRequest (),
));
}),
24.width,
"delete_icon".toSvgAsset(height: 21, width: 21).onPress(()async {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
int status = await requestDetailProvider.deleteActivitySparePart(id: activities[index].id!, workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!);
if (status == 200) {
await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
Navigator.pop(context);
} else {
Navigator.pop(context);
}
}),
],
)
],
),
6.height,
//activity type...
Text(
'${activities[index].activityType?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50),
),
3.height,
Text(
'${context.translation.partName}: ${activities[index].activitySparePart?.partCatalogItem?.partName}',
style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120),
), ),
2.height, "drag_icon".toSvgAsset(height: 12, width: 23, color: AppColor.neutral160),
Text( if (userProvider.user!.type == UsersTypes.engineer &&
'${context.translation.partNo}: ${activities[index].activitySparePart?.partCatalogItem?.partNumber}', requestDetailProvider.currentWorkOrder?.data?.status?.value != 5 &&
style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120), requestDetailProvider.currentWorkOrder?.data?.status?.value != 3)
), Row(
2.height, crossAxisAlignment: CrossAxisAlignment.start,
//TODO description text not in api. mainAxisAlignment: MainAxisAlignment.spaceBetween,
// Text( children: [
// '${context.translation.date}: ${activities[index].currentSituation?.date}', "edit_icon".toSvgAsset(height: 21, width: 21).onPress(() {
// style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120), requestDetailProvider.sparePartHelperModel = SparePartHelperModel(
// ), id: activities[index].id,
2.height, workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId,
comment: activities[index].activitySparePart?.comment,
sparePartAttachments: activities[index].activitySparePart?.acitiySparePartAttachments ?? [],
sparePart: SparePart(
id: activities[index].activitySparePart?.partCatalogItem?.id,
partName: activities[index].activitySparePart?.partCatalogItem?.partName,
partNo: activities[index].activitySparePart?.partCatalogItem?.partNumber),
quantity: activities[index].activitySparePart?.quantity,
activityStatusId: activities[index].activityStatus?.id,
//TODO commets are missing in api response..
// comment: activities[index].activitySparePart?.description,
);
requestDetailProvider.updateSparePartHelperModel(requestDetailProvider.sparePartHelperModel);
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => const SparePartRequest(),
));
}),
24.width,
"delete_icon".toSvgAsset(height: 21, width: 21).onPress(() async {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
int status =
await requestDetailProvider.deleteActivitySparePart(id: activities[index].id!, workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!);
if (status == 200) {
await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
Navigator.pop(context);
} else {
Navigator.pop(context);
}
}),
],
)
], ],
).onPress(() { ),
//TODO write onview detail method.. 6.height,
// Navigator.push( //activity type...
// context, Text(
// MaterialPageRoute(builder: (context) => WorkOrderDetailsPage(workOrder: activities[index], serviceRequest: ServiceRequest())), '${activities[index].activityType?.cleanupWhitespace.capitalizeFirstOfEach}',
// ); style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50),
}).expanded, ),
3.height,
Text(
'${context.translation.partName}: ${activities[index].activitySparePart?.partCatalogItem?.partName}',
style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120),
),
2.height,
Text(
'${context.translation.partNo}: ${activities[index].activitySparePart?.partCatalogItem?.partNumber}',
style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120),
),
2.height,
//TODO description text not in api.
// Text(
// '${context.translation.date}: ${activities[index].currentSituation?.date}',
// style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120),
// ),
if (activities[index].activitySparePart?.comment?.isNotEmpty ?? false) ...[
const Divider().defaultStyle(context),
2.height,
Text(
activities[index].activitySparePart?.comment ?? "",
style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120),
),
],
if (activities[index].activitySparePart?.acitiySparePartAttachments?.isNotEmpty ?? false) ...[
2.height,
const Divider().defaultStyle(context),
FilesList(images: activities[index].activitySparePart!.acitiySparePartAttachments!.map((toElement) => URLs.getFileUrl(toElement.name!)!).toList()),
],
], ],
).toShadowContainer(context); ).toShadowContainer(context, padding: 12).onPress(() {
//TODO write onview detail method..
// Navigator.push(
// context,
// MaterialPageRoute(builder: (context) => WorkOrderDetailsPage(workOrder: activities[index], serviceRequest: ServiceRequest())),
// );
});
}, },
).expanded, ).expanded,
if (userProvider.user!.type == UsersTypes.engineer && if (userProvider.user!.type == UsersTypes.engineer &&

@ -437,9 +437,9 @@ class ServiceRequestBottomSheet {
const SizedBox().indicatorWidget(), const SizedBox().indicatorWidget(),
Align( Align(
alignment: AlignmentDirectional.centerStart, alignment: AlignmentDirectional.centerStart,
child: context.translation.rejectionReason.heading4(context).paddingOnly(top: 21), child: context.translation.rejectionReason.heading4(context).paddingOnly(top: 12),
), ),
15.height, 16.height,
SingleItemDropDownMenu<Lookup, RejectReasonProvider>( SingleItemDropDownMenu<Lookup, RejectReasonProvider>(
context: context, context: context,
title: context.translation.reason, title: context.translation.reason,

@ -5,8 +5,6 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; 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/helper_data_models/workorder/work_order_helper_models.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/app_style/app_color.dart';
import 'package:test_sa/service_request_latest/request_detail_provider.dart'; import 'package:test_sa/service_request_latest/request_detail_provider.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/service_request_bottomsheet.dart';
@ -17,7 +15,6 @@ class InitialVisitCard extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Consumer<RequestDetailProvider>(builder: (context, RequestDetailProvider requestDetailProvider, snapshot) { return Consumer<RequestDetailProvider>(builder: (context, RequestDetailProvider requestDetailProvider, snapshot) {
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14), borderRadius: BorderRadius.circular(14),
@ -35,17 +32,14 @@ class InitialVisitCard extends StatelessWidget {
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10), style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.black10),
), ),
"edit_icon".toSvgAsset(height: 21, width: 21).onPress(() { "edit_icon".toSvgAsset(height: 21, width: 21).onPress(() {
ServiceRequestBottomSheet.initialVisitBottomSheet(context: context); ServiceRequestBottomSheet.initialVisitBottomSheet(context: context);
}), }),
]), ]),
2.height, 2.height,
context.translation.visitDateAndTime.bodyText2(context).custom(color: AppColor.neutral120), context.translation.visitDateAndTime.bodyText2(context).custom(color: AppColor.neutral120),
8.height, 12.height,
if (requestDetailProvider.needVisitHelperModel?.comment != null) ...[ if (requestDetailProvider.needVisitHelperModel?.comment != null) ...[
requestDetailProvider.needVisitHelperModel!.comment!.bodyText2(context).custom( requestDetailProvider.needVisitHelperModel!.comment!.bodyText2(context).custom(color: AppColor.neutral120),
color: AppColor.neutral120,
),
] ]
], ],
), ),

@ -1,8 +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/all_requests_provider.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/controllers/providers/api/comments_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/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';
@ -11,24 +9,15 @@ 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/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/enums/work_order_next_step.dart'; import 'package:test_sa/models/enums/work_order_next_step.dart';
import 'package:test_sa/models/helper_data_models/asset_retired/asset_retired_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart';
import 'package:test_sa/models/new_models/work_order_detail_model.dart'; import 'package:test_sa/models/new_models/work_order_detail_model.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/user.dart';
import 'package:test_sa/new_views/app_style/app_color.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/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/service_request_latest/request_detail_provider.dart'; import 'package:test_sa/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/service_request_latest/views/components/initial_visit_card.dart'; import 'package:test_sa/service_request_latest/views/components/initial_visit_card.dart';
import 'package:test_sa/service_request_latest/views/components/timer_widget.dart';
import 'package:test_sa/service_request_latest/views/forms/asset_retired/asset_retired.dart'; import 'package:test_sa/service_request_latest/views/forms/asset_retired/asset_retired.dart';
import 'package:test_sa/service_request_latest/views/nurse/create_new_request_view.dart';
import 'package:test_sa/views/pages/user/requests/comments_bottom_sheet.dart';
import 'package:test_sa/views/pages/user/requests/update_service_request_page.dart';
import 'package:test_sa/views/widgets/images/files_list.dart'; import 'package:test_sa/views/widgets/images/files_list.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart';
import 'package:test_sa/views/widgets/sound/sound_player.dart'; import 'package:test_sa/views/widgets/sound/sound_player.dart';
@ -100,8 +89,8 @@ class WorkOrderDetailView extends StatelessWidget {
StatusLabel( StatusLabel(
radius: 4, radius: 4,
label: workOrder.status!.name, label: workOrder.status!.name,
textColor: AppColor.getRequestStatusTextColor(context, workOrder.status!.id!), textColor: AppColor.getHistoryLogStatusTextColorByName(workOrder.status!.name!),
backgroundColor: AppColor.getRequestStatusColor(context, workOrder.status!.id!), backgroundColor: AppColor.getHistoryLogStatusColorByName(workOrder.status!.name!),
), ),
1.width.expanded, 1.width.expanded,
Column( Column(
@ -210,12 +199,12 @@ class WorkOrderDetailView extends StatelessWidget {
if (workOrder.workOrderAttachments.isNotEmpty ?? false) ...[ if (workOrder.workOrderAttachments.isNotEmpty ?? false) ...[
8.height, 8.height,
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
FilesList(images: workOrder.workOrderAttachments), FilesList(images: workOrder.workOrderAttachments.map((toElement) => URLs.getFileUrl(toElement.name!)!).toList()),
], ],
if (workOrder.voiceNote?.isNotEmpty ?? false) ...[ if (workOrder.voiceNote?.isNotEmpty ?? false) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
16.height, 16.height,
ASoundPlayer(audio: workOrder.voiceNote!), ASoundPlayer(audio: URLs.getFileUrl(workOrder.voiceNote!)!),
8.height, 8.height,
], ],
], ],

@ -4,11 +4,11 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/device/asset.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';
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/device/asset.dart';
import 'package:test_sa/models/fault_description.dart'; import 'package:test_sa/models/fault_description.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart';
import 'package:test_sa/models/new_models/work_order_detail_model.dart'; import 'package:test_sa/models/new_models/work_order_detail_model.dart';
@ -24,6 +24,7 @@ import 'package:test_sa/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/equipment/pick_asset.dart'; import 'package:test_sa/views/widgets/equipment/pick_asset.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import '../../../../../../models/lookup.dart'; import '../../../../../../models/lookup.dart';
import '../../../../../../new_views/common_widgets/default_app_bar.dart'; import '../../../../../../new_views/common_widgets/default_app_bar.dart';
@ -69,7 +70,7 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
_loanAvailabilityProvider = Provider.of<LoanAvailabilityProvider>(context, listen: false); _loanAvailabilityProvider = Provider.of<LoanAvailabilityProvider>(context, listen: false);
_equipmentStatusProvider = Provider.of<EquipmentStatusProvider>(context, listen: false); _equipmentStatusProvider = Provider.of<EquipmentStatusProvider>(context, listen: false);
_reasonProvider?.serviceRequestId = _requestDetailProvider?.currentWorkOrder!.data!.requestId.toString(); _reasonProvider?.serviceRequestId = _requestDetailProvider?.currentWorkOrder!.data!.requestId.toString();
_faults = await Provider.of<FaultDescriptionProvider>(context,listen: false).getFaultDescriptionList(assetId: _requestDetailProvider?.currentWorkOrder?.data?.asset?.id); _faults = await Provider.of<FaultDescriptionProvider>(context, listen: false).getFaultDescriptionList(assetId: _requestDetailProvider?.currentWorkOrder?.data?.asset?.id);
_reasonProvider?.getDate(); _reasonProvider?.getDate();
_equipmentStatusProvider?.getDate(); _equipmentStatusProvider?.getDate();
_loanAvailabilityProvider?.getDate(); _loanAvailabilityProvider?.getDate();
@ -144,12 +145,13 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
}); });
}, },
), ),
8.height, 12.height,
SingleItemDropDownMenu<Lookup, LoanAvailabilityProvider>( SingleItemDropDownMenu<Lookup, LoanAvailabilityProvider>(
context: context, context: context,
title: context.translation.loanAvailability, title: context.translation.loanAvailability,
backgroundColor: AppColor.neutral100, backgroundColor: AppColor.neutral100,
height: 56.toScreenHeight, height: 56.toScreenHeight,
showShadow: false,
initialValue: requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAvailability, initialValue: requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAvailability,
onSelect: (status) { onSelect: (status) {
if (status != null) { if (status != null) {
@ -174,7 +176,7 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
}); });
}, },
), ),
8.height, 12.height,
SingleItemDropDownMenu<Lookup, ReasonProvider>( SingleItemDropDownMenu<Lookup, ReasonProvider>(
context: context, context: context,
title: context.translation.failureReason, title: context.translation.failureReason,
@ -188,27 +190,27 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
} }
}, },
), ),
8.height, 12.height,
SingleItemDropDownMenu<FaultDescription, NullableLoadingProvider>( SingleItemDropDownMenu<FaultDescription, NullableLoadingProvider>(
context: context, context: context,
title: context.translation.faultDescription, title: context.translation.faultDescription,
backgroundColor: AppColor.neutral100, backgroundColor: AppColor.neutral100,
staticData: _faults, staticData: _faults,
showShadow: true, showShadow: false,
initialValue: requestDetailProvider.engineerUpdateWorkOrderHelperModel?.faultDescription, initialValue: requestDetailProvider.engineerUpdateWorkOrderHelperModel?.faultDescription,
onSelect: (fault) { onSelect: (fault) {
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.faultDescription = fault; requestDetailProvider.engineerUpdateWorkOrderHelperModel?.faultDescription = fault;
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.solution = fault?.workPerformed; requestDetailProvider.engineerUpdateWorkOrderHelperModel?.solution = fault?.workPerformed;
if(mounted){ if (mounted) {
requestDetailProvider.updateEngineerUpdateWorkOrderHelperModel(requestDetailProvider.engineerUpdateWorkOrderHelperModel); requestDetailProvider.updateEngineerUpdateWorkOrderHelperModel(requestDetailProvider.engineerUpdateWorkOrderHelperModel);
} }
}, },
), ),
11.height, 12.height,
context.translation.solutions.heading6(context).custom(color: AppColor.neutral50), context.translation.solutions.heading6(context).custom(color: AppColor.neutral50),
11.height, 8.height,
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.solution != null requestDetailProvider.engineerUpdateWorkOrderHelperModel?.solution != null
? requestDetailProvider.engineerUpdateWorkOrderHelperModel!.solution!.heading6(context).custom(color: AppColor.neutral50) ? requestDetailProvider.engineerUpdateWorkOrderHelperModel!.solution!.bodyText2(context).custom(color: AppColor.neutral120)
: const SizedBox(), : const SizedBox(),
], ],
).paddingOnly(start: 13, end: 13, top: 16, bottom: 16), ).paddingOnly(start: 13, end: 13, top: 16, bottom: 16),

@ -17,7 +17,6 @@ import 'package:test_sa/providers/loading_list_notifier.dart';
import 'package:test_sa/service_request_latest/request_detail_provider.dart'; import 'package:test_sa/service_request_latest/request_detail_provider.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/views/widgets/images/new_multi_image_picker.dart'; import 'package:test_sa/views/widgets/images/new_multi_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import '../../../../../../models/service_request/spare_parts.dart'; import '../../../../../../models/service_request/spare_parts.dart';
import '../../../../../../new_views/common_widgets/app_text_form_field.dart'; import '../../../../../../new_views/common_widgets/app_text_form_field.dart';
@ -104,142 +103,135 @@ class _SparePartRequestState extends State<SparePartRequest> with TickerProvider
appBar: DefaultAppBar(title: context.translation.sparePartRequest), appBar: DefaultAppBar(title: context.translation.sparePartRequest),
body: Consumer<RequestDetailProvider>(builder: (context, RequestDetailProvider requestDetailProvider, child) { body: Consumer<RequestDetailProvider>(builder: (context, RequestDetailProvider requestDetailProvider, child) {
return SafeArea( return SafeArea(
child: LoadingManager(
isLoading: _isLoading,
isFailedLoading: false,
stateCode: 200,
onRefresh: () async {},
child: Form( child: Form(
key: _formKey, key: _formKey,
child: Column( child: Column(
children: [ children: [
SingleChildScrollView( SingleChildScrollView(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
Card( Card(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
context.translation.sparePartDetails.heading5(context), context.translation.sparePartDetails.heading5(context),
12.height, 12.height,
SingleItemDropDownMenu<SparePart, NullableLoadingProvider>( SingleItemDropDownMenu<SparePart, NullableLoadingProvider>(
context: context, context: context,
title: context.translation.partNo, title: context.translation.partNo,
staticData: _spareParts, staticData: _spareParts,
showShadow: false, showShadow: false,loading: _isLoading,
initialValue: requestDetailProvider.sparePartHelperModel?.sparePart, initialValue: requestDetailProvider.sparePartHelperModel?.sparePart,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
onSelect: (part) { onSelect: (part) {
if (part != null) { if (part != null) {
requestDetailProvider.sparePartHelperModel?.sparePart = part; requestDetailProvider.sparePartHelperModel?.sparePart = part;
_oracleNoController.text = part.oracleCode ?? ''; _oracleNoController.text = part.oracleCode ?? '';
requestDetailProvider.updateSparePartHelperModel(_requestDetailProvider?.sparePartHelperModel); requestDetailProvider.updateSparePartHelperModel(_requestDetailProvider?.sparePartHelperModel);
} }
}, },
), ),
12.height, 12.height,
AppTextFormField( AppTextFormField(
controller: _partQtyController, controller: _partQtyController,
labelText: context.translation.quantity, labelText: context.translation.quantity,
textInputType: TextInputType.number, textInputType: TextInputType.number,
labelStyle: AppTextStyles.textFieldLabelStyle, labelStyle: AppTextStyles.textFieldLabelStyle,
showWithoutDecoration: true, showWithoutDecoration: true,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
enable: requestDetailProvider.sparePartHelperModel?.sparePart?.id != null, enable: requestDetailProvider.sparePartHelperModel?.sparePart?.id != null,
validator: (value) => value == null || value.isEmpty validator: (value) => value == null || value.isEmpty
? context.translation.requiredField ? context.translation.requiredField
: Validator.isNumeric(value) : Validator.isNumeric(value)
? null ? null
: context.translation.onlyNumbers, : context.translation.onlyNumbers,
onChange: (value) { onChange: (value) {
requestDetailProvider.sparePartHelperModel?.quantity = num.tryParse(value ?? ""); requestDetailProvider.sparePartHelperModel?.quantity = num.tryParse(value ?? "");
}, },
onSaved: (text) { onSaved: (text) {
requestDetailProvider.sparePartHelperModel?.quantity = num.tryParse(text ?? ""); requestDetailProvider.sparePartHelperModel?.quantity = num.tryParse(text ?? "");
}, },
), ),
12.height, 12.height,
AppTextFormField( AppTextFormField(
labelStyle: AppTextStyles.textFieldLabelStyle, labelStyle: AppTextStyles.textFieldLabelStyle,
controller: _oracleNoController, controller: _oracleNoController,
labelText: context.translation.oracleNo, labelText: context.translation.oracleNo,
textInputType: TextInputType.number, textInputType: TextInputType.number,
showWithoutDecoration: true, showWithoutDecoration: true,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
enable: false, enable: false,
), ),
12.height, 12.height,
AppTextFormField( AppTextFormField(
initialValue: requestDetailProvider.sparePartHelperModel?.comment, initialValue: requestDetailProvider.sparePartHelperModel?.comment,
labelStyle: AppTextStyles.textFieldLabelStyle, labelStyle: AppTextStyles.textFieldLabelStyle,
controller: _descriptionController, controller: _descriptionController,
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
labelText: context.translation.description, labelText: context.translation.description,
alignLabelWithHint: true, alignLabelWithHint: true,
showWithoutDecoration: true, showWithoutDecoration: true,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
onChange: (value) { onChange: (value) {
requestDetailProvider.sparePartHelperModel?.comment = value; requestDetailProvider.sparePartHelperModel?.comment = value;
}, },
onSaved: (value) { onSaved: (value) {
requestDetailProvider.sparePartHelperModel?.comment = value; requestDetailProvider.sparePartHelperModel?.comment = value;
}, },
), ),
12.height, 12.height,
NewMultiFilesPicker( NewMultiFilesPicker(
label: context.translation.attachQuotation, label: context.translation.attachQuotation,
files: _files, files: _files,
buttonIcon: 'quotation_icon'.toSvgAsset(), buttonIcon: 'quotation_icon'.toSvgAsset(),
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
onChange: (List<MultiFilesPickerModel> list) { onChange: (List<MultiFilesPickerModel> list) {
for (var element in list) {
print('path is ${element.file.path}'); for (var element in list) {
} print('path is ${element.file.path}');
}, }
), },
], ),
).paddingAll(16), ],
), ).paddingAll(16),
8.height,
],
), ),
).paddingAll(12).expanded, 8.height,
FooterActionButton.footerContainer( ],
child: AppFilledButton( ),
label: _requestDetailProvider?.sparePartHelperModel?.id == 0 ? context.translation.addSparePartActivity : context.translation.updateSparePartActivity, ).paddingAll(12).expanded,
buttonColor: AppColor.green70, FooterActionButton.footerContainer(
onPressed: () async { child: AppFilledButton(
requestDetailProvider.sparePartHelperModel?.sparePartAttachments?.clear(); label: _requestDetailProvider?.sparePartHelperModel?.id == 0 ? context.translation.addSparePartActivity : context.translation.updateSparePartActivity,
for (var pickerObject in _files) { buttonColor: AppColor.green70,
String fileData = _isLocalUrl(pickerObject.file.path) onPressed: () async {
? ("${pickerObject.file.path.split("/").last}|${base64Encode(File(pickerObject.file.path).readAsBytesSync())}") requestDetailProvider.sparePartHelperModel?.sparePartAttachments?.clear();
: pickerObject.file.path; for (var pickerObject in _files) {
requestDetailProvider.sparePartHelperModel?.sparePartAttachments?.add(SparePartAttachments(id: pickerObject.id, name: fileData)); String fileData =
} _isLocalUrl(pickerObject.file.path) ? ("${pickerObject.file.path.split("/").last}|${base64Encode(File(pickerObject.file.path).readAsBytesSync())}") : pickerObject.file.path;
requestDetailProvider.sparePartHelperModel?.sparePartAttachments?.add(SparePartAttachments(id: pickerObject.id, name: fileData));
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); }
int status = -1;
if (_requestDetailProvider?.sparePartHelperModel?.id == 0) { showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
status = await requestDetailProvider.createActivitySparePart(); int status = -1;
} else { if (_requestDetailProvider?.sparePartHelperModel?.id == 0) {
status = await requestDetailProvider.updateActivitySparePart(); status = await requestDetailProvider.createActivitySparePart();
} } else {
if (status == 200) { status = await requestDetailProvider.updateActivitySparePart();
await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!); }
//this is for hide the dialoge... if (status == 200) {
Navigator.pop(context); await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
Navigator.pop(context); //this is for hide the dialoge...
} else { Navigator.pop(context);
Navigator.pop(context); Navigator.pop(context);
} } else {
}, Navigator.pop(context);
)), }
], },
), )),
), ],
), ),
); ));
}), }),
); );
} }

@ -18,7 +18,7 @@ class FilesList extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GridView.builder( return GridView.builder(
padding: const EdgeInsets.only(top: 16, bottom: 16), padding: const EdgeInsets.only(top: 8, bottom: 8),
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 6, mainAxisSpacing: 8, crossAxisSpacing: 8), gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 6, mainAxisSpacing: 8, crossAxisSpacing: 8),

Loading…
Cancel
Save