diff --git a/lib/helper/utils.dart b/lib/helper/utils.dart index 9162129d..b56c7474 100644 --- a/lib/helper/utils.dart +++ b/lib/helper/utils.dart @@ -49,7 +49,19 @@ class Utils { return null; } } - +static String getOrdinal(int number) { + if (number >= 11 && number <= 13) return "${number}th"; + switch (number % 10) { + case 1: + return "${number}st"; + case 2: + return "${number}nd"; + case 3: + return "${number}rd"; + default: + return "${number}th"; + } +} static int stringToHex(String colorCode) { try { return int.parse(colorCode.replaceAll("#", "0xff")); diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index 10393a2e..c8620eaf 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -1,6 +1,7 @@ import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/new_models/assistant_employee.dart'; +import 'package:test_sa/models/new_models/work_order_detail_model.dart'; import 'package:test_sa/models/ppm/ppm.dart'; import 'package:test_sa/models/timer_model.dart'; @@ -89,8 +90,10 @@ class DeviceTransfer { this.timerModelList, this.assistantEmployees, this.modelAssistantEmployees, + this.assistantEmployList, this.assetTransferAssistantEmployeesReceiver, this.assetTransferAssistantEmployeesSender, + this.statusValue, }); @@ -305,10 +308,11 @@ class DeviceTransfer { List? assetTransferEngineerTimers; List? timerModelList = []; List? assistantEmployees; - List? assetTransferAssistantEmployeesSender; - List? assetTransferAssistantEmployeesReceiver; + List? assetTransferAssistantEmployeesSender=[]; + List? assetTransferAssistantEmployeesReceiver=[]; List? assetTransferContactPersons; AssetTransferAssistantEmployees? modelAssistantEmployees; + List? assistantEmployList=[]; TimerModel? tbsTimer = TimerModel(); TimerModel? deviceTimePicker; @@ -384,6 +388,7 @@ class DeviceTransfer { String? destDepartmentName, List? senderVisitTimers, List? receiverVisitTimers, + List? assistantEmployList, TimerModel? tbsTimer, TimerModel? deviceTimePicker}) => DeviceTransfer( @@ -457,6 +462,7 @@ class DeviceTransfer { senderVisitTimers: senderVisitTimers ?? this.senderVisitTimers, receiverVisitTimers: receiverVisitTimers ?? this.receiverVisitTimers, tbsTimer: tbsTimer ?? this.tbsTimer, + assistantEmployList: assistantEmployList??this.assistantEmployList, deviceTimePicker: deviceTimePicker ?? this.deviceTimePicker, manufacturerName: manufacturerName ?? this.manufacturerName); @@ -573,13 +579,18 @@ class DeviceTransfer { if (assetTransferEngineerTimers != null) { map['assetTransferEngineerTimers'] = assetTransferEngineerTimers!.map((v) => v.toJson()).toList(); } - if (modelAssistantEmployees != null) { - if (modelAssistantEmployees!.employeeId != null) { - map['assetTransferAssistantEmployees'] = [modelAssistantEmployees!.toJson()]; - } else { - map['assetTransferAssistantEmployees'] = []; - } + if (assistantEmployList != null && assistantEmployList!.isNotEmpty) { + map['assetTransferAssistantEmployees'] = assistantEmployList; + } else { + map['assetTransferAssistantEmployees'] = []; } + // if (modelAssistantEmployees != null) { + // if (modelAssistantEmployees!.employeeId != null) { + // map['assetTransferAssistantEmployees'] = [modelAssistantEmployees!.toJson()]; + // } else { + // map['assetTransferAssistantEmployees'] = []; + // } + // } return map; } diff --git a/lib/models/helper_data_models/maintenance_request/activity_maintenance_model.dart b/lib/models/helper_data_models/maintenance_request/activity_maintenance_model.dart index 0089a302..dda5432b 100644 --- a/lib/models/helper_data_models/maintenance_request/activity_maintenance_model.dart +++ b/lib/models/helper_data_models/maintenance_request/activity_maintenance_model.dart @@ -35,6 +35,7 @@ class ActivityMaintenanceHelperModel { List? activityMaintenanceTimers = []; TimerModel? activityMaintenanceTimerModel = TimerModel(); TimerModel? activityTimePicker; + List? assistantEmployList=[]; List? timerModelList = []; ActivityMaintenanceHelperModel( @@ -63,6 +64,7 @@ class ActivityMaintenanceHelperModel { this.assignedEmployee, this.activityMaintenanceTimers, this.timerModelList, + this.assistantEmployList, this.modelAssistantEmployees}); Map toJson() { @@ -85,11 +87,17 @@ class ActivityMaintenanceHelperModel { data['supplierWorkingHour'] = supplierWorkingHour; //TODO fix this properly... data['activityMaintenanceTimers'] = activityMaintenanceTimers; - if (assistantEmployees != null && assistantEmployees!.isNotEmpty) { - data['assistantEmployees'] = [modelAssistantEmployees?.toJson()]; + if (assistantEmployList != null && assistantEmployList!.isNotEmpty) { + data['assistantEmployees'] = assistantEmployList; } else { data['assistantEmployees'] = []; } + //TODO need to remove this .. its not required now + // if (assistantEmployees != null && assistantEmployees!.isNotEmpty) { + // data['assistantEmployees'] = [modelAssistantEmployees?.toJson()]; + // } else { + // data['assistantEmployees'] = []; + // } return data; } } diff --git a/lib/models/new_models/work_order_detail_model.dart b/lib/models/new_models/work_order_detail_model.dart index 8b26ec59..18041173 100644 --- a/lib/models/new_models/work_order_detail_model.dart +++ b/lib/models/new_models/work_order_detail_model.dart @@ -692,7 +692,7 @@ class ActivityMaintenance { String? supplierEndTime; double? supplierWorkingHours; String? activityType; - List? assistantEmployees; + List? assistantEmployees; List? activityMaintenanceTimers; ActivityMaintenance( @@ -735,9 +735,9 @@ class ActivityMaintenance { supplierEndTime = json['supplierEndTime']; supplierWorkingHours = json['supplierWorkingHours']; if (json['assistantEmployees'] != null) { - assistantEmployees = []; + assistantEmployees = []; json['assistantEmployees'].forEach((v) { - assistantEmployees!.add(ActivityMaintenanceAssistantEmployees.fromJson(v)); + assistantEmployees!.add(AssistantEmployeesModel.fromJson(v)); }); } if (json['activityMaintenanceTimers'] != null) { @@ -922,3 +922,48 @@ class ActivityMaintenanceTimers { return data; } } + + +class AssistantEmployeesModel { + DateTime? startDate; + DateTime? endDate; + double? workingHours; + String? technicalComment; + AssignedEmployee? user; + AssistantEmployees ?employee; + + AssistantEmployeesModel({this.startDate, this.endDate, this.workingHours, this.technicalComment, this.user,this.employee}); + + AssistantEmployeesModel.fromJson(Map json) { + Map assistEmpData={}; + + + startDate = json['startDate'] != null ? DateTime.parse(json['startDate']) : null; + endDate = json['endDate'] != null ? DateTime.parse(json['endDate']) : null; + workingHours = json['workingHours']; + technicalComment = json['technicalComment']; + user = json['user'] != null ? AssignedEmployee.fromJson(json['user']) : null; + if(json['user']!=null) { + assistEmpData = { + 'id': null, + 'user': { + 'id': user?.userId, + 'name': user?.userName, + }, + }; + } + employee = AssistantEmployees.fromJson(assistEmpData); + } + + Map toJson() { + final Map data = {}; + data['startDate'] = startDate?.toIso8601String(); + data['endDate'] = endDate?.toIso8601String(); + data['workingHours'] = workingHours; + data['technicalComment'] = technicalComment; + if (user != null) { + data['userId'] = user?.userId; + } + return data; + } +} diff --git a/lib/modules/cm_module/views/components/activities_list_view.dart b/lib/modules/cm_module/views/components/activities_list_view.dart index 300beeea..c40f5c81 100644 --- a/lib/modules/cm_module/views/components/activities_list_view.dart +++ b/lib/modules/cm_module/views/components/activities_list_view.dart @@ -311,19 +311,19 @@ class _ActivitiesListViewState extends State { } void editMaintenanceRequest({required BuildContext context, required ServiceRequestDetailProvider requestDetailProvider, required Activities activity}) async { - Map assistEmpData = {}; + // Map assistEmpData = {}; try { - if (activity.activityMaintenance?.assistantEmployees != null && activity.activityMaintenance!.assistantEmployees!.isNotEmpty) { - assistEmpData = { - // 'id': activity.activityMaintenance?.assistantEmployees?[0].user?.userId != null ? num.tryParse(activity.activityMaintenance!.assistantEmployees![0].user!.userId!) : null, - 'id': null, - 'user': { - 'id': activity.activityMaintenance?.assistantEmployees?[0].user?.userId, - // 'id': activity.activityMaintenance?.assistantEmployees?[0].user?.userId != null ? num.tryParse(activity.activityMaintenance!.assistantEmployees![0].user!.userId!) : null, - 'name': activity.activityMaintenance?.assistantEmployees?[0].user?.userName, - }, - }; - } + // if (activity.activityMaintenance?.assistantEmployees != null && activity.activityMaintenance!.assistantEmployees!.isNotEmpty) { + // assistEmpData = { + // // 'id': activity.activityMaintenance?.assistantEmployees?[0].user?.userId != null ? num.tryParse(activity.activityMaintenance!.assistantEmployees![0].user!.userId!) : null, + // 'id': null, + // 'user': { + // 'id': activity.activityMaintenance?.assistantEmployees?[0].user?.userId, + // // 'id': activity.activityMaintenance?.assistantEmployees?[0].user?.userId != null ? num.tryParse(activity.activityMaintenance!.assistantEmployees![0].user!.userId!) : null, + // 'name': activity.activityMaintenance?.assistantEmployees?[0].user?.userName, + // }, + // }; + // } requestDetailProvider.activityMaintenanceHelperModel = ActivityMaintenanceHelperModel( id: activity.id, @@ -337,10 +337,11 @@ class _ActivitiesListViewState extends State { // lastSituation: activity.activityMaintenance?.lastSituation, assignedEmployee: activity.activityMaintenance?.assignedEmployee != null ? WorkOrderAssignedEmployee.fromJson(activity.activityMaintenance!.assignedEmployee!.toJson()) : null, technicalComment: activity.activityMaintenance?.technicalComment, - assistantEmployees: - activity.activityMaintenance?.assistantEmployees != null && activity.activityMaintenance!.assistantEmployees!.isNotEmpty ? [AssistantEmployees.fromJson(assistEmpData)] : [], - modelAssistantEmployees: - activity.activityMaintenance?.assistantEmployees != null && activity.activityMaintenance!.assistantEmployees!.isNotEmpty ? activity.activityMaintenance!.assistantEmployees![0] : null, + assistantEmployList:activity.activityMaintenance!.assistantEmployees??[] , + // assistantEmployees: + // activity.activityMaintenance?.assistantEmployees != null && activity.activityMaintenance!.assistantEmployees!.isNotEmpty ? [AssistantEmployees.fromJson(assistEmpData)] : [], + // modelAssistantEmployees: + // activity.activityMaintenance?.assistantEmployees != null && activity.activityMaintenance!.assistantEmployees!.isNotEmpty ? activity.activityMaintenance!.assistantEmployees![0] : null, supplierStartTime: activity.activityMaintenance?.supplierStartTime != null ? DateTime.parse(activity.activityMaintenance!.supplierStartTime!) : null, supplierEndTime: activity.activityMaintenance?.supplierEndTime != null ? DateTime.parse(activity.activityMaintenance!.supplierEndTime!) : null, supplierWorkingHour: activity.activityMaintenance?.supplierWorkingHours, diff --git a/lib/modules/cm_module/views/forms/maintenance_request/components/assistant_employee_list.dart b/lib/modules/cm_module/views/forms/maintenance_request/components/assistant_employee_list.dart index a65b3f70..3c09f7bd 100644 --- a/lib/modules/cm_module/views/forms/maintenance_request/components/assistant_employee_list.dart +++ b/lib/modules/cm_module/views/forms/maintenance_request/components/assistant_employee_list.dart @@ -15,89 +15,131 @@ import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/status/report/service_report_assistant_employee_menu.dart'; class AssistantEmployeeList extends StatefulWidget { - List? assistantEmployeeList; + final List? assistantEmployeeList; + final ValueChanged>? onListChanged; + final double? cardPadding; + final dynamic assetId; - AssistantEmployeeList({super.key, this.assistantEmployeeList = const []}); + const AssistantEmployeeList({ + super.key, + this.assistantEmployeeList, + this.onListChanged, + required this.assetId, + this.cardPadding, + }); @override State createState() => _AssistantEmployeeListState(); } class _AssistantEmployeeListState extends State { - bool status = false; - final TextEditingController _workingHoursController = TextEditingController(text: ''); - bool isCurrentUserIsAssistantEmp = false; - bool isExpanded = false; + late List _list; + late List _controllers; + + @override + void initState() { + super.initState(); + _list = List.from(widget.assistantEmployeeList ?? []); + _controllers = _list.map((e) => TextEditingController(text: e.workingHours?.toString() ?? '')).toList(); + } void _addNewEntry() { - WidgetsBinding.instance.addPostFrameCallback((_) { - setState(() { - widget.assistantEmployeeList!.add(ActivityMaintenanceAssistantEmployees()); - }); + setState(() { + _list.add(AssistantEmployeesModel()); + _controllers.add(TextEditingController()); }); + widget.onListChanged?.call(_list); } void _removeEntry(int index) { setState(() { - setState(() { - widget.assistantEmployeeList!.removeAt(index); - }); + _list.removeAt(index); + _controllers.removeAt(index); }); + widget.onListChanged?.call(_list); } - @override - void dispose() { - _workingHoursController.dispose(); - super.dispose(); + void _updateModel(int index, void Function(AssistantEmployeesModel model) updateList) { + setState(() { + updateList(_list[index]); + }); } @override Widget build(BuildContext context) { - return Consumer(builder: (context, requestDetailProvider, child) { - return ListView.builder( - itemCount: widget.assistantEmployeeList!.length + 1, - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - padding: const EdgeInsets.all(16), - itemBuilder: (context, index) { - if (index == widget.assistantEmployeeList!.length) { - return Visibility( - visible: !requestDetailProvider.isReadOnlyRequest, - child: AppFilledButton( - label: "Add Assistant Employee".addTranslation, - maxWidth: true, - textColor: AppColor.black10, - buttonColor: context.isDark ? AppColor.neutral60 : AppColor.white10, - icon: Icon(Icons.add_circle, color: AppColor.blueStatus(context)), - showIcon: true, - onPressed: _addNewEntry, - ), - ); - } - ActivityMaintenanceAssistantEmployees model = widget.assistantEmployeeList![index]; - return employeeCard(model: model, requestDetailProvider: requestDetailProvider, index: index) - .toShadowContainer(context, paddingObject: const EdgeInsets.symmetric(horizontal: 16, vertical: 12)) - .paddingOnly(bottom: 12); - }, - ); - }); + final isReadOnly = Provider.of(context, listen: false).isReadOnlyRequest; + return ListView.builder( + itemCount: _list.length + 1, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + padding: EdgeInsets.all(widget.cardPadding ?? 16), + itemBuilder: (context, index) { + if (index == _list.length) { + return Visibility( + visible: !isReadOnly, + child: AppFilledButton( + label: "Add Assistant Employee".addTranslation, + maxWidth: true, + textColor: AppColor.black10, + buttonColor: context.isDark ? AppColor.neutral60 : AppColor.white10, + icon: Icon(Icons.add_circle, color: AppColor.blueStatus(context)), + showIcon: true, + onPressed: _addNewEntry, + ), + ); + } + return EmployeeCard( + model: _list[index], + assetId: widget.assetId, + index: index, + isReadOnly: isReadOnly, + onUpdate: (updateList) => _updateModel(index, updateList), + onRemove: () => _removeEntry(index), + workingHoursController: _controllers[index], + ); + }, + ); } +} + +class EmployeeCard extends StatelessWidget { + final AssistantEmployeesModel model; + final int index; + final bool isReadOnly; + final dynamic assetId; + + final void Function(void Function(AssistantEmployeesModel model)) onUpdate; + final VoidCallback onRemove; + final TextEditingController workingHoursController; + + const EmployeeCard({ + super.key, + required this.model, + required this.assetId, + required this.index, + required this.isReadOnly, + required this.onUpdate, + required this.onRemove, + required this.workingHoursController, + }); + + @override + Widget build(BuildContext context) { + final requestedDate = Provider.of(context, listen: false).currentWorkOrder?.data?.requestedDate; - Widget employeeCard({required ActivityMaintenanceAssistantEmployees model, required ServiceRequestDetailProvider requestDetailProvider, required int index}) { return Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ context.translation.assistantEmployee.bodyText(context).custom(color: AppColor.black20), - Container( - height: 32, - width: 32, - padding: const EdgeInsets.all(6), - child: "trash".toSvgAsset(height: 20, width: 20), - ).onPress(() { - _removeEntry(index); - }), + if (!isReadOnly) + Container( + height: 32, + width: 32, + padding: const EdgeInsets.all(6), + child: "trash".toSvgAsset(height: 20, width: 20), + ).onPress(onRemove), ], ), 8.height, @@ -107,12 +149,17 @@ class _AssistantEmployeeListState extends State { ServiceReportAssistantEmployeeMenu( title: context.translation.select, backgroundColor: AppColor.neutral100, - assetId: requestDetailProvider.currentWorkOrder!.data!.asset!.id!, + assetId: assetId, initialValue: model.employee, onSelect: (employee) { if (employee != null) { - model.employee = employee.copyWith(id: 0); - model.user = AssignedEmployee(userId: employee.user?.id, userName: employee.user?.name); + onUpdate((model) { + model.employee = employee.copyWith(id: 0); + model.user = AssignedEmployee( + userId: employee.user?.id, + userName: employee.user?.name, + ); + }); } }, ), @@ -126,41 +173,40 @@ class _AssistantEmployeeListState extends State { backgroundColor: AppColor.neutral100, date: model.startDate, formatDateWithTime: true, - from: requestDetailProvider.currentWorkOrder?.data?.requestedDate, + from: requestedDate, 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.currentWorkOrder?.data?.requestedDate != null && selectedDateTime.isBefore(requestDetailProvider.currentWorkOrder!.data!.requestedDate!)) { + final selectedDateTime = DateTime( + selectedDate.year, + selectedDate.month, + selectedDate.day, + selectedTime.hour, + selectedTime.minute, + ); + + if (requestedDate != null && selectedDateTime.isBefore(requestedDate)) { "Start time is before the request time.".showToast; - selectedTime = null; return; } + if (selectedDateTime.isAfter(DateTime.now())) { - "Start time is after than current time".showToast; - selectedTime = null; + "Start time is after the current time".showToast; return; } - // DateTime selectedDateTime = DateTime( - // selectedDate.year, - // selectedDate.month, - // selectedDate.day, - // selectedTime.hour, - // selectedTime.minute, - // ); - model.startDate = selectedDateTime; - requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel); - ServiceRequestUtils.calculateAndAssignWorkingHours( + + onUpdate((model) { + model.startDate = selectedDateTime; + ServiceRequestUtils.calculateAndAssignWorkingHours( startTime: model.startDate, endTime: model.endDate, - workingHoursController: _workingHoursController, - updateModel: (hours) { - model.workingHours = hours; - }); + workingHoursController: workingHoursController, + updateModel: (hours) => model.workingHours = hours, + ); + }); } }); }, @@ -171,36 +217,41 @@ class _AssistantEmployeeListState extends State { hideShadow: true, backgroundColor: AppColor.neutral100, date: model.endDate, - from: requestDetailProvider.currentWorkOrder?.data?.requestedDate, formatDateWithTime: true, + from: requestedDate, onDatePicker: (selectedDate) { showTimePicker( context: context, initialTime: TimeOfDay.now(), ).then((selectedTime) { - // Handle the selected date and time here. if (selectedTime != null) { - selectedDate = selectedDate.add(Duration(hours: selectedTime.hour, minutes: selectedTime.minute)); - bool isBeforeCurrentTime = selectedDate.isBefore(DateTime.now()); - bool isAfterStartTime = selectedDate.isAfter(requestDetailProvider.activityMaintenanceHelperModel!.modelAssistantEmployees!.startDate!); - if (!isBeforeCurrentTime) { + final endDateTime = DateTime( + selectedDate.year, + selectedDate.month, + selectedDate.day, + selectedTime.hour, + selectedTime.minute, + ); + + if (!endDateTime.isBefore(DateTime.now())) { "Please select a time before the current time.".showToast; return; } - if (!isAfterStartTime) { - "End Date time must be greater then start date".showToast; + + if (model.startDate == null || !endDateTime.isAfter(model.startDate!)) { + "End date must be after start date".showToast; return; } - model.endDate = selectedDate; - requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel); - ServiceRequestUtils.calculateAndAssignWorkingHours( + onUpdate((model) { + model.endDate = endDateTime; + ServiceRequestUtils.calculateAndAssignWorkingHours( startTime: model.startDate, endTime: model.endDate, - workingHoursController: _workingHoursController, - updateModel: (hours) { - model.workingHours = hours; - }); + workingHoursController: workingHoursController, + updateModel: (hours) => model.workingHours = hours, + ); + }); } }); }, @@ -211,13 +262,12 @@ class _AssistantEmployeeListState extends State { AppTextFormField( labelText: context.translation.workingHours, backgroundColor: AppColor.neutral80, - controller: _workingHoursController, + controller: workingHoursController, suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16), - initialValue: model.workingHours != null ? model.workingHours.toString() : '', textAlign: TextAlign.center, - labelStyle: AppTextStyles.textFieldLabelStyle, enable: false, showShadow: false, + labelStyle: AppTextStyles.textFieldLabelStyle, style: Theme.of(context).textTheme.titleMedium, ), 8.height, @@ -229,18 +279,13 @@ class _AssistantEmployeeListState extends State { labelStyle: AppTextStyles.textFieldLabelStyle, alignLabelWithHint: true, textInputType: TextInputType.multiline, - onChange: (value) { - model.technicalComment = value; - }, - onSaved: (value) { - model.technicalComment = value; - }, + onChange: (value) => onUpdate((model) => model.technicalComment = value), + // onSaved: (value) => onUpdate((model) => model.technicalComment = value), ), 8.height, ], ) - // : const SizedBox(), ], - ); + ).toShadowContainer(context, paddingObject: const EdgeInsets.symmetric(horizontal: 16, vertical: 12)).paddingOnly(bottom: 12); } } diff --git a/lib/modules/cm_module/views/forms/maintenance_request/components/internal_request.dart b/lib/modules/cm_module/views/forms/maintenance_request/components/internal_request.dart index 90d0d0ca..74053c1f 100644 --- a/lib/modules/cm_module/views/forms/maintenance_request/components/internal_request.dart +++ b/lib/modules/cm_module/views/forms/maintenance_request/components/internal_request.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_repair_location_provider.dart'; @@ -15,8 +16,6 @@ import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart import 'package:test_sa/providers/service_request_providers/last_situation_provider.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; -import 'assistant_employee_card.dart'; - class InternalMaintenanceRequest extends StatefulWidget { static const String id = "/add-internal-activity"; @@ -299,7 +298,15 @@ class _InternalMaintenanceRequestState extends State ], ), ).toShadowContainer(context).paddingOnly(start: 13, end: 14, top: 12), - AssistantEmployeeList(assistantEmployeeList: requestDetailProvider.activityMaintenanceHelperModel?.assistantEmployList,), + AssistantEmployeeList( + assetId: requestDetailProvider.currentWorkOrder?.data?.asset?.id, + assistantEmployeeList: requestDetailProvider.activityMaintenanceHelperModel?.assistantEmployList, + onListChanged: (updatedList) { + setState(() { + requestDetailProvider.activityMaintenanceHelperModel?.assistantEmployList = updatedList; + }); + }, + ), // const AssistantEmployeeCard().toShadowContainer(context, paddingObject: const EdgeInsets.symmetric(horizontal: 16)).paddingOnly(start: 13, end: 14, top: 12), 100.height, ], diff --git a/lib/modules/cm_module/views/forms/maintenance_request/maintenance_request_main.dart b/lib/modules/cm_module/views/forms/maintenance_request/maintenance_request_main.dart index 2ed7697e..f6397770 100644 --- a/lib/modules/cm_module/views/forms/maintenance_request/maintenance_request_main.dart +++ b/lib/modules/cm_module/views/forms/maintenance_request/maintenance_request_main.dart @@ -7,6 +7,7 @@ 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/helper/utils.dart'; import 'package:test_sa/models/helper_data_models/maintenance_request/activity_maintenance_model.dart'; import 'package:test_sa/models/new_models/work_order_detail_model.dart'; import 'package:test_sa/modules/cm_module/service_request_detail_provider.dart'; @@ -40,8 +41,9 @@ class _MaintenanceRequestFormState extends State with Si Future getInitialData() async { Provider.of(context, listen: false).getTypes(); ServiceRequestDetailProvider requestDetailProvider = Provider.of(context, listen: false); - requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees = - requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees ?? ActivityMaintenanceAssistantEmployees(); + // requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees = + // requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees ?? ActivityMaintenanceAssistantEmployees(); + requestDetailProvider.activityMaintenanceHelperModel?.assistantEmployList = requestDetailProvider.activityMaintenanceHelperModel?.assistantEmployList ?? []; } @override @@ -147,6 +149,7 @@ class _MaintenanceRequestFormState extends State with Si ), ); }); + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); if (requestDetailProvider.activityMaintenanceHelperModel?.id == 0) { await requestDetailProvider.createActivityMaintenanceRequest().then((success) { @@ -201,6 +204,36 @@ class _MaintenanceRequestFormState extends State with Si return false; } } +// assistant employee validation + if (model.assistantEmployList?.isNotEmpty ?? false) { + for (int i = 0; i < model.assistantEmployList!.length; i++) { + final employee = model.assistantEmployList![i]; + final position = Utils.getOrdinal(i + 1); + + if (employee.user == null) { + Fluttertoast.showToast( + msg: "Please select the $position assistant employee", + ); + return false; + } + + if (employee.user?.userId != null) { + if (employee.startDate == null) { + Fluttertoast.showToast( + msg: "Please select start time for assistant employee ${employee.user?.userName}", + ); + return false; + } + + if (employee.endDate == null) { + Fluttertoast.showToast( + msg: "Please select end time for assistant employee ${employee.user?.userName}", + ); + return false; + } + } + } + } // // if (model.activityMaintenanceTimerModel?.startAt == null) { diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index 5270c36e..78fdd685 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -10,6 +10,7 @@ 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/helper/utils.dart'; import 'package:test_sa/models/device/asset_transfer_attachment.dart'; import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/new_models/assigned_employee.dart'; @@ -18,6 +19,7 @@ import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/bottom_sheets/service_request_bottomsheet.dart'; +import 'package:test_sa/modules/cm_module/views/forms/maintenance_request/components/assistant_employee_list.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; @@ -164,15 +166,34 @@ class _UpdateDeviceTransferState extends State { return false; } } +// assistant employee validation + if (_formModel.assistantEmployList?.isNotEmpty ?? false) { + for (int i = 0; i < _formModel.assistantEmployList!.length; i++) { + final employee = _formModel.assistantEmployList![i]; + final position = Utils.getOrdinal(i + 1); + + if (employee.employeeId == null) { + Fluttertoast.showToast( + msg: "Please select the $position assistant employee", + ); + return false; + } - if (_formModel.assistantEmployees != null) { - if (_formModel.modelAssistantEmployees?.startDate == null) { - Fluttertoast.showToast(msg: "Please Select Assistant Employee Start Time"); - return false; - } - if (_formModel.modelAssistantEmployees?.endDate == null) { - Fluttertoast.showToast(msg: "Please Select Assistant Employee End Time"); - return false; + if (employee.employeeId != null) { + if (employee.startDate == null) { + Fluttertoast.showToast( + msg: "Please select start time for assistant employee ${employee.employeeName}", + ); + return false; + } + + if (employee.endDate == null) { + Fluttertoast.showToast( + msg: "Please select end time for assistant employee ${employee.employeeName}", + ); + return false; + } + } } } return true; @@ -252,10 +273,17 @@ class _UpdateDeviceTransferState extends State { ], ).toShadowContainer(context), 16.height, - AssistantEmployeeCard( - isSender: widget.isSender, - formModel: _formModel, - ).toShadowContainer(context, paddingObject: const EdgeInsets.symmetric(horizontal: 16)), + DeviceTransferAssistantEmployeeList( + assetId: _formModel.assetId, + createdDate: _formModel.createdDate??'', + assistantEmployeeList: widget.isSender?_formModel.assetTransferAssistantEmployeesSender:_formModel.assetTransferAssistantEmployeesReceiver, + cardPadding: 0, + onListChanged: (updatedList) { + setState(() { + _formModel.assistantEmployList = updatedList; + }); + }, + ), ], ), ).expanded, @@ -353,224 +381,512 @@ class _UpdateDeviceTransferState extends State { } } -class AssistantEmployeeCard extends StatefulWidget { - bool? isSender = false; - DeviceTransfer? formModel; - AssistantEmployeeCard({super.key, this.isSender, this.formModel}); + + + +class DeviceTransferAssistantEmployeeList extends StatefulWidget { + final List? assistantEmployeeList; + final ValueChanged>? onListChanged; + final double ?cardPadding; + final dynamic assetId; + final String createdDate; + + const DeviceTransferAssistantEmployeeList({ + super.key, + this.assistantEmployeeList, + this.onListChanged, + required this.assetId, + this.cardPadding, + required this.createdDate, + }); @override - State createState() => _AssistantEmployeeCardState(); + State createState() => _DeviceTransferAssistantEmployeeListState(); } -class _AssistantEmployeeCardState extends State { - final TextEditingController _workingHoursController = TextEditingController(text: ''); - bool isCurrentUserIsAssistantEmp = false; - bool isExpanded = false; - List employeeList = []; - AssistantEmployees selectedEmployee = AssistantEmployees(); +class _DeviceTransferAssistantEmployeeListState extends State { + late List _list; + late List _controllers; @override void initState() { - WidgetsBinding.instance.addPostFrameCallback((_) { - getInitialData(); - }); super.initState(); + _list = List.from(widget.assistantEmployeeList ?? []); + _controllers = _list.map((e) => TextEditingController(text: e.workingHours?.toString() ?? '')).toList(); } - Future getInitialData() async { - if (widget.isSender!) { - employeeList = widget.formModel!.assetTransferAssistantEmployeesSender ?? []; - } else { - employeeList = widget.formModel!.assetTransferAssistantEmployeesReceiver ?? []; - } + void _addNewEntry() { + setState(() { + _list.add(AssetTransferAssistantEmployees()); + _controllers.add(TextEditingController()); + }); + widget.onListChanged?.call(_list); + } - widget.formModel?.modelAssistantEmployees = employeeList.isEmpty ? AssetTransferAssistantEmployees() : employeeList[0]; + void _removeEntry(int index) { + setState(() { + _list.removeAt(index); + _controllers.removeAt(index); + }); + widget.onListChanged?.call(_list); + } - AssignedEmployee? assignedUser = AssignedEmployee(); - if (employeeList.isNotEmpty) { - assignedUser = AssignedEmployee( - id: employeeList[0].employeeId, - name: employeeList[0].employeeName, - ); - } - selectedEmployee = AssistantEmployees(userId: assignedUser.id, user: assignedUser); + void _updateModel(int index, void Function(AssetTransferAssistantEmployees model) updateList, {bool updateController = false}) { + setState(() { + updateList(_list[index]); + }); } @override - void dispose() { - _workingHoursController.dispose(); - super.dispose(); + Widget build(BuildContext context) { + return ListView.builder( + itemCount: _list.length + 1, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + padding: EdgeInsets.all(widget.cardPadding??16), + itemBuilder: (context, index) { + if (index == _list.length) { + return AppFilledButton( + label: "Add Assistant Employee".addTranslation, + maxWidth: true, + textColor: AppColor.black10, + buttonColor: context.isDark ? AppColor.neutral60 : AppColor.white10, + icon: Icon(Icons.add_circle, color: AppColor.blueStatus(context)), + showIcon: true, + onPressed: _addNewEntry, + ); + } + AssistantEmployees selectedEmployee = AssistantEmployees(); + AssignedEmployee? assignedUser = AssignedEmployee(); + assignedUser = AssignedEmployee( + id: _list[index].employeeId, + name: _list[index].employeeName, + ); + selectedEmployee = AssistantEmployees( userId: assignedUser.id, user: assignedUser); + return EmployeeCard( + model: _list[index], + assetId: widget.assetId, + index: index, + createdDate: widget.createdDate, + selectedEmployee: selectedEmployee, + onUpdate: (updateList) => _updateModel(index, updateList), + onRemove: () => _removeEntry(index), + workingHoursController: _controllers[index], + ); + }, + ); } +} + +class EmployeeCard extends StatelessWidget { + final AssetTransferAssistantEmployees model; + final int index; + final dynamic assetId ; + final String ? createdDate; + AssistantEmployees? selectedEmployee; + final void Function(void Function(AssetTransferAssistantEmployees model)) onUpdate; + final VoidCallback onRemove; + final TextEditingController workingHoursController; + EmployeeCard({ + super.key, + required this.model, + required this.assetId, + this.selectedEmployee, + required this.index, + required this.onUpdate, + this.createdDate, + required this.onRemove, + required this.workingHoursController, + }); + + // AssistantEmployees selectedEmployee = AssistantEmployees(); @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; + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + context.translation.assistantEmployee.bodyText(context).custom(color: AppColor.black20), + Container( + height: 32, + width: 32, + padding: const EdgeInsets.all(6), + child: "trash".toSvgAsset(height: 20, width: 20), + ).onPress(onRemove), + ], + ), + 8.height, + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ServiceReportAssistantEmployeeMenu( + title: context.translation.select, + backgroundColor: AppColor.neutral100, + assetId:assetId, + initialValue: selectedEmployee, + onSelect: (employee) { + if (employee != null) { + onUpdate((model) { + selectedEmployee = employee.copyWith(id: 0); + model.employeeId = employee.user?.id; + selectedEmployee?.user = AssignedEmployee( + id: employee.user?.id, + name: employee.user?.name, + ); + }); + } + }, + ), + 8.height, + Row( + mainAxisSize: MainAxisSize.min, + children: [ + ADatePicker( + label: context.translation.startTime, + hideShadow: true, + backgroundColor: AppColor.neutral100, + date: model.startDate, + formatDateWithTime: true, + from: DateTime.tryParse(createdDate ?? ''), + onDatePicker: (selectedDate) { + showTimePicker( + context: context, + initialTime: TimeOfDay.now(), + ).then((selectedTime) { + if (selectedTime != null) { + final selectedDateTime = DateTime( + selectedDate.year, + selectedDate.month, + selectedDate.day, + selectedTime.hour, + selectedTime.minute, + ); + + if (createdDate != null && selectedDateTime.isBefore(DateTime.tryParse(createdDate ?? '')!)) { + "Start time is before the request time.".showToast; + return; + } + + if (selectedDateTime.isAfter(DateTime.now())) { + "Start time is after the current time".showToast; + return; + } + + onUpdate((model) { + model.startDate = selectedDateTime; + ServiceRequestUtils.calculateAndAssignWorkingHours( + startTime: model.startDate, + endTime: model.endDate, + workingHoursController: workingHoursController, + updateModel: (hours) => model.workingHours = hours, + ); + }); } - }, - ), - 8.height, - Row( - mainAxisSize: MainAxisSize.min, - children: [ - ADatePicker( - label: context.translation.startTime, - hideShadow: true, - backgroundColor: AppColor.neutral100, - date: widget.formModel?.modelAssistantEmployees?.startDate, - from: DateTime.tryParse(widget.formModel?.createdDate ?? ''), - 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 (DateTime.tryParse(widget.formModel?.createdDate ?? '') != null && selectedDateTime.isBefore(DateTime.tryParse(widget.formModel?.createdDate ?? '')!)) { - "Start time is before the request time.".showToast; - selectedTime = null; - return; - } - if (selectedDateTime.isAfter(DateTime.now())) { - "Start time is after than current time".showToast; - selectedTime = null; - return; - } - 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; - } - - selectedDate = selectedDate.add(Duration(hours: selectedTime.hour, minutes: selectedTime.minute)); - bool isBeforeCurrentTime = selectedDate.isBefore(DateTime.now()); - bool isAfterStartTime = selectedDate.isAfter(widget.formModel!.modelAssistantEmployees!.startDate!); - if (!isBeforeCurrentTime) { - "Please select a time before the current time.".showToast; - return; - } - if (!isAfterStartTime) { - "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(), + }); + }, + ).expanded, + 8.width, + ADatePicker( + label: context.translation.endTime, + hideShadow: true, + backgroundColor: AppColor.neutral100, + date: model.endDate, + formatDateWithTime: true, + from: DateTime.tryParse(createdDate ?? ''), + onDatePicker: (selectedDate) { + showTimePicker( + context: context, + initialTime: TimeOfDay.now(), + ).then((selectedTime) { + if (selectedTime != null) { + final endDateTime = DateTime( + selectedDate.year, + selectedDate.month, + selectedDate.day, + selectedTime.hour, + selectedTime.minute, + ); + + if (!endDateTime.isBefore(DateTime.now())) { + "Please select a time before the current time.".showToast; + return; + } + + if (model.startDate == null || !endDateTime.isAfter(model.startDate!)) { + "End date must be after start date".showToast; + return; + } + + onUpdate((model) { + model.endDate = endDateTime; + ServiceRequestUtils.calculateAndAssignWorkingHours( + startTime: model.startDate, + endTime: model.endDate, + workingHoursController: workingHoursController, + updateModel: (hours) => model.workingHours = hours, + ); + }); + } + }); + }, + ).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), + textAlign: TextAlign.center, + enable: false, + showShadow: false, + labelStyle: AppTextStyles.textFieldLabelStyle, + style: Theme.of(context).textTheme.titleMedium, + ), + 8.height, + AppTextFormField( + initialValue: model.techComment, + labelText: context.translation.technicalComment, + backgroundColor: AppColor.neutral100, + showShadow: false, + labelStyle: AppTextStyles.textFieldLabelStyle, + alignLabelWithHint: true, + textInputType: TextInputType.multiline, + onChange: (value) => onUpdate((model) => model.techComment = value), + // onSaved: (value) => onUpdate((model) => model.technicalComment = value), + ), + 8.height, + ], + ) ], - ); + ).toShadowContainer(context, paddingObject: const EdgeInsets.symmetric(horizontal: 16, vertical: 12)) + .paddingOnly(bottom: 12); } } + +// 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, +// from: DateTime.tryParse(widget.formModel?.createdDate ?? ''), +// 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 (DateTime.tryParse(widget.formModel?.createdDate ?? '') != null && selectedDateTime.isBefore(DateTime.tryParse(widget.formModel?.createdDate ?? '')!)) { +// "Start time is before the request time.".showToast; +// selectedTime = null; +// return; +// } +// if (selectedDateTime.isAfter(DateTime.now())) { +// "Start time is after than current time".showToast; +// selectedTime = null; +// return; +// } +// 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; +// } +// +// selectedDate = selectedDate.add(Duration(hours: selectedTime.hour, minutes: selectedTime.minute)); +// bool isBeforeCurrentTime = selectedDate.isBefore(DateTime.now()); +// bool isAfterStartTime = selectedDate.isAfter(widget.formModel!.modelAssistantEmployees!.startDate!); +// if (!isBeforeCurrentTime) { +// "Please select a time before the current time.".showToast; +// return; +// } +// if (!isAfterStartTime) { +// "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(), +// ], +// ); +// } +// }