|
|
|
@ -1,6 +1,7 @@
|
|
|
|
|
import 'dart:async';
|
|
|
|
|
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
import 'package:fluttertoast/fluttertoast.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/extensions/context_extension.dart';
|
|
|
|
@ -31,8 +32,9 @@ import '../../../../../../new_views/common_widgets/default_app_bar.dart';
|
|
|
|
|
//TODO Have some details need to confirm from backend fault description,
|
|
|
|
|
class VerifyAssetDetails extends StatefulWidget {
|
|
|
|
|
static const String id = "/verify-asset-detail";
|
|
|
|
|
bool isEdit = false;
|
|
|
|
|
|
|
|
|
|
const VerifyAssetDetails({Key? key}) : super(key: key);
|
|
|
|
|
VerifyAssetDetails({Key? key, required this.isEdit}) : super(key: key);
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
_VerifyAssetDetailsState createState() => _VerifyAssetDetailsState();
|
|
|
|
@ -41,13 +43,10 @@ class VerifyAssetDetails extends StatefulWidget {
|
|
|
|
|
class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProviderStateMixin {
|
|
|
|
|
RequestDetailProvider? _requestDetailProvider;
|
|
|
|
|
LoanAvailabilityProvider? _loanAvailabilityProvider;
|
|
|
|
|
ServiceRequestFaultDescriptionProvider? _faultDescriptionProvider;
|
|
|
|
|
EquipmentStatusProvider? _equipmentStatusProvider;
|
|
|
|
|
ReasonProvider? _reasonProvider;
|
|
|
|
|
bool _isLoading = false;
|
|
|
|
|
Asset? loanAvailabilityAsset;
|
|
|
|
|
List<FaultDescription> _faults = [];
|
|
|
|
|
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
|
|
|
|
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@ -73,11 +72,22 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
|
|
|
|
|
equipmentStatus: currentWorkOrderData.equipmentStatus,
|
|
|
|
|
loanAvailability: currentWorkOrderData.loanAvailablity,
|
|
|
|
|
failureReason: currentWorkOrderData.failureReasone,
|
|
|
|
|
// faultDescription: currentWorkOrderData.fa,
|
|
|
|
|
faultDescription: FaultDescription(),
|
|
|
|
|
loanAssetId: currentWorkOrderData.assetLoan?.id,
|
|
|
|
|
solution: currentWorkOrderData.solution?.name,
|
|
|
|
|
returnToService: currentWorkOrderData.returnToService,
|
|
|
|
|
serviceType: currentWorkOrderData.serviceType,
|
|
|
|
|
);
|
|
|
|
|
if (currentWorkOrderData.assetLoan != null) {
|
|
|
|
|
loanAvailabilityAsset = Asset(
|
|
|
|
|
id: currentWorkOrderData.assetLoan?.id,
|
|
|
|
|
assetNumber: currentWorkOrderData.assetLoan?.assetNumber,
|
|
|
|
|
assetSerialNo: currentWorkOrderData.assetLoan?.assetSerialNo,
|
|
|
|
|
systemID: currentWorkOrderData.assetLoan?.systemId,
|
|
|
|
|
tagCode: currentWorkOrderData.assetLoan?.tagCode,
|
|
|
|
|
);
|
|
|
|
|
setState(() {});
|
|
|
|
|
}
|
|
|
|
|
getFaultDescription(assetId: requestDetailProvider.currentWorkOrder?.data?.asset?.id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -89,7 +99,6 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
|
|
|
|
|
_reasonProvider!.reset();
|
|
|
|
|
_loanAvailabilityProvider = Provider.of<LoanAvailabilityProvider>(context, listen: false);
|
|
|
|
|
_loanAvailabilityProvider!.reset();
|
|
|
|
|
_faultDescriptionProvider = Provider.of<ServiceRequestFaultDescriptionProvider>(context, listen: false);
|
|
|
|
|
_equipmentStatusProvider = Provider.of<EquipmentStatusProvider>(context, listen: false);
|
|
|
|
|
_equipmentStatusProvider!.reset();
|
|
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
|
|
@ -102,122 +111,121 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
|
|
|
|
|
key: _scaffoldKey,
|
|
|
|
|
appBar: DefaultAppBar(title: context.translation.verify_asset_details),
|
|
|
|
|
body: Consumer<RequestDetailProvider>(builder: (context, RequestDetailProvider requestDetailProvider, child) {
|
|
|
|
|
print('description model i got is ${requestDetailProvider.engineerUpdateWorkOrderHelperModel?.faultDescription?.toJson()}');
|
|
|
|
|
|
|
|
|
|
return Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
|
children: [
|
|
|
|
|
Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
mainAxisSize: MainAxisSize.min,
|
|
|
|
|
children: [
|
|
|
|
|
equipmentStatusWidget(context: context, workOrderData: requestDetailProvider.engineerUpdateWorkOrderHelperModel!),
|
|
|
|
|
12.height,
|
|
|
|
|
ADatePicker(
|
|
|
|
|
label: context.translation.returnToService,
|
|
|
|
|
hideShadow: true,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
date: DateTime.tryParse(requestDetailProvider.engineerUpdateWorkOrderHelperModel?.returnToService ?? ""),
|
|
|
|
|
formatDateWithTime: true,
|
|
|
|
|
onDatePicker: (selectedDate) {
|
|
|
|
|
showTimePicker(
|
|
|
|
|
context: context,
|
|
|
|
|
initialTime: TimeOfDay.now(),
|
|
|
|
|
).then((selectedTime) {
|
|
|
|
|
// Handle the selected date and time here.
|
|
|
|
|
if (selectedTime != null) {
|
|
|
|
|
DateTime? selectedDateTime = DateTime(
|
|
|
|
|
selectedDate.year,
|
|
|
|
|
selectedDate.month,
|
|
|
|
|
selectedDate.day,
|
|
|
|
|
selectedTime.hour,
|
|
|
|
|
selectedTime.minute,
|
|
|
|
|
);
|
|
|
|
|
if (requestDetailProvider.engineerUpdateWorkOrderHelperModel?.returnToService != null &&
|
|
|
|
|
selectedDateTime.isBefore(DateTime.parse(requestDetailProvider.engineerUpdateWorkOrderHelperModel!.returnToService!))) {
|
|
|
|
|
"Visit Date time must be greater then previous date".showToast;
|
|
|
|
|
return;
|
|
|
|
|
if (widget.isEdit) ...[
|
|
|
|
|
Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
mainAxisSize: MainAxisSize.min,
|
|
|
|
|
children: [
|
|
|
|
|
assetStatusWidget(context: context, workOrderData: requestDetailProvider.engineerUpdateWorkOrderHelperModel!),
|
|
|
|
|
12.height,
|
|
|
|
|
ADatePicker(
|
|
|
|
|
label: context.translation.returnToService,
|
|
|
|
|
hideShadow: true,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
date: DateTime.tryParse(requestDetailProvider.engineerUpdateWorkOrderHelperModel?.returnToService ?? ""),
|
|
|
|
|
formatDateWithTime: true,
|
|
|
|
|
onDatePicker: (selectedDate) {
|
|
|
|
|
showTimePicker(
|
|
|
|
|
context: context,
|
|
|
|
|
initialTime: TimeOfDay.now(),
|
|
|
|
|
).then((selectedTime) {
|
|
|
|
|
// Handle the selected date and time here.
|
|
|
|
|
if (selectedTime != null) {
|
|
|
|
|
DateTime? selectedDateTime = DateTime(
|
|
|
|
|
selectedDate.year,
|
|
|
|
|
selectedDate.month,
|
|
|
|
|
selectedDate.day,
|
|
|
|
|
selectedTime.hour,
|
|
|
|
|
selectedTime.minute,
|
|
|
|
|
);
|
|
|
|
|
// if (requestDetailProvider.engineerUpdateWorkOrderHelperModel?.returnToService != null &&
|
|
|
|
|
// selectedDateTime.isBefore(DateTime.parse(requestDetailProvider.engineerUpdateWorkOrderHelperModel!.returnToService!))) {
|
|
|
|
|
// "Return To Service Date time must be greater then previous date".showToast;
|
|
|
|
|
// return;
|
|
|
|
|
// }
|
|
|
|
|
setState(() {
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.returnToService = selectedDateTime.toIso8601String();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
SingleItemDropDownMenu<Lookup, LoanAvailabilityProvider>(
|
|
|
|
|
context: context,
|
|
|
|
|
title: context.translation.loanAvailability,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
height: 56.toScreenHeight,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
initialValue: requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAvailability,
|
|
|
|
|
onSelect: (status) {
|
|
|
|
|
if (status != null) {
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAvailability = status;
|
|
|
|
|
if (status.value != 1) {
|
|
|
|
|
loanAvailabilityAsset = null;
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAssetId = null;
|
|
|
|
|
}
|
|
|
|
|
setState(() {});
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
if (requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAvailability?.value == 1) 8.height,
|
|
|
|
|
if (requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAvailability?.value == 1)
|
|
|
|
|
PickAsset(
|
|
|
|
|
device: loanAvailabilityAsset, // ?? _serviceReport.device,
|
|
|
|
|
cardColor: AppColor.neutral100,
|
|
|
|
|
onPickAsset: (asset) {
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAssetId = asset.id;
|
|
|
|
|
setState(() {
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.returnToService = selectedDateTime.toIso8601String();
|
|
|
|
|
loanAvailabilityAsset = asset;
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
SingleItemDropDownMenu<Lookup, ReasonProvider>(
|
|
|
|
|
context: context,
|
|
|
|
|
title: context.translation.failureReason,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
height: 56.toScreenHeight,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
initialValue: requestDetailProvider.engineerUpdateWorkOrderHelperModel?.failureReason,
|
|
|
|
|
onSelect: (value) {
|
|
|
|
|
if (value != null) {
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.failureReason = value;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
SingleItemDropDownMenu<Lookup, LoanAvailabilityProvider>(
|
|
|
|
|
context: context,
|
|
|
|
|
title: context.translation.loanAvailability,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
height: 56.toScreenHeight,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
initialValue: requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAvailability,
|
|
|
|
|
onSelect: (status) {
|
|
|
|
|
if (status != null) {
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAvailability = status;
|
|
|
|
|
if (status.value != 1) {
|
|
|
|
|
loanAvailabilityAsset = null;
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAssetId = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// setState(() {});
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
if (requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAvailability?.value == 1) 8.height,
|
|
|
|
|
if (requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAvailability?.value == 1)
|
|
|
|
|
PickAsset(
|
|
|
|
|
device: loanAvailabilityAsset, // ?? _serviceReport.device,
|
|
|
|
|
cardColor: AppColor.neutral100,
|
|
|
|
|
onPickAsset: (asset) {
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAssetId = asset.id;
|
|
|
|
|
//setState(() {
|
|
|
|
|
loanAvailabilityAsset = asset;
|
|
|
|
|
// });
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
SingleItemDropDownMenu<Lookup, ReasonProvider>(
|
|
|
|
|
context: context,
|
|
|
|
|
title: context.translation.failureReason,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
height: 56.toScreenHeight,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
initialValue: requestDetailProvider.engineerUpdateWorkOrderHelperModel?.failureReason,
|
|
|
|
|
onSelect: (value) {
|
|
|
|
|
if (value != null) {
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.failureReason = value;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
SingleItemDropDownMenu<FaultDescription, NullableLoadingProvider>(
|
|
|
|
|
context: context,
|
|
|
|
|
title: context.translation.faultDescription,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
staticData: _faults,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
initialValue: requestDetailProvider.engineerUpdateWorkOrderHelperModel?.faultDescription,
|
|
|
|
|
onSelect: (fault) {
|
|
|
|
|
if (fault != null) {
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.faultDescription = fault;
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.solution = fault.workPerformed;
|
|
|
|
|
if (mounted) {
|
|
|
|
|
print('model updated...');
|
|
|
|
|
requestDetailProvider.updateEngineerUpdateWorkOrderHelperModel(requestDetailProvider.engineerUpdateWorkOrderHelperModel);
|
|
|
|
|
12.height,
|
|
|
|
|
SingleItemDropDownMenu<FaultDescription, NullableLoadingProvider>(
|
|
|
|
|
context: context,
|
|
|
|
|
title: context.translation.faultDescription,
|
|
|
|
|
backgroundColor: AppColor.neutral100,
|
|
|
|
|
staticData: _faults,
|
|
|
|
|
showShadow: false,
|
|
|
|
|
initialValue: requestDetailProvider.engineerUpdateWorkOrderHelperModel?.faultDescription,
|
|
|
|
|
onSelect: (fault) {
|
|
|
|
|
if (fault != null) {
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.faultDescription = fault;
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.solution = fault.workPerformed;
|
|
|
|
|
setState(() {});
|
|
|
|
|
}
|
|
|
|
|
print('description i got is ${requestDetailProvider.engineerUpdateWorkOrderHelperModel?.faultDescription?.toJson()}');
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
context.translation.solutions.heading6(context).custom(color: AppColor.neutral50),
|
|
|
|
|
8.height,
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.solution != null
|
|
|
|
|
? requestDetailProvider.engineerUpdateWorkOrderHelperModel!.solution!.bodyText2(context).custom(color: AppColor.neutral120)
|
|
|
|
|
: const SizedBox(),
|
|
|
|
|
],
|
|
|
|
|
).toShadowContainer(context).paddingAll(16),
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
context.translation.solutions.heading6(context).custom(color: AppColor.neutral50),
|
|
|
|
|
8.height,
|
|
|
|
|
requestDetailProvider.engineerUpdateWorkOrderHelperModel?.solution != null
|
|
|
|
|
? requestDetailProvider.engineerUpdateWorkOrderHelperModel!.solution!.bodyText2(context).custom(color: AppColor.neutral120)
|
|
|
|
|
: const SizedBox(),
|
|
|
|
|
],
|
|
|
|
|
).toShadowContainer(context).paddingAll(16),
|
|
|
|
|
] else ...[
|
|
|
|
|
assetStatusWidget(context: context, workOrderData: requestDetailProvider.engineerUpdateWorkOrderHelperModel!).toShadowContainer(context).paddingAll(16),
|
|
|
|
|
],
|
|
|
|
|
Container(
|
|
|
|
|
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 16.toScreenHeight),
|
|
|
|
|
color: AppColor.white10,
|
|
|
|
@ -225,12 +233,12 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
|
|
|
|
|
label: context.translation.verify_asset_details,
|
|
|
|
|
buttonColor: AppColor.primary10,
|
|
|
|
|
onPressed: () async {
|
|
|
|
|
print('description model i got is ${requestDetailProvider.engineerUpdateWorkOrderHelperModel?.faultDescription?.toJson()}');
|
|
|
|
|
print('update model i got is ${requestDetailProvider.engineerUpdateWorkOrderHelperModel?.toJson()}');
|
|
|
|
|
// showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
|
|
|
|
|
// await requestDetailProvider.engineerUpdateWorkOrder();
|
|
|
|
|
// Navigator.pop(context);
|
|
|
|
|
// Navigator.pop(context);
|
|
|
|
|
if (validateForm(requestDetailProvider: requestDetailProvider)) {
|
|
|
|
|
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
|
|
|
|
|
await requestDetailProvider.engineerUpdateWorkOrder();
|
|
|
|
|
Navigator.pop(context);
|
|
|
|
|
Navigator.pop(context);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
@ -240,13 +248,29 @@ class _VerifyAssetDetailsState extends State<VerifyAssetDetails> with TickerProv
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Widget equipmentStatusWidget({required BuildContext context, required EngineerUpdateWorkOrderHelperModel workOrderData}) {
|
|
|
|
|
bool validateForm({required RequestDetailProvider requestDetailProvider}) {
|
|
|
|
|
bool isValid = true;
|
|
|
|
|
if (!widget.isEdit) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
if (requestDetailProvider.engineerUpdateWorkOrderHelperModel!.equipmentStatus != null) {
|
|
|
|
|
if (requestDetailProvider.engineerUpdateWorkOrderHelperModel!.equipmentStatus!.value == 1 || requestDetailProvider.engineerUpdateWorkOrderHelperModel!.equipmentStatus!.value == 2) {
|
|
|
|
|
if (requestDetailProvider.engineerUpdateWorkOrderHelperModel!.returnToService == null) {
|
|
|
|
|
Fluttertoast.showToast(msg: "Return to service is required ", toastLength: Toast.LENGTH_LONG);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return isValid;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Widget assetStatusWidget({required BuildContext context, required EngineerUpdateWorkOrderHelperModel workOrderData}) {
|
|
|
|
|
return Consumer<EquipmentStatusProvider>(builder: (cxt, snapshot, _) {
|
|
|
|
|
return Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
mainAxisSize: MainAxisSize.min,
|
|
|
|
|
children: [
|
|
|
|
|
context.translation.equipmentStatus.bodyText(context).custom(color: AppColor.black20),
|
|
|
|
|
context.translation.assetStatus.bodyText(context).custom(color: AppColor.black20),
|
|
|
|
|
8.height,
|
|
|
|
|
Wrap(
|
|
|
|
|
runSpacing: 8,
|
|
|
|
|