reorder activities added.

design_3.0_latest
Sikander Saleem 1 year ago
parent 71d4ba43de
commit 298a102f67

@ -30,8 +30,7 @@ class WorkOrderDetail {
);
}
Map<String, dynamic> toJson() =>
{
Map<String, dynamic> toJson() => {
"data": data?.toJson(),
"message": message,
"title": title,
@ -86,6 +85,7 @@ class WorkOrderData {
required this.activities,
required this.activityAssetToBeRetireds,
});
int? requestId;
String? workOrderNo;
WorkOrderAssignedEmployee? workOrderCreatedBy;
@ -176,8 +176,7 @@ class WorkOrderData {
);
}
Map<String, dynamic> toJson() =>
{
Map<String, dynamic> toJson() => {
"id": requestId,
"workOrderNo": workOrderNo,
"workOrderCreatedBy": workOrderCreatedBy?.toJson(),
@ -220,20 +219,31 @@ class WorkOrderData {
"activities": activities.map((x) => x.toJson()).toList(),
"activityAssetToBeRetireds": activityAssetToBeRetireds.map((x) => x).toList(),
};
Map<String, dynamic> 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<String, dynamic> toMarkAsFixedJson() {
return {'workOrderId': workOrderNo, 'feedback': comments};
}
Map<String, dynamic> toNeedVisitJson() {
return {'workOrderId': workOrderNo, 'visitDate': workOrderHistory.isNotEmpty ? workOrderHistory[0].needAVisitDateTime : '', 'comment': comments};
}
//TODO signatureNurse not defined...
Map<String, dynamic> toNurseActionJson() {
return {'workOrderId': workOrderNo, 'feedback': '', 'signatureNurse': 'signatureNurse'};
}
Map<String, dynamic> toWorkOrderJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['workOrderId'] = requestId;
@ -265,8 +275,7 @@ class WorkOrderAsset {
);
}
Map<String, dynamic> toJson() =>
{
Map<String, dynamic> toJson() => {
"id": id,
"assetNumber": assetNumber,
};
@ -288,8 +297,7 @@ class AssetGroup {
);
}
Map<String, dynamic> toJson() =>
{
Map<String, dynamic> toJson() => {
"id": id,
"name": name,
};
@ -317,14 +325,14 @@ class WorkOrderAssignedEmployee {
);
}
Map<String, dynamic> toJson() =>
{
Map<String, dynamic> toJson() => {
"userId": userId,
"userName": userName,
"email": email,
"languageId": languageId,
};
}
class Activities {
int? id;
int? orderNo;
@ -333,30 +341,18 @@ class Activities {
ActivitySparePart? activitySparePart;
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<String, dynamic> 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;
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;
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<SparePartAttachments>? 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<String, dynamic> 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,7 +456,6 @@ class PartCatalogItem {
}
}
class Site {
Site({
required this.id,
@ -485,8 +472,7 @@ class Site {
);
}
Map<String, dynamic> toJson() =>
{
Map<String, dynamic> toJson() => {
"id": id,
"siteName": siteName,
};
@ -526,8 +512,7 @@ class WorkOrderContactPerson {
);
}
Map<String, dynamic> toJson() =>
{
Map<String, dynamic> toJson() => {
"id": id,
"name": name,
"employeeId": employeeId,
@ -582,8 +567,7 @@ class WorkOrderHistory {
);
}
Map<String, dynamic> toJson() =>
{
Map<String, dynamic> 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;
@ -617,6 +603,7 @@ class ActivityMaintenance {
ActivityMaintenance(
{this.id,
this.activityStatus,
this.lastSituation,
this.startTime,
this.endTime,
this.workingHours,
@ -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'];
@ -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<String, dynamic> 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<String, dynamic> toJson() {
@ -769,4 +746,3 @@ class ActivityMaintenanceAssistantEmployees {
return data;
}
}

@ -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}) {

@ -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,32 +24,89 @@ 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<ActivitiesListView> {
bool showReorderView = false;
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
List<Activities> reOrderActivities = [];
@override
Widget build(BuildContext context) {
//TODO add the check for type of activity after completing maintenance activity flow.
List<Activities> activities = [];
UserProvider userProvider = Provider.of<UserProvider>(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<RequestDetailProvider>(builder: (context, RequestDetailProvider requestDetailProvider, child) {
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
: 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]);
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]);
},
@ -57,10 +115,17 @@ class ActivitiesListView extends StatelessWidget {
(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,
);
}
}

Loading…
Cancel
Save