//older code. // import 'dart:convert'; // import 'dart:io'; // // import 'package:flutter/foundation.dart'; // import 'package:flutter/material.dart'; // import 'package:fluttertoast/fluttertoast.dart'; // import 'package:provider/provider.dart'; // import 'package:test_sa/controllers/providers/api/device_transfer_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/string_extensions.dart'; // import 'package:test_sa/extensions/widget_extensions.dart'; // import 'package:test_sa/models/device/device_transfer.dart'; // import 'package:test_sa/models/device/asset_transfer_attachment.dart'; // import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; // import 'package:test_sa/providers/asset_transfer/asset_transfer_status_provider.dart'; // import 'package:test_sa/views/app_style/sizing.dart'; // import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; // import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; // // import '../../../extensions/text_extensions.dart'; // import '../../../models/lookup.dart'; // import '../../../models/ppm/ppm.dart'; // import '../../../new_views/app_style/app_color.dart'; // import '../../../new_views/common_widgets/app_text_form_field.dart'; // import '../../../new_views/common_widgets/default_app_bar.dart'; // import '../../../new_views/common_widgets/single_item_drop_down_menu.dart'; // import '../../widgets/e_signature/e_signature.dart'; // import '../../widgets/timer/app_timer.dart'; // // class UpdateDeviceTransfer extends StatefulWidget { // final AssetTransfer model; // final bool isSender; // // const UpdateDeviceTransfer({Key? key, required this.model, required this.isSender}) : super(key: key); // // @override // State createState() => _UpdateDeviceTransferState(); // } // // class _UpdateDeviceTransferState extends State { // final bool _isLoading = false; // bool _validate = false; // late UserProvider _userProvider; // late SettingProvider _settingProvider; // Uint8List? _signature; // late AssetTransferProvider _deviceTransferProvider; // final TextEditingController _requestedQuantityController = TextEditingController(); // final AssetTransfer _formModel = AssetTransfer(); // final GlobalKey _formKey = GlobalKey(); // final GlobalKey _scaffoldKey = GlobalKey(); // // List _files = []; // // _update() async { // if (widget.isSender) { // _formModel.senderVisitTimers?.add( // VisitTimers( // id: 0, // startDateTime: _formModel.tbsTimer?.startAt?.toIso8601String(), // endDateTime: _formModel.tbsTimer?.endAt?.toIso8601String(), // workingHours: ((_formModel.tbsTimer?.durationInSecond ?? 0) / 60 / 60), // ), // ); // } else { // _formModel.receiverVisitTimers?.add( // VisitTimers( // id: 0, // startDateTime: _formModel.tbsTimer?.startAt?.toIso8601String(), // endDateTime: _formModel.tbsTimer?.endAt?.toIso8601String(), // workingHours: ((_formModel.tbsTimer?.durationInSecond ?? 0) / 60 / 60), // ), // ); // } // // if (_formModel.tbsTimer?.startAt == null) { // await Fluttertoast.showToast(msg: "Working Hours Required"); // return false; // } // if (_formModel.tbsTimer?.endAt == null || isTimerRunning) { // await Fluttertoast.showToast(msg: "Please Stop The Timer"); // return false; // } // _validate = true; // if (!(_formKey.currentState!.validate())) { // setState(() {}); // return false; // } // _formKey.currentState!.save(); // // if (widget.isSender) { // _formModel.senderAttachments = []; // } else { // _formModel.receiverAttachments = []; // } // // try { // for (var file in _files) { // String attachmentName = file.path; // if (attachmentName.contains("/")) { // attachmentName = file.path.split("/").last; // attachmentName = "$attachmentName|${base64Encode(file.readAsBytesSync())}"; // } // // if (widget.isSender) { // _formModel.senderAttachments!.add(AssetTransferAttachment(id: 0, attachmentName: attachmentName)); // } else { // _formModel.receiverAttachments!.add(AssetTransferAttachment(id: 0, attachmentName: attachmentName)); // } // } // } catch (error) { // print(error); // } // await _deviceTransferProvider.updateRequest(context, assetTransfer: _formModel, isSender: widget.isSender); // } // // @override // void initState() { // _formModel.fromDetails(widget.model); // // if (widget.isSender) { // _files = widget.model.senderAttachments?.map((e) => File(e.attachmentName!)).toList() ?? []; // } else { // _files = widget.model.receiverAttachments?.map((e) => File(e.attachmentName!)).toList() ?? []; // } // // super.initState(); // } // // @override // void dispose() { // _requestedQuantityController.dispose(); // super.dispose(); // } // // bool isTimerRunning = false; // // @override // Widget build(BuildContext context) { // _userProvider = Provider.of(context); // _settingProvider = Provider.of(context); // _deviceTransferProvider = Provider.of(context, listen: false); // // double totalWorkingHours = widget.isSender // ? (widget.model.senderVisitTimers?.fold(0.0, (sum, item) => (sum ?? 0) + DateTime.parse(item.endDateTime!).difference(DateTime.parse(item.startDateTime!)).inSeconds) ?? 0) // : (widget.model.receiverVisitTimers?.fold(0.0, (sum, item) => (sum ?? 0) + DateTime.parse(item.endDateTime!).difference(DateTime.parse(item.startDateTime!)).inSeconds) ?? 0); // // bool isTimerEnable = widget.isSender // ? (!(_formModel.senderMachineStatusName?.toLowerCase().contains("close") ?? false) || !(_formModel.senderMachineStatusName?.toLowerCase().contains("complete") ?? false)) // : (!(_formModel.receiverMachineStatusName?.toLowerCase().contains("close") ?? false) || !(_formModel.receiverMachineStatusName?.toLowerCase().contains("complete") ?? false)); // // return Scaffold( // appBar: DefaultAppBar(title: context.translation.updateRequest), // key: _scaffoldKey, // body: SafeArea( // child: LoadingManager( // isLoading: _isLoading, // isFailedLoading: false, // stateCode: 200, // onRefresh: () async {}, // child: Form( // key: _formKey, // child: Column( // children: [ // SingleChildScrollView( // padding: EdgeInsets.all(12 * AppStyle.getScaleFactor(context)), // child: Column( // crossAxisAlignment: CrossAxisAlignment.stretch, // children: [ // _buildCard(), // 8.height, // AppTextFormField( // initialValue: widget.isSender ? _formModel.senderTravelingHours ?? "" : _formModel.receiverTravelingHours ?? "", // labelText: context.translation.travelingHours, // onChange: (text) { // widget.isSender ? _formModel.senderTravelingHours = text : _formModel.receiverTravelingHours = text; // }, // onSaved: (value) { // widget.isSender ? _formModel.senderTravelingHours = value : _formModel.receiverTravelingHours = value; // //_formModel?.workingHours = double.tryParse(value); // // _formModel.travelingHours = value; // }, // textInputType: TextInputType.number, // //validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", // ), // 8.height, // if (totalWorkingHours > 0.0) ...[ // Container( // height: 50.toScreenHeight, // padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth), // alignment: Alignment.centerLeft, // decoration: BoxDecoration( // color: context.isDark ? AppColor.neutral40 : AppColor.background(context), // borderRadius: BorderRadius.circular(10), // boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], // ), // child: Column( // crossAxisAlignment: CrossAxisAlignment.start, // mainAxisAlignment: MainAxisAlignment.center, // children: [ // Text( // "Total Working Time", // style: Theme.of(context).textTheme.bodySmall?.copyWith(color: context.isDark ? null : AppColor.neutral20, fontWeight: FontWeight.w500), // ), // Text( // " ${formatDuration(totalWorkingHours.round())}", // style: Theme.of(context).textTheme.bodyLarge, // ), // ], // ), // ), // 8.height, // ], // AppTimer( // label: context.translation.workingHours, // timer: _formModel.tbsTimer, // enabled: isTimerEnable, // // enabled: widget.isSender ? _formModel.senderEndDate == null : (_formModel?.receiverMachineStatusName?.toLowerCase()?.contains("close") ?? false), // timerProgress: (isRunning) { // isTimerRunning = isRunning; // }, // onChange: (timer) async { // _formModel.tbsTimer = timer; // return true; // }, // ), // 8.height, // Consumer(builder: (context, snapshot, _) { // return SingleItemDropDownMenu( // context: context, // title: widget.isSender ? "Status Sender" : "Status Receiver", //,context.translation.reportStatus, // initialValue: // snapshot.items.firstWhere((element) => element.name == (widget.isSender ? _formModel.senderMachineStatusName : _formModel.receiverMachineStatusName), orElse: null), // onSelect: (value) { // if (value?.value == 4) { // "Status cannot be change to ${value?.name}.".addTranslation.showToast; // setState(() {}); // return; // } // if (widget.isSender) { // _formModel.senderMachineStatusName = value?.name; // _formModel.senderMachineStatusId = value?.id; // } else { // _formModel.receiverMachineStatusName = value?.name; // _formModel.receiverMachineStatusId = value?.id; // } // setState(() {}); // }, // ); // }), // 8.height, // MultiFilesPicker(label: context.translation.attachImage, files: _files), // 8.height, // AppTextFormField( // initialValue: widget.isSender ? _formModel.senderComment ?? "" : _formModel.receiverComment ?? "", // labelText: context.translation.comments, // textInputType: TextInputType.multiline, // alignLabelWithHint: true, // onSaved: (value) { // widget.isSender ? _formModel.senderComment = value : _formModel.receiverComment = value; // }, // ), // 8.height, // ESignature( // title: "Signature", // oldSignature: widget.isSender ? widget.model.senderEngSignature : widget.model.receiverEngSignature, // newSignature: _signature, // onSaved: (signature) { // _signature = signature; // if (signature == null || signature.isEmpty) return; // widget.isSender // ? _formModel.senderEngSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}" // : _formModel.receiverEngSignature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; // }, // ), // ], // ), // ).expanded, // Padding( // padding: const EdgeInsets.all(16.0), // child: AppFilledButton( // label: context.translation.update, // onPressed: _update, // ), // ), // ], // ), // ), // ), // ), // ); // } // // _buildCard() { // return Column( // crossAxisAlignment: CrossAxisAlignment.start, // children: [ // context.translation.transferDetails.heading5(context), // 8.height, // '${context.translation.assetName}: ${_formModel.assetName?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context), // '${context.translation.requesterName}: ${_formModel.receiverEndUserName?.cleanupWhitespace.capitalizeFirstOfEach ?? ""}'.bodyText(context), // ], // ).toShadowContainer(context); // } // // String formatDuration(int seconds) { // int hours = seconds ~/ 3600; // int minutes = (seconds % 3600) ~/ 60; // int remainingSeconds = seconds % 60; // // String formattedDuration = ''; // if (hours > 0) { // formattedDuration += '$hours hour${hours > 1 ? 's' : ''} '; // } // if (minutes > 0) { // formattedDuration += '$minutes minute${minutes > 1 ? 's' : ''} '; // } // if (remainingSeconds > 0) { // formattedDuration += '$remainingSeconds second${remainingSeconds > 1 ? 's' : ''} '; // } // if (formattedDuration.isEmpty) { // formattedDuration = 'Less than a second'; // } // // return formattedDuration.trim(); // } // } //.....new design.. import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.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'; import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/asset_transfer_attachment.dart'; import 'package:test_sa/models/new_models/assigned_employee.dart'; import 'package:test_sa/models/new_models/assistant_employee.dart'; import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/service_request_latest/utilities/service_request_utils.dart'; import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/report/service_report_assistant_employee_menu.dart'; import '../../../extensions/text_extensions.dart'; import '../../../models/ppm/ppm.dart'; import '../../../new_views/app_style/app_color.dart'; import '../../../new_views/common_widgets/app_text_form_field.dart'; import '../../../new_views/common_widgets/default_app_bar.dart'; import '../../widgets/timer/app_timer.dart'; class UpdateDeviceTransfer extends StatefulWidget { final DeviceTransfer model; final bool isSender; const UpdateDeviceTransfer({Key? key, required this.model, required this.isSender}) : super(key: key); @override State createState() => _UpdateDeviceTransferState(); } class _UpdateDeviceTransferState extends State { final bool _isLoading = false; late DeviceTransferProvider _deviceTransferProvider; final TextEditingController _requestedQuantityController = TextEditingController(); final DeviceTransfer _formModel = DeviceTransfer(); final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); List _files = []; _update({required int status}) async { if (_formModel.tbsTimer?.startAt == null) { await Fluttertoast.showToast(msg: "Working Hours Required"); return false; } if (_formModel.tbsTimer?.endAt == null || isTimerRunning) { await Fluttertoast.showToast(msg: "Please Stop The Timer"); return false; } if (!(_formKey.currentState!.validate())) { setState(() {}); return false; } _formKey.currentState!.save(); _formModel.statusValue = status; _formModel.isSender = widget.isSender; if (widget.isSender) { _formModel.senderAttachments = []; _formModel.senderVisitTimers?.add( VisitTimers( id: 0, startDateTime: _formModel.tbsTimer?.startAt?.toIso8601String(), endDateTime: _formModel.tbsTimer?.endAt?.toIso8601String(), workingHours: ((_formModel.tbsTimer?.durationInSecond ?? 0) / 60 / 60), ), ); _formModel.assetTransferEngineerTimers = _formModel.senderVisitTimers; } else { _formModel.receiverAttachments = []; _formModel.receiverVisitTimers?.add( VisitTimers( id: 0, startDateTime: _formModel.tbsTimer?.startAt?.toIso8601String(), endDateTime: _formModel.tbsTimer?.endAt?.toIso8601String(), workingHours: ((_formModel.tbsTimer?.durationInSecond ?? 0) / 60 / 60), ), ); _formModel.assetTransferEngineerTimers = _formModel.receiverVisitTimers; } try { for (var file in _files) { String attachmentName = file.path; if (attachmentName.contains("/")) { attachmentName = file.path.split("/").last; attachmentName = "$attachmentName|${base64Encode(file.readAsBytesSync())}"; } if (widget.isSender) { _formModel.senderAttachments!.add(AssetTransferAttachment(id: 0, attachmentName: attachmentName)); _formModel.attachments = _formModel.senderAttachments; } else { _formModel.receiverAttachments!.add(AssetTransferAttachment(id: 0, attachmentName: attachmentName)); _formModel.attachments = _formModel.receiverAttachments; } } } catch (error) { print(error); } await _deviceTransferProvider.updateRequest(context, model: _formModel); } @override void initState() { _formModel.fromDetails(widget.model); if (widget.isSender) { _files = widget.model.senderAttachments?.map((e) => File(e.attachmentName!)).toList() ?? []; } else { _files = widget.model.receiverAttachments?.map((e) => File(e.attachmentName!)).toList() ?? []; } super.initState(); } @override void dispose() { _requestedQuantityController.dispose(); super.dispose(); } bool isTimerRunning = false; @override Widget build(BuildContext context) { _deviceTransferProvider = Provider.of(context, listen: false); double totalWorkingHours = widget.isSender ? (widget.model.senderVisitTimers?.fold(0.0, (sum, item) => (sum ?? 0) + DateTime.parse(item.endDateTime!).difference(DateTime.parse(item.startDateTime!)).inSeconds) ?? 0) : (widget.model.receiverVisitTimers?.fold(0.0, (sum, item) => (sum ?? 0) + DateTime.parse(item.endDateTime!).difference(DateTime.parse(item.startDateTime!)).inSeconds) ?? 0); bool isTimerEnable = widget.isSender ? (!(_formModel.senderMachineStatusName?.toLowerCase().contains("close") ?? false) || !(_formModel.senderMachineStatusName?.toLowerCase().contains("complete") ?? false)) : (!(_formModel.receiverMachineStatusName?.toLowerCase().contains("close") ?? false) || !(_formModel.receiverMachineStatusName?.toLowerCase().contains("complete") ?? false)); return Scaffold( appBar: DefaultAppBar(title: context.translation.transferAsset, onWillPopScope: () { _update(status: 0); },), key: _scaffoldKey, body: SafeArea( child: LoadingManager( isLoading: _isLoading, isFailedLoading: false, stateCode: 200, onRefresh: () async {}, child: Form( key: _formKey, child: Column( children: [ SingleChildScrollView( padding: EdgeInsets.all(12 * AppStyle.getScaleFactor(context)), child: Column( children: [ Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ _timerWidget(context, totalWorkingHours, isTimerEnable), 8.height, AppTextFormField( initialValue: widget.isSender ? _formModel.senderComment ?? "" : _formModel.receiverComment ?? "", labelText: context.translation.technicalComment, labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.neutral20), textInputType: TextInputType.multiline, backgroundColor: AppColor.neutral100, showShadow: false, alignLabelWithHint: true, onSaved: (value) { widget.isSender ? _formModel.senderComment = value : _formModel.receiverComment = value; }, ), 8.height, MultiFilesPicker( label: context.translation.attachFiles, files: _files, buttonColor: AppColor.black10, onlyImages: false, buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), ), 8.height, ], ).toShadowContainer(context), 16.height, AssistantEmployeeCard( isSender: widget.isSender, formModel: _formModel, ).toShadowContainer(context, paddingObject: const EdgeInsets.symmetric(horizontal: 16)), ], ), ).expanded, FooterActionButton.footerContainer( child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ AppFilledButton( label: context.translation.save, buttonColor: AppColor.white60, textColor: AppColor.black10, onPressed: () => _update(status: 0), ).expanded, 12.width, AppFilledButton( label: context.translation.complete, buttonColor: AppColor.primary10, onPressed: () => _update(status: 1), ).expanded, ], ), ), ], ), ), ), ), ).handlePopScope( cxt: context, onSave: () { _update(status: 0); }); } void updateTimer({TimerModel? timer}) { _formModel.tbsTimer = timer; if (timer?.startAt != null && timer?.endAt != null) { _formModel.timerModelList = _formModel.timerModelList ?? []; _formModel.timerModelList!.add(timer!); } // notifyListeners(); } Widget _timerWidget(BuildContext context, double totalWorkingHours, bool isTimerEnable) { return Column( mainAxisSize: MainAxisSize.min, children: [ AppTimer( label: context.translation.workingHours, timer: _formModel.tbsTimer, width: double.infinity, enabled: isTimerEnable, decoration: BoxDecoration( color: AppColor.neutral100, borderRadius: BorderRadius.circular(10), ), timerProgress: (isRunning) {}, onChange: (timer) async { updateTimer(timer: timer); return true; }, ), if (totalWorkingHours > 0.0) ...[ 12.height, Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start, children: [ 'Total Working Time:'.bodyText2(context).custom(color: AppColor.neutral120), 8.width, Text( ServiceRequestUtils.formatTimerDuration(totalWorkingHours.round()), style: AppTextStyles.bodyText.copyWith(color: AppColor.neutral50, fontWeight: FontWeight.w600), ), ], ), ], ], ); } } class AssistantEmployeeCard extends StatefulWidget { bool? isSender = false; DeviceTransfer? formModel; AssistantEmployeeCard({super.key, this.isSender, this.formModel}); @override State createState() => _AssistantEmployeeCardState(); } class _AssistantEmployeeCardState extends State { final TextEditingController _workingHoursController = TextEditingController(text: ''); bool isCurrentUserIsAssistantEmp = false; bool isExpanded = false; List employeeList = []; AssistantEmployees selectedEmployee = AssistantEmployees(); @override void initState() { WidgetsBinding.instance.addPostFrameCallback((_) { getInitialData(); }); super.initState(); } Future getInitialData() async { if (widget.isSender!) { employeeList = widget.formModel!.assetTransferAssistantEmployeesSender ?? []; } else { employeeList = widget.formModel!.assetTransferAssistantEmployeesReceiver ?? []; } widget.formModel?.modelAssistantEmployees = employeeList.isEmpty ? AssetTransferAssistantEmployees() : employeeList[0]; AssignedEmployee? assignedUser = AssignedEmployee(); if (employeeList.isNotEmpty) { assignedUser = AssignedEmployee( id: employeeList[0].employeeId, name: employeeList[0].employeeName, ); } selectedEmployee = AssistantEmployees(userId: assignedUser.id, user: assignedUser); } @override void dispose() { _workingHoursController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Column( children: [ SizedBox( height: 56.toScreenHeight, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ context.translation.assistantEmployee.heading6(context).custom(color: AppColor.black10), Icon(isExpanded ? Icons.keyboard_arrow_up_rounded : Icons.keyboard_arrow_down_rounded), ], ), ).onPress(() { setState(() { isExpanded = !isExpanded; }); }), isExpanded ? Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ ServiceReportAssistantEmployeeMenu( title: context.translation.select, backgroundColor: AppColor.neutral100, assetId: widget.formModel?.assetId ?? 0, initialValue: selectedEmployee, onSelect: (employee) { if (employee == null) { widget.formModel?.assistantEmployees = []; } else { selectedEmployee = employee; widget.formModel?.assistantEmployees = [employee.copyWith(id: 0)]; widget.formModel?.modelAssistantEmployees?.employeeId = employee.user?.id; } }, ), 8.height, Row( mainAxisSize: MainAxisSize.min, children: [ ADatePicker( label: context.translation.startTime, hideShadow: true, backgroundColor: AppColor.neutral100, date: widget.formModel?.modelAssistantEmployees?.startDate, 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, ); widget.formModel?.modelAssistantEmployees?.startDate = selectedDateTime; ServiceRequestUtils.calculateAndAssignWorkingHours( startTime: widget.formModel?.modelAssistantEmployees?.startDate, endTime: widget.formModel?.modelAssistantEmployees?.endDate, workingHoursController: _workingHoursController, updateModel: (hours) { widget.formModel?.modelAssistantEmployees?.workingHours = hours; }); setState(() {}); } }); }, ).expanded, 8.width, ADatePicker( label: context.translation.endTime, hideShadow: true, backgroundColor: AppColor.neutral100, date: widget.formModel?.modelAssistantEmployees?.endDate, formatDateWithTime: true, onDatePicker: (selectedDate) { showTimePicker( context: context, initialTime: TimeOfDay.now(), ).then((selectedTime) { if (selectedTime != null) { DateTime selectedDateTime = DateTime( selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute, ); if (widget.formModel?.modelAssistantEmployees?.startDate != null && selectedDateTime.isBefore(widget.formModel!.modelAssistantEmployees!.startDate!)) { "End Date time must be greater then start date".showToast; return; } widget.formModel?.modelAssistantEmployees?.endDate = selectedDateTime; ServiceRequestUtils.calculateAndAssignWorkingHours( startTime: widget.formModel?.modelAssistantEmployees?.startDate, endTime: widget.formModel?.modelAssistantEmployees?.endDate, workingHoursController: _workingHoursController, updateModel: (hours) { widget.formModel?.modelAssistantEmployees?.workingHours = hours; }); setState(() {}); } }); }, ).expanded, ], ), 8.height, AppTextFormField( labelText: context.translation.workingHours, backgroundColor: AppColor.neutral80, controller: _workingHoursController, suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16), initialValue: widget.formModel?.modelAssistantEmployees?.workingHours != null ? widget.formModel?.modelAssistantEmployees?.workingHours.toString() : '', textAlign: TextAlign.center, labelStyle: AppTextStyles.textFieldLabelStyle, enable: false, showShadow: false, style: Theme.of(context).textTheme.titleMedium, ), 8.height, AppTextFormField( initialValue: widget.formModel?.modelAssistantEmployees?.techComment, labelText: context.translation.technicalComment, backgroundColor: AppColor.neutral100, showShadow: false, labelStyle: AppTextStyles.textFieldLabelStyle, alignLabelWithHint: true, textInputType: TextInputType.multiline, onChange: (value) { widget.formModel?.modelAssistantEmployees?.techComment = value; }, onSaved: (value) { widget.formModel?.modelAssistantEmployees?.techComment = value; }, ), 16.height, ], ) : const SizedBox(), ], ); } }