diff --git a/lib/models/new_models/work_order_detail_model.dart b/lib/models/new_models/work_order_detail_model.dart index 5653322c..877701d8 100644 --- a/lib/models/new_models/work_order_detail_model.dart +++ b/lib/models/new_models/work_order_detail_model.dart @@ -30,8 +30,7 @@ class WorkOrderDetail { ); } - Map toJson() => - { + Map toJson() => { "data": data?.toJson(), "message": message, "title": title, @@ -86,48 +85,49 @@ class WorkOrderData { required this.activities, required this.activityAssetToBeRetireds, }); + int? requestId; - String? workOrderNo; - WorkOrderAssignedEmployee? workOrderCreatedBy; - DateTime? requestedDate; + String? workOrderNo; + WorkOrderAssignedEmployee? workOrderCreatedBy; + DateTime? requestedDate; WorkOrderAsset? asset; - Lookup? assetGroup; - Lookup? manufacturer; - Lookup? model; - Lookup? assetNdModel; - Site? site; - Lookup? building; - Lookup? floor; - AssetGroup? department; - int? room; - Lookup? assetType; - WorkOrderAssignedEmployee? assignedEmployee; - String? lastActivityStatus; - Lookup? status; - Lookup? nextStep; - int? assetVerificationType; - List workOrderContactPerson; - Lookup? equipmentStatus; - Lookup? priority; - Lookup? requestedThrough; - Lookup? typeofRequest; - Lookup? loanAvailablity; - Lookup? assetLoan; - Lookup? safety; - Lookup? problemDescription; - String? comments; - String? voiceNote; - List workOrderAttachments; - String? returnToService; - Lookup? serviceType; - Lookup? failureReasone; - Lookup? solution; - String? totalWorkingHours; + Lookup? assetGroup; + Lookup? manufacturer; + Lookup? model; + Lookup? assetNdModel; + Site? site; + Lookup? building; + Lookup? floor; + AssetGroup? department; + int? room; + Lookup? assetType; + WorkOrderAssignedEmployee? assignedEmployee; + String? lastActivityStatus; + Lookup? status; + Lookup? nextStep; + int? assetVerificationType; + List workOrderContactPerson; + Lookup? equipmentStatus; + Lookup? priority; + Lookup? requestedThrough; + Lookup? typeofRequest; + Lookup? loanAvailablity; + Lookup? assetLoan; + Lookup? safety; + Lookup? problemDescription; + String? comments; + String? voiceNote; + List workOrderAttachments; + String? returnToService; + Lookup? serviceType; + Lookup? failureReasone; + Lookup? solution; + String? totalWorkingHours; DateTime? needAVisitDateTime; - String?needAVisitComment; - List workOrderHistory; - List activities; - List activityAssetToBeRetireds; + String? needAVisitComment; + List workOrderHistory; + List activities; + List activityAssetToBeRetireds; factory WorkOrderData.fromJson(Map json) { return WorkOrderData( @@ -162,7 +162,7 @@ class WorkOrderData { problemDescription: json["problemDescription"] == null ? null : Lookup.fromJson(json["problemDescription"]), comments: json["comments"], voiceNote: json["voiceNote"], - workOrderAttachments: json["workOrderAttachments"] == null ? [] : List.from(json['workOrderAttachments']).map((e)=>WorkOrderAttachments.fromJson(e)).toList(), + workOrderAttachments: json["workOrderAttachments"] == null ? [] : List.from(json['workOrderAttachments']).map((e) => WorkOrderAttachments.fromJson(e)).toList(), returnToService: json["returnToService"], serviceType: json["serviceType"] == null ? null : Lookup.fromJson(json["serviceType"]), failureReasone: json["failureReasone"] == null ? null : Lookup.fromJson(json["failureReasone"]), @@ -176,8 +176,7 @@ class WorkOrderData { ); } - Map toJson() => - { + Map toJson() => { "id": requestId, "workOrderNo": workOrderNo, "workOrderCreatedBy": workOrderCreatedBy?.toJson(), @@ -210,7 +209,7 @@ class WorkOrderData { "problemDescription": problemDescription?.toJson(), "comments": comments, "voiceNote": voiceNote, - "workOrderAttachments": workOrderAttachments.map((e)=>e.toJson()).toList(), + "workOrderAttachments": workOrderAttachments.map((e) => e.toJson()).toList(), "returnToService": returnToService, "serviceType": serviceType?.toJson(), "failureReasone": failureReasone?.toJson(), @@ -220,22 +219,33 @@ class WorkOrderData { "activities": activities.map((x) => x.toJson()).toList(), "activityAssetToBeRetireds": activityAssetToBeRetireds.map((x) => x).toList(), }; + Map toFixRemotelyJson() { - return {'workOrderId': workOrderNo, 'startDate': workOrderHistory.isNotEmpty? workOrderHistory[0].fixRemotlyStartTime:'', 'endDate': workOrderHistory.isNotEmpty? workOrderHistory[0].fixRemotlyEndTime:'', 'workingHour':'', 'comment': comments}; + return { + 'workOrderId': workOrderNo, + 'startDate': workOrderHistory.isNotEmpty ? workOrderHistory[0].fixRemotlyStartTime : '', + 'endDate': workOrderHistory.isNotEmpty ? workOrderHistory[0].fixRemotlyEndTime : '', + 'workingHour': '', + 'comment': comments + }; } + //TODO feedback not defined... Map toMarkAsFixedJson() { return {'workOrderId': workOrderNo, 'feedback': comments}; } + Map toNeedVisitJson() { - return {'workOrderId': workOrderNo, 'visitDate': workOrderHistory.isNotEmpty? workOrderHistory[0].needAVisitDateTime:'', 'comment': comments}; + return {'workOrderId': workOrderNo, 'visitDate': workOrderHistory.isNotEmpty ? workOrderHistory[0].needAVisitDateTime : '', 'comment': comments}; } + //TODO signatureNurse not defined... Map toNurseActionJson() { return {'workOrderId': workOrderNo, 'feedback': '', 'signatureNurse': 'signatureNurse'}; } + Map toWorkOrderJson() { - final Map data = {}; + final Map data = {}; data['workOrderId'] = requestId; data['equipmentStatusId'] = equipmentStatus?.id; data['returnToService'] = returnToService; @@ -255,8 +265,8 @@ class WorkOrderAsset { required this.assetNumber, }); - int? id; - String? assetNumber; + int? id; + String? assetNumber; factory WorkOrderAsset.fromJson(Map json) { return WorkOrderAsset( @@ -265,8 +275,7 @@ class WorkOrderAsset { ); } - Map toJson() => - { + Map toJson() => { "id": id, "assetNumber": assetNumber, }; @@ -278,8 +287,8 @@ class AssetGroup { required this.name, }); - int? id; - String? name; + int? id; + String? name; factory AssetGroup.fromJson(Map json) { return AssetGroup( @@ -288,8 +297,7 @@ class AssetGroup { ); } - Map toJson() => - { + Map toJson() => { "id": id, "name": name, }; @@ -303,10 +311,10 @@ class WorkOrderAssignedEmployee { required this.languageId, }); - dynamic userId; - String? userName; - String? email; - int? languageId; + dynamic userId; + String? userName; + String? email; + int? languageId; factory WorkOrderAssignedEmployee.fromJson(Map json) { return WorkOrderAssignedEmployee( @@ -317,48 +325,36 @@ class WorkOrderAssignedEmployee { ); } - Map toJson() => - { + Map toJson() => { "userId": userId, "userName": userName, "email": email, "languageId": languageId, }; } + class Activities { int? id; int? orderNo; ActivityStatus? activityStatus; ActivityMaintenance? activityMaintenance; ActivitySparePart? activitySparePart; - String ?activityType; + String? activityType; - Activities( - {this.id, - this.orderNo, - this.activityStatus, - this.activityMaintenance, - this.activityType, - this.activitySparePart}); + Activities({this.id, this.orderNo, this.activityStatus, this.activityMaintenance, this.activityType, this.activitySparePart}); Activities.fromJson(Map json) { id = json['id']; orderNo = json['orderNo']; - activityStatus = json['activityStatus'] != null - ? ActivityStatus.fromJson(json['activityStatus']) - : null; - activityMaintenance = json['activityMaintenance'] != null - ? ActivityMaintenance.fromJson(json['activityMaintenance']) - : null; - if(activityMaintenance!=null){ - activityType='Maintenance Request'; + activityStatus = json['activityStatus'] != null ? ActivityStatus.fromJson(json['activityStatus']) : null; + activityMaintenance = json['activityMaintenance'] != null ? ActivityMaintenance.fromJson(json['activityMaintenance']) : null; + if (activityMaintenance != null) { + activityType = 'Maintenance Request'; } - activitySparePart = json['activitySparePart'] != null - ? ActivitySparePart.fromJson(json['activitySparePart']) - : null; - if(activitySparePart!=null){ - activityType='Spare Part Request'; + activitySparePart = json['activitySparePart'] != null ? ActivitySparePart.fromJson(json['activitySparePart']) : null; + if (activitySparePart != null) { + activityType = 'Spare Part Request'; } } @@ -408,18 +404,11 @@ class ActivitySparePart { String? comment; List? acitiySparePartAttachments; - ActivitySparePart( - {this.id, - this.partCatalogItem, - this.quantity, - this.comment, - this.acitiySparePartAttachments}); + ActivitySparePart({this.id, this.partCatalogItem, this.quantity, this.comment, this.acitiySparePartAttachments}); ActivitySparePart.fromJson(Map json) { id = json['id']; - partCatalogItem = json['partCatalogItem'] != null - ? new PartCatalogItem.fromJson(json['partCatalogItem']) - : null; + partCatalogItem = json['partCatalogItem'] != null ? new PartCatalogItem.fromJson(json['partCatalogItem']) : null; quantity = json['quantity']; comment = json['comment']; if (json['acitiySparePartAttachments'] != null) { @@ -439,8 +428,7 @@ class ActivitySparePart { data['quantity'] = quantity; data['comment'] = comment; if (acitiySparePartAttachments != null) { - data['acitiySparePartAttachments'] = - acitiySparePartAttachments!.map((v) => v.toJson()).toList(); + data['acitiySparePartAttachments'] = acitiySparePartAttachments!.map((v) => v.toJson()).toList(); } return data; } @@ -468,15 +456,14 @@ class PartCatalogItem { } } - class Site { Site({ required this.id, required this.siteName, }); - int? id; - String? siteName; + int? id; + String? siteName; factory Site.fromJson(Map json) { return Site( @@ -485,8 +472,7 @@ class Site { ); } - Map toJson() => - { + Map toJson() => { "id": id, "siteName": siteName, }; @@ -504,14 +490,14 @@ class WorkOrderContactPerson { required this.contactUser, }); - int? id; - String? name; - String? employeeId; - String? position; - dynamic extension; - String? email; - dynamic mobilePhone; - WorkOrderAssignedEmployee? contactUser; + int? id; + String? name; + String? employeeId; + String? position; + dynamic extension; + String? email; + dynamic mobilePhone; + WorkOrderAssignedEmployee? contactUser; factory WorkOrderContactPerson.fromJson(Map json) { return WorkOrderContactPerson( @@ -526,8 +512,7 @@ class WorkOrderContactPerson { ); } - Map toJson() => - { + Map toJson() => { "id": id, "name": name, "employeeId": employeeId, @@ -554,17 +539,17 @@ class WorkOrderHistory { required this.needAVisitDateTime, }); - int? id; - Lookup? workorderStatus; - dynamic activityStatus; - DateTime? date; - WorkOrderAssignedEmployee? user; - Lookup? step; - DateTime? fixRemotlyStartTime; - DateTime? fixRemotlyEndTime; - num? fixRemotlyWorkingHours; - String? comments; - DateTime? needAVisitDateTime; + int? id; + Lookup? workorderStatus; + dynamic activityStatus; + DateTime? date; + WorkOrderAssignedEmployee? user; + Lookup? step; + DateTime? fixRemotlyStartTime; + DateTime? fixRemotlyEndTime; + num? fixRemotlyWorkingHours; + String? comments; + DateTime? needAVisitDateTime; factory WorkOrderHistory.fromJson(Map json) { return WorkOrderHistory( @@ -582,8 +567,7 @@ class WorkOrderHistory { ); } - Map toJson() => - { + Map toJson() => { "id": id, "workorderStatus": workorderStatus?.toJson(), "activityStatus": activityStatus, @@ -597,9 +581,11 @@ class WorkOrderHistory { "needAVisitDateTime": needAVisitDateTime?.toIso8601String(), }; } + class ActivityMaintenance { int? id; int? activityStatus; + Lookup? lastSituation; String? startTime; String? endTime; double? workingHours; @@ -616,20 +602,21 @@ class ActivityMaintenance { ActivityMaintenance( {this.id, - this.activityStatus, - this.startTime, - this.endTime, - this.workingHours, - this.travelHours, - this.repairLocation, - this.assignedEmployee, - this.technicalComment, - this.supplier, - this.supplierEngineer, - this.supplierStartTime, - this.supplierEndTime, - this.supplierWorkingHours, - this.assistantEmployees}); + this.activityStatus, + this.lastSituation, + this.startTime, + this.endTime, + this.workingHours, + this.travelHours, + this.repairLocation, + this.assignedEmployee, + this.technicalComment, + this.supplier, + this.supplierEngineer, + this.supplierStartTime, + this.supplierEndTime, + this.supplierWorkingHours, + this.assistantEmployees}); ActivityMaintenance.fromJson(Map json) { id = json['id']; @@ -638,12 +625,9 @@ class ActivityMaintenance { endTime = json['endTime']; workingHours = json['workingHours']; travelHours = json['travelHours']; - repairLocation = json['repairLocation'] != null - ? RepairLocation.fromJson(json['repairLocation']) - : null; - assignedEmployee = json['assignedEmployee'] != null - ? AssignedEmployee.fromJson(json['assignedEmployee']) - : null; + repairLocation = json['repairLocation'] != null ? RepairLocation.fromJson(json['repairLocation']) : null; + lastSituation = json['lastSituation'] != null ? Lookup.fromJson(json['lastSituation']) : null; + assignedEmployee = json['assignedEmployee'] != null ? AssignedEmployee.fromJson(json['assignedEmployee']) : null; technicalComment = json['technicalComment']; supplier = json['supplier']; supplierEngineer = json['supplierEngineer']; @@ -653,7 +637,7 @@ class ActivityMaintenance { if (json['assistantEmployees'] != null) { assistantEmployees = []; json['assistantEmployees'].forEach((v) { - assistantEmployees!.add( ActivityMaintenanceAssistantEmployees.fromJson(v)); + assistantEmployees!.add(ActivityMaintenanceAssistantEmployees.fromJson(v)); }); } } @@ -672,6 +656,7 @@ class ActivityMaintenance { if (assignedEmployee != null) { data['assignedEmployee'] = assignedEmployee!.toJson(); } + data["lastSituation"] = lastSituation?.toJson(); data['technicalComment'] = technicalComment; data['supplier'] = supplier; data['supplierEngineer'] = supplierEngineer; @@ -679,8 +664,7 @@ class ActivityMaintenance { data['supplierEndTime'] = supplierEndTime; data['supplierWorkingHours'] = supplierWorkingHours; if (assistantEmployees != null) { - data['assistantEmployees'] = - assistantEmployees!.map((v) => v.toJson()).toList(); + data['assistantEmployees'] = assistantEmployees!.map((v) => v.toJson()).toList(); } return data; } @@ -740,21 +724,14 @@ class ActivityMaintenanceAssistantEmployees { String? technicalComment; AssignedEmployee? user; - ActivityMaintenanceAssistantEmployees( - {this.startDate, - this.endDate, - this.workingHours, - this.technicalComment, - this.user}); + ActivityMaintenanceAssistantEmployees({this.startDate, this.endDate, this.workingHours, this.technicalComment, this.user}); ActivityMaintenanceAssistantEmployees.fromJson(Map json) { startDate = json['startDate']; endDate = json['endDate']; workingHours = json['workingHours']; technicalComment = json['technicalComment']; - user = json['user'] != null - ? new AssignedEmployee.fromJson(json['user']) - : null; + user = json['user'] != null ? new AssignedEmployee.fromJson(json['user']) : null; } Map toJson() { @@ -769,4 +746,3 @@ class ActivityMaintenanceAssistantEmployees { return data; } } - diff --git a/lib/service_request_latest/views/components/action_button/footer_action_button.dart b/lib/service_request_latest/views/components/action_button/footer_action_button.dart index 225850ea..46a9e1a1 100644 --- a/lib/service_request_latest/views/components/action_button/footer_action_button.dart +++ b/lib/service_request_latest/views/components/action_button/footer_action_button.dart @@ -1,24 +1,20 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; -import 'package:test_sa/main.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/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/providers/service_request_providers/reject_reason_provider.dart'; -import 'package:test_sa/providers/work_order/reason_provider.dart'; import 'package:test_sa/service_request_latest/request_detail_provider.dart'; import 'package:test_sa/service_request_latest/views/components/activities_list_view.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/verify_arrival_view.dart'; import 'package:test_sa/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart'; -import 'package:test_sa/service_request_latest/views/forms/maintenance_request/maintenance_request_main.dart'; class FooterActionButton { static Widget footerContainer({required Widget child}) { @@ -146,7 +142,7 @@ class FooterActionButton { buttonColor: AppColor.neutral50, onPressed: () async { // ServiceRequestBottomSheet.activityTypeBottomSheet(context: context); - Navigator.push(context, MaterialPageRoute(builder: (context)=>const ActivitiesListView())); + Navigator.push(context, MaterialPageRoute(builder: (context) => const ActivitiesListView())); }, ), 8.height, diff --git a/lib/service_request_latest/views/components/activities_list_view.dart b/lib/service_request_latest/views/components/activities_list_view.dart index 967a5554..ff5924c9 100644 --- a/lib/service_request_latest/views/components/activities_list_view.dart +++ b/lib/service_request_latest/views/components/activities_list_view.dart @@ -4,6 +4,7 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/enums/user_types.dart'; @@ -23,44 +24,108 @@ import 'package:test_sa/views/widgets/images/files_list.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; -class ActivitiesListView extends StatelessWidget { +class ActivitiesListView extends StatefulWidget { static const String id = "/activities-list"; const ActivitiesListView({Key? key}) : super(key: key); + @override + _ActivitiesListViewState createState() { + return _ActivitiesListViewState(); + } +} + +class _ActivitiesListViewState extends State { + bool showReorderView = false; + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + List reOrderActivities = []; + @override Widget build(BuildContext context) { //TODO add the check for type of activity after completing maintenance activity flow. List activities = []; UserProvider userProvider = Provider.of(context); return Scaffold( - appBar: DefaultAppBar(title: context.translation.activities), + appBar: DefaultAppBar( + title: context.translation.activities, + actions: [if (!showReorderView) IconButton(onPressed: () => setState(() => showReorderView = true), icon: const Icon(Icons.reorder_rounded))], + ), //backgroundColor: const Color(0xfff8f9fb), body: Consumer(builder: (context, RequestDetailProvider requestDetailProvider, child) { - activities = requestDetailProvider.currentWorkOrder!.data!.activities; + if (showReorderView && reOrderActivities.isEmpty) { + reOrderActivities = requestDetailProvider.currentWorkOrder!.data!.activities; + } else { + activities = requestDetailProvider.currentWorkOrder!.data!.activities; + } + return Column( children: [ - (activities.isEmpty) + (activities.isEmpty && reOrderActivities.isEmpty) ? NoDataFound(message: context.translation.noDataFound).expanded - : ListView.separated( - padding: const EdgeInsets.all(16), - itemCount: activities.length, - separatorBuilder: (czt, index) => 16.height, - itemBuilder: (context, index) { - if (activities[index].activityMaintenance != null) { - return maintenanceActivityCard(requestDetailProvider: requestDetailProvider, userProvider: userProvider, context: context, activity: activities[index]); - } - return sparePartActivityCard(requestDetailProvider: requestDetailProvider, userProvider: userProvider, context: context, activity: activities[index]); - }, - ).expanded, + : showReorderView + ? ReorderableListView( + padding: const EdgeInsets.all(16), + children: [ + for (int index = 0; index < reOrderActivities.length; index++) + if (reOrderActivities[index].activityMaintenance != null) + ReorderWidget( + key: ValueKey(index), + child: maintenanceActivityCard(requestDetailProvider: requestDetailProvider, userProvider: userProvider, context: context, activity: reOrderActivities[index]) + .paddingOnly(top: 8, bottom: 8), + ) + else + ReorderWidget( + key: ValueKey(index), + child: sparePartActivityCard(requestDetailProvider: requestDetailProvider, userProvider: userProvider, context: context, activity: reOrderActivities[index]) + .paddingOnly(top: 8, bottom: 8), + ) + ], + onReorder: (oldIndex, newIndex) { + setState(() { + if (oldIndex < newIndex) { + newIndex -= 1; + } + final Activities item = reOrderActivities.removeAt(oldIndex); + reOrderActivities.insert(newIndex, item); + }); + }).expanded + : ListView.separated( + padding: const EdgeInsets.all(16), + itemCount: activities.length, + separatorBuilder: (czt, index) => 16.height, + itemBuilder: (context, index) { + if (activities[index].activityMaintenance != null) { + return maintenanceActivityCard(requestDetailProvider: requestDetailProvider, userProvider: userProvider, context: context, activity: activities[index]) + .paddingOnly(top: 8, bottom: 8); + } + return sparePartActivityCard(requestDetailProvider: requestDetailProvider, userProvider: userProvider, context: context, activity: activities[index]); + }, + ).expanded, if (userProvider.user!.type == UsersTypes.engineer && (requestDetailProvider.currentWorkOrder?.data?.status?.value != 5 && requestDetailProvider.currentWorkOrder?.data?.status?.value != 3)) FooterActionButton.footerContainer( child: AppFilledButton( - label: context.translation.createNewActivity, + label: showReorderView ? "Confirm Order".addTranslation : context.translation.createNewActivity, maxWidth: true, buttonColor: AppColor.primary10, onPressed: () async { + if (showReorderView) { + requestDetailProvider.currentWorkOrder!.data!.activities = reOrderActivities; + reOrderActivities = []; + showReorderView = false; + setState(() {}); + return; + } ServiceRequestBottomSheet.activityTypeBottomSheet(context: context); }, )) @@ -235,7 +300,7 @@ class ActivitiesListView extends StatelessWidget { ), 3.height, Text( - '${context.translation.partName}: ${activity.activitySparePart?.partCatalogItem?.partName}', + '${context.translation.callLastSituation}: ${activity.activityMaintenance?.lastSituation?.name}', style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120), ), 2.height, @@ -272,3 +337,18 @@ class ActivitiesListView extends StatelessWidget { }); } } + +class ReorderWidget extends StatelessWidget { + final Widget child; + final Key key; + + const ReorderWidget({required this.key, required this.child}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + key: key, + child: child, + ); + } +}