multiple assistant employee structure added

design_3.0_dark_mode
WaseemAbbasi22 3 months ago
parent 705dff245d
commit 1285ae68ec

@ -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"));

@ -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<VisitTimers>? assetTransferEngineerTimers;
List<TimerModel>? timerModelList = [];
List<AssistantEmployees>? assistantEmployees;
List<AssetTransferAssistantEmployees>? assetTransferAssistantEmployeesSender;
List<AssetTransferAssistantEmployees>? assetTransferAssistantEmployeesReceiver;
List<AssetTransferAssistantEmployees>? assetTransferAssistantEmployeesSender=[];
List<AssetTransferAssistantEmployees>? assetTransferAssistantEmployeesReceiver=[];
List<AssetTransferContactPerson>? assetTransferContactPersons;
AssetTransferAssistantEmployees? modelAssistantEmployees;
List<AssetTransferAssistantEmployees>? assistantEmployList=[];
TimerModel? tbsTimer = TimerModel();
TimerModel? deviceTimePicker;
@ -384,6 +388,7 @@ class DeviceTransfer {
String? destDepartmentName,
List<VisitTimers>? senderVisitTimers,
List<VisitTimers>? receiverVisitTimers,
List<AssetTransferAssistantEmployees>? 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;
}

@ -35,6 +35,7 @@ class ActivityMaintenanceHelperModel {
List<ActivityMaintenanceTimers>? activityMaintenanceTimers = [];
TimerModel? activityMaintenanceTimerModel = TimerModel();
TimerModel? activityTimePicker;
List<AssistantEmployeesModel>? assistantEmployList=[];
List<TimerModel>? timerModelList = [];
ActivityMaintenanceHelperModel(
@ -63,6 +64,7 @@ class ActivityMaintenanceHelperModel {
this.assignedEmployee,
this.activityMaintenanceTimers,
this.timerModelList,
this.assistantEmployList,
this.modelAssistantEmployees});
Map<String, dynamic> 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;
}
}

@ -692,7 +692,7 @@ class ActivityMaintenance {
String? supplierEndTime;
double? supplierWorkingHours;
String? activityType;
List<ActivityMaintenanceAssistantEmployees>? assistantEmployees;
List<AssistantEmployeesModel>? assistantEmployees;
List<ActivityMaintenanceTimers>? activityMaintenanceTimers;
ActivityMaintenance(
@ -735,9 +735,9 @@ class ActivityMaintenance {
supplierEndTime = json['supplierEndTime'];
supplierWorkingHours = json['supplierWorkingHours'];
if (json['assistantEmployees'] != null) {
assistantEmployees = <ActivityMaintenanceAssistantEmployees>[];
assistantEmployees = <AssistantEmployeesModel>[];
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<String, dynamic> json) {
Map<String,dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['startDate'] = startDate?.toIso8601String();
data['endDate'] = endDate?.toIso8601String();
data['workingHours'] = workingHours;
data['technicalComment'] = technicalComment;
if (user != null) {
data['userId'] = user?.userId;
}
return data;
}
}

@ -311,19 +311,19 @@ class _ActivitiesListViewState extends State<ActivitiesListView> {
}
void editMaintenanceRequest({required BuildContext context, required ServiceRequestDetailProvider requestDetailProvider, required Activities activity}) async {
Map<String, dynamic> assistEmpData = {};
// Map<String, dynamic> 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<ActivitiesListView> {
// 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,

@ -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<ActivityMaintenanceAssistantEmployees>? assistantEmployeeList;
final List<AssistantEmployeesModel>? assistantEmployeeList;
final ValueChanged<List<AssistantEmployeesModel>>? onListChanged;
final double? cardPadding;
final dynamic assetId;
AssistantEmployeeList({super.key, this.assistantEmployeeList = const <ActivityMaintenanceAssistantEmployees>[]});
const AssistantEmployeeList({
super.key,
this.assistantEmployeeList,
this.onListChanged,
required this.assetId,
this.cardPadding,
});
@override
State<AssistantEmployeeList> createState() => _AssistantEmployeeListState();
}
class _AssistantEmployeeListState extends State<AssistantEmployeeList> {
bool status = false;
final TextEditingController _workingHoursController = TextEditingController(text: '');
bool isCurrentUserIsAssistantEmp = false;
bool isExpanded = false;
late List<AssistantEmployeesModel> _list;
late List<TextEditingController> _controllers;
@override
void initState() {
super.initState();
_list = List<AssistantEmployeesModel>.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<ServiceRequestDetailProvider>(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<ServiceRequestDetailProvider>(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<ServiceRequestDetailProvider>(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<AssistantEmployeeList> {
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<AssistantEmployeeList> {
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<AssistantEmployeeList> {
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<AssistantEmployeeList> {
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<AssistantEmployeeList> {
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);
}
}

@ -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<InternalMaintenanceRequest>
],
),
).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,
],

@ -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<MaintenanceRequestForm> with Si
Future<void> getInitialData() async {
Provider.of<ServiceReportRepairLocationProvider>(context, listen: false).getTypes();
ServiceRequestDetailProvider requestDetailProvider = Provider.of<ServiceRequestDetailProvider>(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<MaintenanceRequestForm> 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<MaintenanceRequestForm> 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) {

@ -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<UpdateDeviceTransfer> {
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<UpdateDeviceTransfer> {
],
).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<UpdateDeviceTransfer> {
}
}
class AssistantEmployeeCard extends StatefulWidget {
bool? isSender = false;
DeviceTransfer? formModel;
AssistantEmployeeCard({super.key, this.isSender, this.formModel});
class DeviceTransferAssistantEmployeeList extends StatefulWidget {
final List<AssetTransferAssistantEmployees>? assistantEmployeeList;
final ValueChanged<List<AssetTransferAssistantEmployees>>? 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<AssistantEmployeeCard> createState() => _AssistantEmployeeCardState();
State<DeviceTransferAssistantEmployeeList> createState() => _DeviceTransferAssistantEmployeeListState();
}
class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
final TextEditingController _workingHoursController = TextEditingController(text: '');
bool isCurrentUserIsAssistantEmp = false;
bool isExpanded = false;
List<AssetTransferAssistantEmployees> employeeList = [];
AssistantEmployees selectedEmployee = AssistantEmployees();
class _DeviceTransferAssistantEmployeeListState extends State<DeviceTransferAssistantEmployeeList> {
late List<AssetTransferAssistantEmployees> _list;
late List<TextEditingController> _controllers;
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) {
getInitialData();
});
super.initState();
_list = List<AssetTransferAssistantEmployees>.from(widget.assistantEmployeeList ?? []);
_controllers = _list.map((e) => TextEditingController(text: e.workingHours?.toString() ?? '')).toList();
}
Future<void> 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<AssistantEmployeeCard> createState() => _AssistantEmployeeCardState();
// }
//
// class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
// final TextEditingController _workingHoursController = TextEditingController(text: '');
// bool isCurrentUserIsAssistantEmp = false;
// bool isExpanded = false;
// List<AssetTransferAssistantEmployees> employeeList = [];
// AssistantEmployees selectedEmployee = AssistantEmployees();
// @override
// void initState() {
// WidgetsBinding.instance.addPostFrameCallback((_) {
// getInitialData();
// });
// super.initState();
// }
//
// Future<void> 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(),
// ],
// );
// }
// }

Loading…
Cancel
Save