timer improvements

design_3.0_task_module_new
Sikander Saleem 4 months ago
parent 407c913002
commit f3f09d1eb2

@ -158,26 +158,26 @@ class PpmProvider extends ChangeNotifier {
Future<PlanPreventiveVisit?> getPlanPreventiveVisitById(int id) async {
try {
isLoading = true;
Response response = await ApiManager.instance.get(URLs.getPlanPreventiveVisitById + "?planPreventiveVisitId=$id");
if (response.statusCode >= 200 && response.statusCode < 300) {
ppmPlanAttachments = [];
planPreventiveVisit = PlanPreventiveVisit.fromJson(json.decode(response.body)["data"]);
if(planPreventiveVisit?.visitStatus?.value! == 1 || planPreventiveVisit?.visitStatus?.value == 3){
isReadOnly =true;
}else{
isReadOnly =false;
isLoading = true;
Response response = await ApiManager.instance.get(URLs.getPlanPreventiveVisitById + "?planPreventiveVisitId=$id");
if (response.statusCode >= 200 && response.statusCode < 300) {
ppmPlanAttachments = [];
planPreventiveVisit = PlanPreventiveVisit.fromJson(json.decode(response.body)["data"]);
if (planPreventiveVisit?.visitStatus?.value! == 1 || planPreventiveVisit?.visitStatus?.value == 3) {
isReadOnly = true;
} else {
isReadOnly = false;
}
isLoading = false;
notifyListeners();
return planPreventiveVisit;
}
isLoading = false;
notifyListeners();
return planPreventiveVisit;
}
isLoading = false;
notifyListeners();
return null;
return null;
} catch (error) {
isLoading= false;
notifyListeners();
isLoading = false;
notifyListeners();
return null;
}
}
@ -307,19 +307,36 @@ class PpmProvider extends ChangeNotifier {
return -1;
}
}
bool validate() {
// if (planPreventiveVisit.activityStatus == null) {
// Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.activityStatus}");
// return false;
// }
if (planPreventiveVisit?.tbsTimer?.startAt == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (planPreventiveVisit?.tbsTimer?.endAt == null) {
Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
bool isTimerPickerEnable = ApiManager.instance.assetGroup?.enabledEngineerTimer ?? false;
if (isTimerPickerEnable) {
if (planPreventiveVisit?.tbsTimer?.startAt == null && planPreventiveVisit?.ppMTimePicker == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (planPreventiveVisit?.ppMTimePicker == null) {
if (planPreventiveVisit?.tbsTimer?.startAt == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (planPreventiveVisit?.tbsTimer?.endAt == null) {
Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
}
}
} else {
if (planPreventiveVisit?.tbsTimer?.startAt == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (planPreventiveVisit?.tbsTimer?.endAt == null) {
Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
}
}
// if (model.startTime == null) {
// Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.startTime}");
// return false;

@ -1,119 +1,119 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/date_and_time/time_picker.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart';
class TimeDurationView extends StatelessWidget {
const TimeDurationView({Key ?key}) : super(key: key);
@override
Widget build(BuildContext context) {
//TODO user the same form key everywhere....
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
return Consumer<ServiceRequestsProvider>(
builder: (context, serviceRequestProvider,child) {
serviceRequestProvider.currentSelectedRequest?.visitDate = '';
return Form(
key: _formKey,
child: SingleChildScrollView(
child: Column(
children: [
ADatePicker(
label: context.translation.visitDate,
hideShadow: true,
withIcon: false,
hint: context.translation.select,
height: 70.toScreenHeight,
date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.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,
);
serviceRequestProvider.currentSelectedRequest?.visitDate = selectedDateTime?.toIso8601String();
}
});
}
},
),
8.height,
ATimePicker(
label: context.translation.startTime,
hint: context.translation.select,
withIcon: false,
withBorder: false,
height: 70.toScreenHeight,
time: serviceRequestProvider.selectedTime,
onTimePicker: (selectedTime) {
if (selectedTime != null) {
print('time selected $selectedTime');
serviceRequestProvider.selectedTime = selectedTime;
}
},
),
8.height,
ATimePicker(
label: context.translation.endTime,
hint: context.translation.select,
withIcon: false,
withBorder: false,
height: 70.toScreenHeight,
time: serviceRequestProvider.selectedTime,
onTimePicker: (selectedTime) {
if (selectedTime != null) {
print('time selected $selectedTime');
serviceRequestProvider.selectedTime = selectedTime;
}
},
),
8.height,
SizedBox(
width: double.infinity,
height: 70.toScreenHeight,
child: AppTimer(
label: context.translation.workingHours,
timer: TimerModel(),
onPick: (TimerModel ?value){
},
decoration: BoxDecoration(
color: AppColor.background(context),
borderRadius: BorderRadius.circular(10),
// boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
),
// enabled: serviceRequestProvider.currentSelectedRequest.date == null,
enabled: true,
onChange: (timer) async {
print('timer i got is ${timer.toString()}');
return true;
},
),
),
16.height,
],
),
),
);
}
);
}
}
//
// import 'package:flutter/material.dart';
// import 'package:provider/provider.dart';
// import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
// import 'package:test_sa/extensions/context_extension.dart';
// import 'package:test_sa/extensions/int_extensions.dart';
// import 'package:test_sa/models/timer_model.dart';
// import 'package:test_sa/new_views/app_style/app_color.dart';
// import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
// import 'package:test_sa/views/widgets/date_and_time/time_picker.dart';
// import 'package:test_sa/views/widgets/timer/app_timer.dart';
//
// class TimeDurationView extends StatelessWidget {
// const TimeDurationView({Key ?key}) : super(key: key);
//
// @override
// Widget build(BuildContext context) { todo @delete
// //TODO user the same form key everywhere....
// final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
// return Consumer<ServiceRequestsProvider>(
// builder: (context, serviceRequestProvider,child) {
// serviceRequestProvider.currentSelectedRequest?.visitDate = '';
// return Form(
// key: _formKey,
// child: SingleChildScrollView(
// child: Column(
// children: [
// ADatePicker(
// label: context.translation.visitDate,
// hideShadow: true,
// withIcon: false,
// hint: context.translation.select,
// height: 70.toScreenHeight,
// date: DateTime.tryParse(serviceRequestProvider.currentSelectedRequest?.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,
// );
// serviceRequestProvider.currentSelectedRequest?.visitDate = selectedDateTime?.toIso8601String();
// }
// });
// }
// },
// ),
// 8.height,
// ATimePicker(
// label: context.translation.startTime,
// hint: context.translation.select,
// withIcon: false,
// withBorder: false,
// height: 70.toScreenHeight,
// time: serviceRequestProvider.selectedTime,
// onTimePicker: (selectedTime) {
// if (selectedTime != null) {
// print('time selected $selectedTime');
// serviceRequestProvider.selectedTime = selectedTime;
// }
// },
// ),
// 8.height,
// ATimePicker(
// label: context.translation.endTime,
// hint: context.translation.select,
// withIcon: false,
// withBorder: false,
// height: 70.toScreenHeight,
// time: serviceRequestProvider.selectedTime,
// onTimePicker: (selectedTime) {
// if (selectedTime != null) {
// print('time selected $selectedTime');
// serviceRequestProvider.selectedTime = selectedTime;
// }
// },
// ),
// 8.height,
// SizedBox(
// width: double.infinity,
// height: 70.toScreenHeight,
// child: AppTimer(
// label: context.translation.workingHours,
// timer: TimerModel(),
// onPick: (TimerModel ?value){
//
// },
// decoration: BoxDecoration(
// color: AppColor.background(context),
// borderRadius: BorderRadius.circular(10),
// // boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
// ),
// // enabled: serviceRequestProvider.currentSelectedRequest.date == null,
// enabled: true,
// onChange: (timer) async {
// print('timer i got is ${timer.toString()}');
// return true;
// },
// ),
//
// ),
// 16.height,
// ],
// ),
// ),
// );
// }
// );
// }
// }

@ -1,180 +1,180 @@
import 'package:flutter/material.dart';
import 'package:test_sa/common_widgets/stapper_widget/components/base_step.dart';
import 'package:test_sa/common_widgets/stapper_widget/components/custom_line.dart';
import 'package:test_sa/common_widgets/stapper_widget/custom_stepper.dart';
import 'package:test_sa/controllers/providers/api/service_requests_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/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'components/asset_conditon_view.dart';
import 'components/attachments_view.dart';
import 'components/time_duration_view.dart';
class WorkOrderFormView extends StatefulWidget {
const WorkOrderFormView({Key? key}) : super(key: key);
@override
_WorkOrderFormViewState createState() => _WorkOrderFormViewState();
}
class _WorkOrderFormViewState extends State<WorkOrderFormView> {
int currentStep = 0;
int activeStep = 0;
int reachedStep = 0;
int upperBound = 2;
final formKey = GlobalKey<FormState>();
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColor.neutral100,
appBar: DefaultAppBar(title: context.translation.createWorkOrder),
body: Column(
children: [
16.height,
CustomStepper(
activeStep: activeStep,
lineStyle: LineStyle(
activeLineColor: AppColor.primary10,
finishedLineColor: AppColor.primary10,
defaultLineColor: AppColor.white40,
lineThickness: 1,
lineLength: 93.toScreenWidth,
lineType: LineType.normal,
),
internalPadding: 2.toScreenWidth,
steps: [
StepModel(customStep: customStepWidget(index: 0, stepIndex: 1), customTitle: customStepLabel(index: 1, label: context.translation.timeAndDuration)),
StepModel(customStep: customStepWidget(index: 1, stepIndex: 2), customTitle: customStepLabel(index: 1, label: context.translation.assetsCondition)),
StepModel(customStep: customStepWidget(index: 2, stepIndex: 3), customTitle: customStepLabel(index: 1, label: context.translation.attachmentsAcknowledge)),
],
onStepReached: (index) => setState(() => activeStep = index),
),
Expanded(
child: Padding(
padding: EdgeInsetsDirectional.symmetric(horizontal: 16.toScreenWidth, vertical: 25.toScreenHeight),
child: getStepWidget(),
)),
bottomContainerWidget(),
],
),
);
}
Widget bottomContainerWidget() {
return Container(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 16.toScreenHeight),
color: AppColor.white10,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
AppFilledButton(
label: context.translation.cancel,
loading: false,
buttonColor: AppColor.white60,
textColor: AppColor.black10,
onPressed: () async {
Navigator.pop(context);
// await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest);
// Navigator.pop(context, true);
},
).expanded,
12.width,
AppFilledButton(
label: context.translation.next,
buttonColor: AppColor.primary10,
loading: false,
onPressed: () {
_incrementActiveStep();
//TODO move to next step..
},
).expanded,
],
));
}
void _incrementActiveStep() {
setState(() {
++activeStep;
if (reachedStep < activeStep) {
reachedStep = activeStep;
}
});
}
Future<void> _navigateNext(ServiceRequestsProvider serviceRequestsProvider) async {
if (activeStep < upperBound) {
switch (activeStep) {
case 0:
// await _navigateNextStep(listingVm);
break;
case 1:
break;
case 2:
_incrementActiveStep();
break;
}
}
}
// Your onPressed code
Widget customStepWidget({required int index, required int stepIndex}) {
return CircleAvatar(
backgroundColor: activeStep >= index ? AppColor.primary10 : AppColor.background(context),
child: activeStep > index
? Icon(
Icons.done,
color: AppColor.white10,
size: 26.toScreenHeight,
)
: activeStep == index
? Text(
'0$stepIndex',
style: const TextStyle(fontWeight: FontWeight.w500, color: AppColor.white10),
textAlign: TextAlign.center,
)
: Text(
'0$stepIndex',
style: const TextStyle(color: AppColor.black20),
),
);
}
Widget customStepLabel({required String label, required int index}) {
return Column(
children: [
Text(
label,
textAlign: TextAlign.center,
style: AppTextStyles.bodyText2.copyWith(color: AppColor.black20),
),
],
);
}
/// Returns the previous button.
Widget getStepWidget() {
switch (activeStep) {
case 0:
return const TimeDurationView();
case 1:
return AssetConditionView();
case 2:
return AttachmentView();
default:
return const SizedBox();
}
}
}
// import 'package:flutter/material.dart';
// import 'package:test_sa/common_widgets/stapper_widget/components/base_step.dart';
// import 'package:test_sa/common_widgets/stapper_widget/components/custom_line.dart';
// import 'package:test_sa/common_widgets/stapper_widget/custom_stepper.dart';
// import 'package:test_sa/controllers/providers/api/service_requests_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/new_views/app_style/app_color.dart';
// import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
// import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
//
// import 'components/asset_conditon_view.dart';
// import 'components/attachments_view.dart';
// import 'components/time_duration_view.dart';
//
// class WorkOrderFormView extends StatefulWidget {
// const WorkOrderFormView({Key? key}) : super(key: key);
//
// @override
// _WorkOrderFormViewState createState() => _WorkOrderFormViewState();
// }
// todo @delete
// class _WorkOrderFormViewState extends State<WorkOrderFormView> {
// int currentStep = 0;
// int activeStep = 0;
// int reachedStep = 0;
// int upperBound = 2;
// final formKey = GlobalKey<FormState>();
//
// @override
// void initState() {
// super.initState();
// }
//
// @override
// Widget build(BuildContext context) {
// return Scaffold(
// backgroundColor: AppColor.neutral100,
// appBar: DefaultAppBar(title: context.translation.createWorkOrder),
// body: Column(
// children: [
// 16.height,
// CustomStepper(
// activeStep: activeStep,
// lineStyle: LineStyle(
// activeLineColor: AppColor.primary10,
// finishedLineColor: AppColor.primary10,
// defaultLineColor: AppColor.white40,
// lineThickness: 1,
// lineLength: 93.toScreenWidth,
// lineType: LineType.normal,
// ),
// internalPadding: 2.toScreenWidth,
// steps: [
// StepModel(customStep: customStepWidget(index: 0, stepIndex: 1), customTitle: customStepLabel(index: 1, label: context.translation.timeAndDuration)),
// StepModel(customStep: customStepWidget(index: 1, stepIndex: 2), customTitle: customStepLabel(index: 1, label: context.translation.assetsCondition)),
// StepModel(customStep: customStepWidget(index: 2, stepIndex: 3), customTitle: customStepLabel(index: 1, label: context.translation.attachmentsAcknowledge)),
// ],
// onStepReached: (index) => setState(() => activeStep = index),
// ),
// Expanded(
// child: Padding(
// padding: EdgeInsetsDirectional.symmetric(horizontal: 16.toScreenWidth, vertical: 25.toScreenHeight),
// child: getStepWidget(),
// )),
// bottomContainerWidget(),
// ],
// ),
// );
// }
//
// Widget bottomContainerWidget() {
// return Container(
// padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 16.toScreenHeight),
// color: AppColor.white10,
// child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// AppFilledButton(
// label: context.translation.cancel,
// loading: false,
// buttonColor: AppColor.white60,
// textColor: AppColor.black10,
// onPressed: () async {
// Navigator.pop(context);
// // await snapshot.updateRequest(user: userProvider.user, request: serviceRequestProvider.serviceRequest);
// // Navigator.pop(context, true);
// },
// ).expanded,
// 12.width,
// AppFilledButton(
// label: context.translation.next,
// buttonColor: AppColor.primary10,
// loading: false,
// onPressed: () {
// _incrementActiveStep();
// //TODO move to next step..
// },
// ).expanded,
// ],
// ));
// }
//
// void _incrementActiveStep() {
// setState(() {
// ++activeStep;
// if (reachedStep < activeStep) {
// reachedStep = activeStep;
// }
// });
// }
//
// Future<void> _navigateNext(ServiceRequestsProvider serviceRequestsProvider) async {
// if (activeStep < upperBound) {
// switch (activeStep) {
// case 0:
// // await _navigateNextStep(listingVm);
// break;
// case 1:
// break;
// case 2:
// _incrementActiveStep();
// break;
// }
// }
// }
//
// // Your onPressed code
//
// Widget customStepWidget({required int index, required int stepIndex}) {
// return CircleAvatar(
// backgroundColor: activeStep >= index ? AppColor.primary10 : AppColor.background(context),
// child: activeStep > index
// ? Icon(
// Icons.done,
// color: AppColor.white10,
// size: 26.toScreenHeight,
// )
// : activeStep == index
// ? Text(
// '0$stepIndex',
// style: const TextStyle(fontWeight: FontWeight.w500, color: AppColor.white10),
// textAlign: TextAlign.center,
// )
// : Text(
// '0$stepIndex',
// style: const TextStyle(color: AppColor.black20),
// ),
// );
// }
//
// Widget customStepLabel({required String label, required int index}) {
// return Column(
// children: [
// Text(
// label,
// textAlign: TextAlign.center,
// style: AppTextStyles.bodyText2.copyWith(color: AppColor.black20),
// ),
// ],
// );
// }
//
// /// Returns the previous button.
//
// Widget getStepWidget() {
// switch (activeStep) {
// case 0:
// return const TimeDurationView();
// case 1:
// return AssetConditionView();
// case 2:
// return AttachmentView();
// default:
// return const SizedBox();
// }
// }
// }

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
@ -157,13 +158,33 @@ void _updateTask({required BuildContext context, required int status}) async {
}
bool validate({required RecurrentWoData model}) {
if (model.recurrentWoTimerModel?.startAt == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (model.recurrentWoTimerModel?.endAt == null) {
Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
bool isTimerPickerEnable = ApiManager.instance.assetGroup?.enabledEngineerTimer ?? false;
if (isTimerPickerEnable) {
if (model.recurrentWoTimerModel?.startAt == null && model.recurrentWoTimePicker == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (model.recurrentWoTimePicker == null) {
if (model.recurrentWoTimerModel?.startAt == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (model.recurrentWoTimerModel?.endAt == null) {
Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
}
}
} else {
if (model.recurrentWoTimerModel?.startAt == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (model.recurrentWoTimerModel?.endAt == null) {
Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
}
}
return true;
}

@ -4,6 +4,7 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
@ -60,38 +61,50 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_formModel.assetTransferAttachments = [];
VisitTimers? deviceTimerPicker;
if (_formModel.deviceTimePicker != null) {
int durationInSecond =
_formModel.deviceTimePicker!.endAt!.difference(_formModel.deviceTimePicker!.startAt!).inSeconds;
deviceTimerPicker = VisitTimers(
int durationInSecond = _formModel.deviceTimePicker!.endAt!.difference(_formModel.deviceTimePicker!.startAt!).inSeconds;
deviceTimerPicker = VisitTimers(
id: 0,
startDateTime: _formModel.deviceTimePicker?.startAt?.toIso8601String(),
endDateTime: _formModel.deviceTimePicker?.endAt?.toIso8601String(),
workingHours: ((durationInSecond) / 60 / 60),
);
}
int workingHours = _formModel.tbsTimer?.endAt!.difference(_formModel.tbsTimer!.startAt!).inSeconds ?? 0;
if (widget.isSender) {
_formModel.senderVisitTimers?.add(deviceTimerPicker!);
_formModel.senderVisitTimers?.add(
VisitTimers(
id: 0,
startDateTime: _formModel.tbsTimer?.startAt?.toIso8601String(),
endDateTime: _formModel.tbsTimer?.endAt?.toIso8601String(),
workingHours: ((workingHours) / 60 / 60),
),
);
if (deviceTimerPicker != null) {
_formModel.senderVisitTimers?.add(deviceTimerPicker);
}
_formModel.timerModelList?.forEach((timer) {
int durationInSecond = timer.endAt!.difference(timer.startAt!).inSeconds;
_formModel.senderVisitTimers?.add(
VisitTimers(
id: 0,
startDateTime: timer.startAt!.toIso8601String(), // Handle potential null
endDateTime: timer.endAt?.toIso8601String(), // Handle potential null
workingHours: ((durationInSecond) / 60 / 60),
),
);
});
_formModel.assetTransferEngineerTimers = _formModel.senderVisitTimers;
} else {
_formModel.receiverVisitTimers?.add(deviceTimerPicker!);
_formModel.receiverVisitTimers?.add(
VisitTimers(
id: 0,
startDateTime: _formModel.tbsTimer?.startAt?.toIso8601String(),
endDateTime: _formModel.tbsTimer?.endAt?.toIso8601String(),
workingHours: ((workingHours) / 60 / 60),
),
);
if (deviceTimerPicker != null) {
_formModel.receiverVisitTimers?.add(deviceTimerPicker);
}
_formModel.timerModelList?.forEach((timer) {
int durationInSecond = timer.endAt!.difference(timer.startAt!).inSeconds;
_formModel.receiverVisitTimers?.add(
VisitTimers(
id: 0,
startDateTime: timer.startAt!.toIso8601String(), // Handle potential null
endDateTime: timer.endAt?.toIso8601String(), // Handle potential null
workingHours: ((durationInSecond) / 60 / 60),
),
);
});
_formModel.assetTransferEngineerTimers = _formModel.receiverVisitTimers;
}
try {
@ -107,29 +120,51 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
} catch (error) {
print(error);
}
if(status ==1){
ServiceRequestBottomSheet.nurseVerifyAssetTransferBottomSheet(context: context,onAckhnowledgePress: (signature) async {
//TODO NEED TO CALL API HERE WITH ADDED PARAMETER FOR SIGNATURE FROM BACKEND..
if(signature!=null){
_formModel.nurseSignature = signature;
await _deviceTransferProvider.updateRequest(context, model: _formModel);
}
});
}else {
if (status == 1) {
ServiceRequestBottomSheet.nurseVerifyAssetTransferBottomSheet(
context: context,
onAckhnowledgePress: (signature) async {
//TODO NEED TO CALL API HERE WITH ADDED PARAMETER FOR SIGNATURE FROM BACKEND..
if (signature != null) {
_formModel.nurseSignature = signature;
await _deviceTransferProvider.updateRequest(context, model: _formModel);
}
});
} else {
await _deviceTransferProvider.updateRequest(context, model: _formModel);
}
}
}
bool _validateForm() {
if (_formModel.tbsTimer?.startAt == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (_formModel.tbsTimer?.endAt == null || isTimerRunning) {
Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
bool isTimerPickerEnable = ApiManager.instance.assetGroup?.enabledEngineerTimer ?? false;
if (isTimerPickerEnable) {
if (_formModel.tbsTimer?.startAt == null && _formModel.deviceTimePicker == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (_formModel.deviceTimePicker == null) {
if (_formModel.tbsTimer?.startAt == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (_formModel.tbsTimer?.endAt == null) {
Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
}
}
} else {
if (_formModel.tbsTimer?.startAt == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (_formModel.tbsTimer?.endAt == null) {
Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
}
}
if (_formModel.assistantEmployees != null) {
if (_formModel.modelAssistantEmployees?.startDate == null) {
Fluttertoast.showToast(msg: "Please Select Assistant Employee Start Time");
@ -237,12 +272,11 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
12.width,
if (!widget.isSender && _formModel.senderMachineStatusValue == 3) ...[
AppFilledButton(
label: context.translation.complete,
buttonColor: AppColor.primary10,
onPressed: (){
_update(status: 1);
}
).expanded,
label: context.translation.complete,
buttonColor: AppColor.primary10,
onPressed: () {
_update(status: 1);
}).expanded,
] else if (widget.isSender) ...[
AppFilledButton(
label: context.translation.complete,
@ -268,11 +302,6 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
}
void updateTimer({TimerModel? timer}) {
_formModel.tbsTimer = timer;
if (timer?.startAt != null && timer?.endAt != null) {
_formModel.timerModelList = _formModel.timerModelList ?? [];
_formModel.timerModelList!.add(timer!);
}
// notifyListeners();
}
@ -283,7 +312,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
AppTimer(
label: context.translation.workingHours,
timer: _formModel.tbsTimer,
pickerFromDate: DateTime.tryParse(widget.model.createdDate??''),
pickerFromDate: DateTime.tryParse(widget.model.createdDate ?? ''),
width: double.infinity,
enabled: isTimerEnable,
decoration: BoxDecoration(
@ -296,7 +325,11 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
},
timerProgress: (isRunning) {},
onChange: (timer) async {
updateTimer(timer: timer);
_formModel.tbsTimer = timer;
if (timer.startAt != null && timer.endAt != null) {
_formModel.timerModelList = _formModel.timerModelList ?? [];
_formModel.timerModelList!.add(timer);
}
return true;
},
),

@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.dart';
import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
@ -91,14 +92,36 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.status}");
return false;
}
if (_formModel.timer?.startAt == null) {
await Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (_formModel.timer?.endAt == null) {
await Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
bool isTimerPickerEnable = ApiManager.instance.assetGroup?.enabledEngineerTimer ?? false;
if (isTimerPickerEnable) {
if (_formModel.timer?.startAt == null && _formModel.gasRefillTimePicker == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (_formModel.gasRefillTimePicker == null) {
if (_formModel.timer?.startAt == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (_formModel.timer?.endAt == null) {
Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
}
}
} else {
if (_formModel.timer?.startAt == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (_formModel.timer?.endAt == null) {
Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
}
}
if (_formModel.gasRefillDetails?.isNotEmpty ?? false) {
if (!(await _addNewModel(context))) return;
}

@ -2,17 +2,15 @@ import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/gas_refill_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/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart';
@ -94,14 +92,34 @@ class _UpdateGasRefillRequestState extends State<UpdateGasRefillRequest> {
}
_onSubmit(BuildContext context, int status) async {
if (_formModel.timer?.startAt == null) {
await Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (_formModel.timer?.endAt == null) {
await Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
bool isTimerPickerEnable = ApiManager.instance.assetGroup?.enabledEngineerTimer ?? false;
if (isTimerPickerEnable) {
if (_formModel.timer?.startAt == null && _formModel.gasRefillTimePicker == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (_formModel.gasRefillTimePicker == null) {
if (_formModel.timer?.startAt == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (_formModel.timer?.endAt == null) {
Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
}
}
} else {
if (_formModel.timer?.startAt == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
return false;
}
if (_formModel.timer?.endAt == null) {
Fluttertoast.showToast(msg: "Please Stop The Timer");
return false;
}
}
if (_currentDetails.deliverdQty == null) {
await Fluttertoast.showToast(msg: "Delivered Quantity is Required");
return false;
@ -112,8 +130,7 @@ class _UpdateGasRefillRequestState extends State<UpdateGasRefillRequest> {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
_formModel.gasRefillTimers = _formModel.gasRefillTimers ?? [];
if (_formModel.gasRefillTimePicker != null) {
int durationInSecond =
_formModel.gasRefillTimePicker!.endAt!.difference(_formModel.gasRefillTimePicker!.startAt!).inSeconds;
int durationInSecond = _formModel.gasRefillTimePicker!.endAt!.difference(_formModel.gasRefillTimePicker!.startAt!).inSeconds;
_formModel.gasRefillTimers?.add(
GasRefillTimer(
id: 0,
@ -286,7 +303,7 @@ class _UpdateGasRefillRequestState extends State<UpdateGasRefillRequest> {
AppTimer(
label: context.translation.workingHours,
timer: _formModel.timer,
pickerFromDate: DateTime.tryParse(widget.gasRefillModel?.createdDate??''),
pickerFromDate: DateTime.tryParse(widget.gasRefillModel?.createdDate ?? ''),
pickerTimer: _formModel.gasRefillTimePicker,
onPick: (time) {
_formModel.gasRefillTimePicker = time;

Loading…
Cancel
Save