|
|
|
|
@ -1,4 +1,5 @@
|
|
|
|
|
import 'dart:convert';
|
|
|
|
|
import 'dart:developer';
|
|
|
|
|
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
import 'package:flutter/services.dart';
|
|
|
|
|
@ -17,6 +18,7 @@ import 'package:test_sa/models/lookup.dart';
|
|
|
|
|
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
|
|
|
|
|
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
|
|
|
|
|
import 'package:test_sa/providers/service_request_providers/reject_reason_provider.dart';
|
|
|
|
|
import 'package:test_sa/providers/work_order/need_visit_reminder_time_provider.dart';
|
|
|
|
|
import 'package:test_sa/service_request_latest/service_request_detail_provider.dart';
|
|
|
|
|
import 'package:test_sa/service_request_latest/utilities/service_request_utils.dart';
|
|
|
|
|
import 'package:test_sa/service_request_latest/views/forms/maintenance_request/maintenance_request_main.dart';
|
|
|
|
|
@ -31,12 +33,12 @@ import '../../../../new_views/common_widgets/app_filled_button.dart';
|
|
|
|
|
import '../../../../new_views/common_widgets/app_text_form_field.dart';
|
|
|
|
|
|
|
|
|
|
class ServiceRequestBottomSheet {
|
|
|
|
|
static buildBottomSheetParent({required BuildContext context, required Widget childWidget,bool ?isDismissible}) {
|
|
|
|
|
static buildBottomSheetParent({required BuildContext context, required Widget childWidget, bool? isDismissible}) {
|
|
|
|
|
return showModalBottomSheet(
|
|
|
|
|
context: context,
|
|
|
|
|
useSafeArea: true,
|
|
|
|
|
isScrollControlled: true,
|
|
|
|
|
isDismissible:isDismissible??true,
|
|
|
|
|
isDismissible: isDismissible ?? true,
|
|
|
|
|
backgroundColor: Colors.transparent,
|
|
|
|
|
builder: (context) => SingleChildScrollView(
|
|
|
|
|
child: childWidget,
|
|
|
|
|
@ -202,14 +204,14 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
buttonColor: AppColor.green70,
|
|
|
|
|
loading: false,
|
|
|
|
|
onPressed: () async {
|
|
|
|
|
if(requestDetailProvider.fixRemotelyHelperModel?.startDate==null&&requestDetailProvider.fixRemotelyHelperModel?.endDate==null){
|
|
|
|
|
if (requestDetailProvider.fixRemotelyHelperModel?.startDate == null && requestDetailProvider.fixRemotelyHelperModel?.endDate == null) {
|
|
|
|
|
"Please Select start and end date".showToast;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
requestDetailProvider.fixRemotelyHelperModel?.workOrderId = requestDetailProvider.currentWorkOrder?.data?.requestId;
|
|
|
|
|
requestDetailProvider.engineerFixRemotely();
|
|
|
|
|
Navigator.pop(context);
|
|
|
|
|
const SizedBox().flushBar(context: context, title: '', message: context.translation.youMarkedThisIssueAsFixedWaitingForTheRequesterToConfirm);
|
|
|
|
|
const SizedBox().flushBar(context: context, title: '', message: context.translation.youMarkedThisIssueAsFixedWaitingForTheRequesterToConfirm);
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
@ -246,25 +248,24 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
date: requestDetailProvider.needVisitHelperModel?.visitDate,
|
|
|
|
|
formatDateWithTime: true,
|
|
|
|
|
onDatePicker: (selectedDate) {
|
|
|
|
|
if (selectedDate != null) {
|
|
|
|
|
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,
|
|
|
|
|
);
|
|
|
|
|
requestDetailProvider.needVisitHelperModel?.visitDate = selectedDateTime;
|
|
|
|
|
requestDetailProvider.updateNeedVisitHelperModel(requestDetailProvider.needVisitHelperModel);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
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,
|
|
|
|
|
);
|
|
|
|
|
requestDetailProvider.needVisitHelperModel?.visitDate = selectedDateTime;
|
|
|
|
|
requestDetailProvider.updateNeedVisitHelperModel(requestDetailProvider.needVisitHelperModel);
|
|
|
|
|
print('selected date time i got is ${requestDetailProvider.needVisitHelperModel?.visitDate}');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
8.height,
|
|
|
|
|
@ -290,24 +291,30 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
buttonColor: AppColor.primary10,
|
|
|
|
|
loading: false,
|
|
|
|
|
onPressed: () async {
|
|
|
|
|
if(requestDetailProvider.needVisitHelperModel?.visitDate==null){
|
|
|
|
|
if (requestDetailProvider.needVisitHelperModel?.visitDate == null) {
|
|
|
|
|
"Please select visit date".showToast;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (requestDetailProvider.currentWorkOrder?.data?.nextStep!.workOrderNextStepEnum == WorkOrderNextStepEnum.eArrived) {
|
|
|
|
|
requestDetailProvider.updateNeedVisitHelperModel(NeedVisitHelperModel(
|
|
|
|
|
workOrderId: requestDetailProvider.needVisitHelperModel?.workOrderId,
|
|
|
|
|
visitDate: requestDetailProvider.needVisitHelperModel?.visitDate,
|
|
|
|
|
comment: requestDetailProvider.needVisitHelperModel?.comment,
|
|
|
|
|
));
|
|
|
|
|
requestDetailProvider.needVisitHelperModel?.workOrderId = requestDetailProvider.currentWorkOrder!.data!.requestId;
|
|
|
|
|
// requestDetailProvider.updateNeedVisitHelperModel(NeedVisitHelperModel(
|
|
|
|
|
// workOrderId: requestDetailProvider.needVisitHelperModel?.workOrderId,
|
|
|
|
|
// visitDate: requestDetailProvider.needVisitHelperModel?.visitDate,
|
|
|
|
|
// comment: requestDetailProvider.needVisitHelperModel?.comment,
|
|
|
|
|
// ));
|
|
|
|
|
print('visit date i got is ${requestDetailProvider.needVisitHelperModel?.visitDate}');
|
|
|
|
|
requestDetailProvider.engineerUpdateNeedVisit();
|
|
|
|
|
// await requestDetailProvider.getWorkOrderById(id: requestDetailProvider.needVisitHelperModel!.workOrderId!);
|
|
|
|
|
} else {
|
|
|
|
|
requestDetailProvider.needVisitHelperModel?.workOrderId = requestDetailProvider.currentWorkOrder!.data!.requestId;
|
|
|
|
|
requestDetailProvider.engineerNeedVisit();
|
|
|
|
|
requestDetailProvider.needVisitHelperModel = NeedVisitHelperModel();
|
|
|
|
|
getReminderTimeList(context: context);
|
|
|
|
|
initialVisitReminderBottomSheet(context: context);
|
|
|
|
|
}
|
|
|
|
|
Navigator.pop(context);
|
|
|
|
|
// initialVisitReminderBottomSheet(context: context);
|
|
|
|
|
|
|
|
|
|
Navigator.pop(context);
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
@ -317,49 +324,60 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static Future initialVisitReminderBottomSheet({required BuildContext context}) {
|
|
|
|
|
String selectedReminderTime = '10 minutes before';
|
|
|
|
|
static Future<void> getReminderTimeList({required BuildContext context}) async {
|
|
|
|
|
NeedVisitReminderTimeProvider timeProvider = Provider.of<NeedVisitReminderTimeProvider>(context, listen: false);
|
|
|
|
|
timeProvider.reset();
|
|
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
|
|
|
timeProvider.getDate();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static Future initialVisitReminderBottomSheet({required BuildContext context, Lookup? reminder}) {
|
|
|
|
|
Lookup selectedReminderTime = reminder ?? Lookup();
|
|
|
|
|
Widget reminderTimeWidget({required BuildContext context}) {
|
|
|
|
|
List<String> reminderTimeList = ['5 minutes before', '10 minutes before', '15 minutes before'];
|
|
|
|
|
return Consumer<NeedVisitReminderTimeProvider>(builder: (cxt, snapshot, _) {
|
|
|
|
|
if (snapshot.loading) {
|
|
|
|
|
return const ALoading();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return StatefulBuilder(
|
|
|
|
|
builder: (context, setState) {
|
|
|
|
|
return Wrap(
|
|
|
|
|
direction: Axis.vertical,
|
|
|
|
|
runSpacing: 8,
|
|
|
|
|
spacing: 8,
|
|
|
|
|
children: [
|
|
|
|
|
for (var element in reminderTimeList)
|
|
|
|
|
Row(
|
|
|
|
|
mainAxisSize: MainAxisSize.min,
|
|
|
|
|
children: [
|
|
|
|
|
SizedBox(
|
|
|
|
|
width: 24,
|
|
|
|
|
height: 24,
|
|
|
|
|
child: Radio<String>(
|
|
|
|
|
value: element,
|
|
|
|
|
activeColor: Colors.red,
|
|
|
|
|
fillColor: MaterialStateColor.resolveWith((states) {
|
|
|
|
|
if (states.contains(MaterialState.selected)) return AppColor.primary10;
|
|
|
|
|
return AppColor.neutral130;
|
|
|
|
|
}),
|
|
|
|
|
groupValue: selectedReminderTime,
|
|
|
|
|
onChanged: (String? value) {
|
|
|
|
|
setState(() {
|
|
|
|
|
selectedReminderTime = value!;
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
return StatefulBuilder(
|
|
|
|
|
builder: (context, setState) {
|
|
|
|
|
return Wrap(
|
|
|
|
|
direction: Axis.vertical,
|
|
|
|
|
runSpacing: 8,
|
|
|
|
|
spacing: 20,
|
|
|
|
|
children: [
|
|
|
|
|
for (var element in snapshot.items)
|
|
|
|
|
Row(
|
|
|
|
|
mainAxisSize: MainAxisSize.min,
|
|
|
|
|
children: [
|
|
|
|
|
SizedBox(
|
|
|
|
|
width: 24,
|
|
|
|
|
height: 24,
|
|
|
|
|
child: Radio<Lookup>(
|
|
|
|
|
value: element,
|
|
|
|
|
activeColor: Colors.red,
|
|
|
|
|
fillColor: MaterialStateColor.resolveWith((states) {
|
|
|
|
|
if (states.contains(MaterialState.selected)) return AppColor.primary10;
|
|
|
|
|
return AppColor.neutral130;
|
|
|
|
|
}),
|
|
|
|
|
groupValue: selectedReminderTime,
|
|
|
|
|
onChanged: (Lookup? value) {
|
|
|
|
|
setState(() {
|
|
|
|
|
selectedReminderTime = value!;
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
8.width,
|
|
|
|
|
Text(element, style: AppTextStyles.bodyText.copyWith(color: AppColor.neutral120)),
|
|
|
|
|
],
|
|
|
|
|
)
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
8.width,
|
|
|
|
|
Text(element.name ?? '', style: AppTextStyles.bodyText.copyWith(color: AppColor.neutral120)),
|
|
|
|
|
],
|
|
|
|
|
)
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
).toShimmer(isShow: snapshot.loading);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return buildBottomSheetParent(
|
|
|
|
|
@ -380,7 +398,7 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
alignment: AlignmentDirectional.centerStart,
|
|
|
|
|
child: context.translation.youCanSetTheReminderInAlarmToRemindYouBeforeVisit.bodyText2(context),
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
30.height,
|
|
|
|
|
reminderTimeWidget(context: context),
|
|
|
|
|
30.height,
|
|
|
|
|
Row(
|
|
|
|
|
@ -393,20 +411,6 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
textColor: AppColor.black10,
|
|
|
|
|
loading: false,
|
|
|
|
|
onPressed: () async {
|
|
|
|
|
if (requestDetailProvider.currentWorkOrder?.data?.nextStep!.workOrderNextStepEnum == WorkOrderNextStepEnum.eArrived) {
|
|
|
|
|
requestDetailProvider.updateNeedVisitHelperModel(
|
|
|
|
|
NeedVisitHelperModel(
|
|
|
|
|
workOrderId: requestDetailProvider.needVisitHelperModel?.workOrderId,
|
|
|
|
|
visitDate: requestDetailProvider.needVisitHelperModel?.visitDate,
|
|
|
|
|
comment: requestDetailProvider.needVisitHelperModel?.comment,
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
requestDetailProvider.engineerUpdateNeedVisit();
|
|
|
|
|
} else {
|
|
|
|
|
requestDetailProvider.needVisitHelperModel?.workOrderId = requestDetailProvider.currentWorkOrder!.data!.requestId;
|
|
|
|
|
requestDetailProvider.engineerNeedVisit();
|
|
|
|
|
requestDetailProvider.needVisitHelperModel = NeedVisitHelperModel();
|
|
|
|
|
}
|
|
|
|
|
Navigator.pop(context);
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
@ -418,19 +422,16 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
buttonColor: AppColor.primary10,
|
|
|
|
|
loading: false,
|
|
|
|
|
onPressed: () async {
|
|
|
|
|
if (requestDetailProvider.currentWorkOrder?.data?.nextStep!.workOrderNextStepEnum == WorkOrderNextStepEnum.eArrived) {
|
|
|
|
|
requestDetailProvider.updateNeedVisitHelperModel(
|
|
|
|
|
NeedVisitHelperModel(
|
|
|
|
|
workOrderId: requestDetailProvider.needVisitHelperModel?.workOrderId,
|
|
|
|
|
visitDate: requestDetailProvider.needVisitHelperModel?.visitDate,
|
|
|
|
|
comment: requestDetailProvider.needVisitHelperModel?.comment,
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
requestDetailProvider.engineerUpdateNeedVisit();
|
|
|
|
|
} else {
|
|
|
|
|
requestDetailProvider.needVisitHelperModel?.workOrderId = requestDetailProvider.currentWorkOrder!.data!.requestId;
|
|
|
|
|
requestDetailProvider.engineerNeedVisit();
|
|
|
|
|
requestDetailProvider.needVisitHelperModel = NeedVisitHelperModel();
|
|
|
|
|
requestDetailProvider.engineerSetReminder(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, reminderId: selectedReminderTime.id!);
|
|
|
|
|
try {
|
|
|
|
|
DateTime visitDateTime = DateTime.parse(requestDetailProvider.currentWorkOrder!.data!.needAVisitDateTime.toString());
|
|
|
|
|
DateTime updatedDateTime = visitDateTime.subtract(Duration(minutes: selectedReminderTime.value ?? 0));
|
|
|
|
|
if (updatedDateTime.isAfter(DateTime.now())) {
|
|
|
|
|
ServiceRequestUtils.scheduleNotification(context: context, scheduleDateTime: updatedDateTime);
|
|
|
|
|
ServiceRequestUtils.addEventToCalendar(context: context, start: updatedDateTime, end: visitDateTime, title: context.translation.needAVisit);
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {
|
|
|
|
|
log('error $e');
|
|
|
|
|
}
|
|
|
|
|
Navigator.pop(context);
|
|
|
|
|
},
|
|
|
|
|
@ -445,6 +446,7 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static Future getQRCodeBottomSheet({required BuildContext context}) async {
|
|
|
|
|
// Show the loading dialog while fetching QR code
|
|
|
|
|
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
|
|
|
|
|
@ -481,12 +483,12 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
child: isLoading
|
|
|
|
|
? const ALoading() // Show loader while fetching the new QR code
|
|
|
|
|
: Image.memory(
|
|
|
|
|
bytes, // Displaying the QR code from base64
|
|
|
|
|
fit: BoxFit.contain, // Ensure the image fits well in the dialog
|
|
|
|
|
errorBuilder: (context, error, stackTrace) {
|
|
|
|
|
return const Icon(Icons.error, color: Colors.red);
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
bytes, // Displaying the QR code from base64
|
|
|
|
|
fit: BoxFit.contain, // Ensure the image fits well in the dialog
|
|
|
|
|
errorBuilder: (context, error, stackTrace) {
|
|
|
|
|
return const Icon(Icons.error, color: Colors.red);
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
12.height,
|
|
|
|
|
@ -538,7 +540,6 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
16.height,
|
|
|
|
|
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
@ -549,7 +550,6 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static Future rejectRequestBottomSheet({required BuildContext context}) {
|
|
|
|
|
TextEditingController _commentController = TextEditingController();
|
|
|
|
|
return buildBottomSheetParent(
|
|
|
|
|
@ -854,7 +854,7 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
buttonColor: AppColor.green70,
|
|
|
|
|
loading: false,
|
|
|
|
|
onPressed: () {
|
|
|
|
|
if(feedback.isEmpty){
|
|
|
|
|
if (feedback.isEmpty) {
|
|
|
|
|
"Please provide feedback".showToast;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
@ -1045,8 +1045,8 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static Future nurseVerifyArrivalBottomSheet({required BuildContext context}) {
|
|
|
|
|
return buildBottomSheetParent(
|
|
|
|
|
context: context,
|
|
|
|
|
@ -1094,7 +1094,7 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
buttonColor: AppColor.green70,
|
|
|
|
|
onPressed: () async {
|
|
|
|
|
Navigator.pop(context);
|
|
|
|
|
int? status = await requestDetailProvider.nurseConfirmEngineerArrival(workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId ?? 0);
|
|
|
|
|
int? status = await requestDetailProvider.nurseConfirmEngineerArrival(workOrderId: requestDetailProvider.currentWorkOrder?.data?.requestId ?? 0);
|
|
|
|
|
if (status == 200) {
|
|
|
|
|
requestDetailProvider.getWorkOrderById(id: requestDetailProvider.currentWorkOrder!.data!.requestId!);
|
|
|
|
|
}
|
|
|
|
|
@ -1105,13 +1105,13 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static Future waitingForApprovalBottomSheet({required BuildContext context}) {
|
|
|
|
|
return buildBottomSheetParent(
|
|
|
|
|
context: context,
|
|
|
|
|
childWidget: Consumer<ServiceRequestDetailProvider>(builder: (context, ServiceRequestDetailProvider requestDetailProvider, child) {
|
|
|
|
|
return Column(
|
|
|
|
|
return Column(
|
|
|
|
|
mainAxisSize: MainAxisSize.min,
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
children: [
|
|
|
|
|
@ -1132,7 +1132,5 @@ class ServiceRequestBottomSheet {
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|