diff --git a/lib/models/new_models/work_order_detail_model.dart b/lib/models/new_models/work_order_detail_model.dart index 246c279a..04182013 100644 --- a/lib/models/new_models/work_order_detail_model.dart +++ b/lib/models/new_models/work_order_detail_model.dart @@ -86,6 +86,7 @@ class WorkOrderData { required this.activities, required this.activityAssetToBeRetireds, }); + int? requestId; String? workOrderNo; WorkOrderAssignedEmployee? workOrderCreatedBy; @@ -331,7 +332,7 @@ class Activities { Lookup? activityStatus; ActivityMaintenance? activityMaintenance; ActivitySparePart? activitySparePart; - String ?activityType; + String? activityType; Activities( {this.id, @@ -601,6 +602,7 @@ class ActivityMaintenance { int? id; ActivityStatus? activityStatus; String? startTime; + Lookup? lastSituation; String? endTime; double? workingHours; double? travelHours; @@ -616,20 +618,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) { print('activity status i got is ${json['activityStatus']}'); @@ -641,6 +644,7 @@ class ActivityMaintenance { endTime = json['endTime']; workingHours = json['workingHours']; travelHours = json['travelHours']; + lastSituation = json['lastSituation'] != null ? Lookup.fromJson(json['lastSituation']) : null; repairLocation = json['repairLocation'] != null ? Lookup.fromJson(json['repairLocation']) : null; @@ -691,7 +695,6 @@ class ActivityMaintenance { } } - class RepairLocation { int? id; String? name; 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 53d64787..7efd0d26 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'; @@ -27,44 +28,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); }, )) @@ -220,7 +285,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, @@ -317,3 +382,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, + ); + } +}