multiple assistant employee structure added

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

@ -49,7 +49,19 @@ class Utils {
return null; 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) { static int stringToHex(String colorCode) {
try { try {
return int.parse(colorCode.replaceAll("#", "0xff")); return int.parse(colorCode.replaceAll("#", "0xff"));

@ -1,6 +1,7 @@
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/lookup.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/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/ppm/ppm.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
@ -89,8 +90,10 @@ class DeviceTransfer {
this.timerModelList, this.timerModelList,
this.assistantEmployees, this.assistantEmployees,
this.modelAssistantEmployees, this.modelAssistantEmployees,
this.assistantEmployList,
this.assetTransferAssistantEmployeesReceiver, this.assetTransferAssistantEmployeesReceiver,
this.assetTransferAssistantEmployeesSender, this.assetTransferAssistantEmployeesSender,
this.statusValue, this.statusValue,
}); });
@ -305,10 +308,11 @@ class DeviceTransfer {
List<VisitTimers>? assetTransferEngineerTimers; List<VisitTimers>? assetTransferEngineerTimers;
List<TimerModel>? timerModelList = []; List<TimerModel>? timerModelList = [];
List<AssistantEmployees>? assistantEmployees; List<AssistantEmployees>? assistantEmployees;
List<AssetTransferAssistantEmployees>? assetTransferAssistantEmployeesSender; List<AssetTransferAssistantEmployees>? assetTransferAssistantEmployeesSender=[];
List<AssetTransferAssistantEmployees>? assetTransferAssistantEmployeesReceiver; List<AssetTransferAssistantEmployees>? assetTransferAssistantEmployeesReceiver=[];
List<AssetTransferContactPerson>? assetTransferContactPersons; List<AssetTransferContactPerson>? assetTransferContactPersons;
AssetTransferAssistantEmployees? modelAssistantEmployees; AssetTransferAssistantEmployees? modelAssistantEmployees;
List<AssetTransferAssistantEmployees>? assistantEmployList=[];
TimerModel? tbsTimer = TimerModel(); TimerModel? tbsTimer = TimerModel();
TimerModel? deviceTimePicker; TimerModel? deviceTimePicker;
@ -384,6 +388,7 @@ class DeviceTransfer {
String? destDepartmentName, String? destDepartmentName,
List<VisitTimers>? senderVisitTimers, List<VisitTimers>? senderVisitTimers,
List<VisitTimers>? receiverVisitTimers, List<VisitTimers>? receiverVisitTimers,
List<AssetTransferAssistantEmployees>? assistantEmployList,
TimerModel? tbsTimer, TimerModel? tbsTimer,
TimerModel? deviceTimePicker}) => TimerModel? deviceTimePicker}) =>
DeviceTransfer( DeviceTransfer(
@ -457,6 +462,7 @@ class DeviceTransfer {
senderVisitTimers: senderVisitTimers ?? this.senderVisitTimers, senderVisitTimers: senderVisitTimers ?? this.senderVisitTimers,
receiverVisitTimers: receiverVisitTimers ?? this.receiverVisitTimers, receiverVisitTimers: receiverVisitTimers ?? this.receiverVisitTimers,
tbsTimer: tbsTimer ?? this.tbsTimer, tbsTimer: tbsTimer ?? this.tbsTimer,
assistantEmployList: assistantEmployList??this.assistantEmployList,
deviceTimePicker: deviceTimePicker ?? this.deviceTimePicker, deviceTimePicker: deviceTimePicker ?? this.deviceTimePicker,
manufacturerName: manufacturerName ?? this.manufacturerName); manufacturerName: manufacturerName ?? this.manufacturerName);
@ -573,13 +579,18 @@ class DeviceTransfer {
if (assetTransferEngineerTimers != null) { if (assetTransferEngineerTimers != null) {
map['assetTransferEngineerTimers'] = assetTransferEngineerTimers!.map((v) => v.toJson()).toList(); map['assetTransferEngineerTimers'] = assetTransferEngineerTimers!.map((v) => v.toJson()).toList();
} }
if (modelAssistantEmployees != null) { if (assistantEmployList != null && assistantEmployList!.isNotEmpty) {
if (modelAssistantEmployees!.employeeId != null) { map['assetTransferAssistantEmployees'] = assistantEmployList;
map['assetTransferAssistantEmployees'] = [modelAssistantEmployees!.toJson()]; } else {
} else { map['assetTransferAssistantEmployees'] = [];
map['assetTransferAssistantEmployees'] = [];
}
} }
// if (modelAssistantEmployees != null) {
// if (modelAssistantEmployees!.employeeId != null) {
// map['assetTransferAssistantEmployees'] = [modelAssistantEmployees!.toJson()];
// } else {
// map['assetTransferAssistantEmployees'] = [];
// }
// }
return map; return map;
} }

@ -35,6 +35,7 @@ class ActivityMaintenanceHelperModel {
List<ActivityMaintenanceTimers>? activityMaintenanceTimers = []; List<ActivityMaintenanceTimers>? activityMaintenanceTimers = [];
TimerModel? activityMaintenanceTimerModel = TimerModel(); TimerModel? activityMaintenanceTimerModel = TimerModel();
TimerModel? activityTimePicker; TimerModel? activityTimePicker;
List<AssistantEmployeesModel>? assistantEmployList=[];
List<TimerModel>? timerModelList = []; List<TimerModel>? timerModelList = [];
ActivityMaintenanceHelperModel( ActivityMaintenanceHelperModel(
@ -63,6 +64,7 @@ class ActivityMaintenanceHelperModel {
this.assignedEmployee, this.assignedEmployee,
this.activityMaintenanceTimers, this.activityMaintenanceTimers,
this.timerModelList, this.timerModelList,
this.assistantEmployList,
this.modelAssistantEmployees}); this.modelAssistantEmployees});
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@ -85,11 +87,17 @@ class ActivityMaintenanceHelperModel {
data['supplierWorkingHour'] = supplierWorkingHour; data['supplierWorkingHour'] = supplierWorkingHour;
//TODO fix this properly... //TODO fix this properly...
data['activityMaintenanceTimers'] = activityMaintenanceTimers; data['activityMaintenanceTimers'] = activityMaintenanceTimers;
if (assistantEmployees != null && assistantEmployees!.isNotEmpty) { if (assistantEmployList != null && assistantEmployList!.isNotEmpty) {
data['assistantEmployees'] = [modelAssistantEmployees?.toJson()]; data['assistantEmployees'] = assistantEmployList;
} else { } else {
data['assistantEmployees'] = []; 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; return data;
} }
} }

@ -692,7 +692,7 @@ class ActivityMaintenance {
String? supplierEndTime; String? supplierEndTime;
double? supplierWorkingHours; double? supplierWorkingHours;
String? activityType; String? activityType;
List<ActivityMaintenanceAssistantEmployees>? assistantEmployees; List<AssistantEmployeesModel>? assistantEmployees;
List<ActivityMaintenanceTimers>? activityMaintenanceTimers; List<ActivityMaintenanceTimers>? activityMaintenanceTimers;
ActivityMaintenance( ActivityMaintenance(
@ -735,9 +735,9 @@ class ActivityMaintenance {
supplierEndTime = json['supplierEndTime']; supplierEndTime = json['supplierEndTime'];
supplierWorkingHours = json['supplierWorkingHours']; supplierWorkingHours = json['supplierWorkingHours'];
if (json['assistantEmployees'] != null) { if (json['assistantEmployees'] != null) {
assistantEmployees = <ActivityMaintenanceAssistantEmployees>[]; assistantEmployees = <AssistantEmployeesModel>[];
json['assistantEmployees'].forEach((v) { json['assistantEmployees'].forEach((v) {
assistantEmployees!.add(ActivityMaintenanceAssistantEmployees.fromJson(v)); assistantEmployees!.add(AssistantEmployeesModel.fromJson(v));
}); });
} }
if (json['activityMaintenanceTimers'] != null) { if (json['activityMaintenanceTimers'] != null) {
@ -922,3 +922,48 @@ class ActivityMaintenanceTimers {
return data; 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 { void editMaintenanceRequest({required BuildContext context, required ServiceRequestDetailProvider requestDetailProvider, required Activities activity}) async {
Map<String, dynamic> assistEmpData = {}; // Map<String, dynamic> assistEmpData = {};
try { try {
if (activity.activityMaintenance?.assistantEmployees != null && activity.activityMaintenance!.assistantEmployees!.isNotEmpty) { // if (activity.activityMaintenance?.assistantEmployees != null && activity.activityMaintenance!.assistantEmployees!.isNotEmpty) {
assistEmpData = { // assistEmpData = {
// 'id': activity.activityMaintenance?.assistantEmployees?[0].user?.userId != null ? num.tryParse(activity.activityMaintenance!.assistantEmployees![0].user!.userId!) : null, // // 'id': activity.activityMaintenance?.assistantEmployees?[0].user?.userId != null ? num.tryParse(activity.activityMaintenance!.assistantEmployees![0].user!.userId!) : null,
'id': null, // 'id': null,
'user': { // 'user': {
'id': activity.activityMaintenance?.assistantEmployees?[0].user?.userId, // 'id': activity.activityMaintenance?.assistantEmployees?[0].user?.userId,
// 'id': activity.activityMaintenance?.assistantEmployees?[0].user?.userId != null ? num.tryParse(activity.activityMaintenance!.assistantEmployees![0].user!.userId!) : null, // // 'id': activity.activityMaintenance?.assistantEmployees?[0].user?.userId != null ? num.tryParse(activity.activityMaintenance!.assistantEmployees![0].user!.userId!) : null,
'name': activity.activityMaintenance?.assistantEmployees?[0].user?.userName, // 'name': activity.activityMaintenance?.assistantEmployees?[0].user?.userName,
}, // },
}; // };
} // }
requestDetailProvider.activityMaintenanceHelperModel = ActivityMaintenanceHelperModel( requestDetailProvider.activityMaintenanceHelperModel = ActivityMaintenanceHelperModel(
id: activity.id, id: activity.id,
@ -337,10 +337,11 @@ class _ActivitiesListViewState extends State<ActivitiesListView> {
// lastSituation: activity.activityMaintenance?.lastSituation, // lastSituation: activity.activityMaintenance?.lastSituation,
assignedEmployee: activity.activityMaintenance?.assignedEmployee != null ? WorkOrderAssignedEmployee.fromJson(activity.activityMaintenance!.assignedEmployee!.toJson()) : null, assignedEmployee: activity.activityMaintenance?.assignedEmployee != null ? WorkOrderAssignedEmployee.fromJson(activity.activityMaintenance!.assignedEmployee!.toJson()) : null,
technicalComment: activity.activityMaintenance?.technicalComment, technicalComment: activity.activityMaintenance?.technicalComment,
assistantEmployees: assistantEmployList:activity.activityMaintenance!.assistantEmployees??[] ,
activity.activityMaintenance?.assistantEmployees != null && activity.activityMaintenance!.assistantEmployees!.isNotEmpty ? [AssistantEmployees.fromJson(assistEmpData)] : [], // assistantEmployees:
modelAssistantEmployees: // activity.activityMaintenance?.assistantEmployees != null && activity.activityMaintenance!.assistantEmployees!.isNotEmpty ? [AssistantEmployees.fromJson(assistEmpData)] : [],
activity.activityMaintenance?.assistantEmployees != null && activity.activityMaintenance!.assistantEmployees!.isNotEmpty ? activity.activityMaintenance!.assistantEmployees![0] : null, // 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, supplierStartTime: activity.activityMaintenance?.supplierStartTime != null ? DateTime.parse(activity.activityMaintenance!.supplierStartTime!) : null,
supplierEndTime: activity.activityMaintenance?.supplierEndTime != null ? DateTime.parse(activity.activityMaintenance!.supplierEndTime!) : null, supplierEndTime: activity.activityMaintenance?.supplierEndTime != null ? DateTime.parse(activity.activityMaintenance!.supplierEndTime!) : null,
supplierWorkingHour: activity.activityMaintenance?.supplierWorkingHours, 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'; import 'package:test_sa/views/widgets/status/report/service_report_assistant_employee_menu.dart';
class AssistantEmployeeList extends StatefulWidget { 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 @override
State<AssistantEmployeeList> createState() => _AssistantEmployeeListState(); State<AssistantEmployeeList> createState() => _AssistantEmployeeListState();
} }
class _AssistantEmployeeListState extends State<AssistantEmployeeList> { class _AssistantEmployeeListState extends State<AssistantEmployeeList> {
bool status = false; late List<AssistantEmployeesModel> _list;
final TextEditingController _workingHoursController = TextEditingController(text: ''); late List<TextEditingController> _controllers;
bool isCurrentUserIsAssistantEmp = false;
bool isExpanded = false; @override
void initState() {
super.initState();
_list = List<AssistantEmployeesModel>.from(widget.assistantEmployeeList ?? []);
_controllers = _list.map((e) => TextEditingController(text: e.workingHours?.toString() ?? '')).toList();
}
void _addNewEntry() { void _addNewEntry() {
WidgetsBinding.instance.addPostFrameCallback((_) { setState(() {
setState(() { _list.add(AssistantEmployeesModel());
widget.assistantEmployeeList!.add(ActivityMaintenanceAssistantEmployees()); _controllers.add(TextEditingController());
});
}); });
widget.onListChanged?.call(_list);
} }
void _removeEntry(int index) { void _removeEntry(int index) {
setState(() { setState(() {
setState(() { _list.removeAt(index);
widget.assistantEmployeeList!.removeAt(index); _controllers.removeAt(index);
});
}); });
widget.onListChanged?.call(_list);
} }
@override void _updateModel(int index, void Function(AssistantEmployeesModel model) updateList) {
void dispose() { setState(() {
_workingHoursController.dispose(); updateList(_list[index]);
super.dispose(); });
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Consumer<ServiceRequestDetailProvider>(builder: (context, requestDetailProvider, child) { final isReadOnly = Provider.of<ServiceRequestDetailProvider>(context, listen: false).isReadOnlyRequest;
return ListView.builder( return ListView.builder(
itemCount: widget.assistantEmployeeList!.length + 1, itemCount: _list.length + 1,
shrinkWrap: true, shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
padding: const EdgeInsets.all(16), padding: EdgeInsets.all(widget.cardPadding ?? 16),
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index == widget.assistantEmployeeList!.length) { if (index == _list.length) {
return Visibility( return Visibility(
visible: !requestDetailProvider.isReadOnlyRequest, visible: !isReadOnly,
child: AppFilledButton( child: AppFilledButton(
label: "Add Assistant Employee".addTranslation, label: "Add Assistant Employee".addTranslation,
maxWidth: true, maxWidth: true,
textColor: AppColor.black10, textColor: AppColor.black10,
buttonColor: context.isDark ? AppColor.neutral60 : AppColor.white10, buttonColor: context.isDark ? AppColor.neutral60 : AppColor.white10,
icon: Icon(Icons.add_circle, color: AppColor.blueStatus(context)), icon: Icon(Icons.add_circle, color: AppColor.blueStatus(context)),
showIcon: true, showIcon: true,
onPressed: _addNewEntry, onPressed: _addNewEntry,
), ),
); );
} }
ActivityMaintenanceAssistantEmployees model = widget.assistantEmployeeList![index]; return EmployeeCard(
return employeeCard(model: model, requestDetailProvider: requestDetailProvider, index: index) model: _list[index],
.toShadowContainer(context, paddingObject: const EdgeInsets.symmetric(horizontal: 16, vertical: 12)) assetId: widget.assetId,
.paddingOnly(bottom: 12); 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( return Column(
children: [ children: [
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
context.translation.assistantEmployee.bodyText(context).custom(color: AppColor.black20), context.translation.assistantEmployee.bodyText(context).custom(color: AppColor.black20),
Container( if (!isReadOnly)
height: 32, Container(
width: 32, height: 32,
padding: const EdgeInsets.all(6), width: 32,
child: "trash".toSvgAsset(height: 20, width: 20), padding: const EdgeInsets.all(6),
).onPress(() { child: "trash".toSvgAsset(height: 20, width: 20),
_removeEntry(index); ).onPress(onRemove),
}),
], ],
), ),
8.height, 8.height,
@ -107,12 +149,17 @@ class _AssistantEmployeeListState extends State<AssistantEmployeeList> {
ServiceReportAssistantEmployeeMenu( ServiceReportAssistantEmployeeMenu(
title: context.translation.select, title: context.translation.select,
backgroundColor: AppColor.neutral100, backgroundColor: AppColor.neutral100,
assetId: requestDetailProvider.currentWorkOrder!.data!.asset!.id!, assetId: assetId,
initialValue: model.employee, initialValue: model.employee,
onSelect: (employee) { onSelect: (employee) {
if (employee != null) { if (employee != null) {
model.employee = employee.copyWith(id: 0); onUpdate((model) {
model.user = AssignedEmployee(userId: employee.user?.id, userName: employee.user?.name); 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, backgroundColor: AppColor.neutral100,
date: model.startDate, date: model.startDate,
formatDateWithTime: true, formatDateWithTime: true,
from: requestDetailProvider.currentWorkOrder?.data?.requestedDate, from: requestedDate,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
showTimePicker( showTimePicker(
context: context, context: context,
initialTime: TimeOfDay.now(), initialTime: TimeOfDay.now(),
).then((selectedTime) { ).then((selectedTime) {
// Handle the selected date and time here.
if (selectedTime != null) { if (selectedTime != null) {
DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute); final selectedDateTime = DateTime(
if (requestDetailProvider.currentWorkOrder?.data?.requestedDate != null && selectedDateTime.isBefore(requestDetailProvider.currentWorkOrder!.data!.requestedDate!)) { selectedDate.year,
selectedDate.month,
selectedDate.day,
selectedTime.hour,
selectedTime.minute,
);
if (requestedDate != null && selectedDateTime.isBefore(requestedDate)) {
"Start time is before the request time.".showToast; "Start time is before the request time.".showToast;
selectedTime = null;
return; return;
} }
if (selectedDateTime.isAfter(DateTime.now())) { if (selectedDateTime.isAfter(DateTime.now())) {
"Start time is after than current time".showToast; "Start time is after the current time".showToast;
selectedTime = null;
return; return;
} }
// DateTime selectedDateTime = DateTime(
// selectedDate.year, onUpdate((model) {
// selectedDate.month, model.startDate = selectedDateTime;
// selectedDate.day, ServiceRequestUtils.calculateAndAssignWorkingHours(
// selectedTime.hour,
// selectedTime.minute,
// );
model.startDate = selectedDateTime;
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel);
ServiceRequestUtils.calculateAndAssignWorkingHours(
startTime: model.startDate, startTime: model.startDate,
endTime: model.endDate, endTime: model.endDate,
workingHoursController: _workingHoursController, workingHoursController: workingHoursController,
updateModel: (hours) { updateModel: (hours) => model.workingHours = hours,
model.workingHours = hours; );
}); });
} }
}); });
}, },
@ -171,36 +217,41 @@ class _AssistantEmployeeListState extends State<AssistantEmployeeList> {
hideShadow: true, hideShadow: true,
backgroundColor: AppColor.neutral100, backgroundColor: AppColor.neutral100,
date: model.endDate, date: model.endDate,
from: requestDetailProvider.currentWorkOrder?.data?.requestedDate,
formatDateWithTime: true, formatDateWithTime: true,
from: requestedDate,
onDatePicker: (selectedDate) { onDatePicker: (selectedDate) {
showTimePicker( showTimePicker(
context: context, context: context,
initialTime: TimeOfDay.now(), initialTime: TimeOfDay.now(),
).then((selectedTime) { ).then((selectedTime) {
// Handle the selected date and time here.
if (selectedTime != null) { if (selectedTime != null) {
selectedDate = selectedDate.add(Duration(hours: selectedTime.hour, minutes: selectedTime.minute)); final endDateTime = DateTime(
bool isBeforeCurrentTime = selectedDate.isBefore(DateTime.now()); selectedDate.year,
bool isAfterStartTime = selectedDate.isAfter(requestDetailProvider.activityMaintenanceHelperModel!.modelAssistantEmployees!.startDate!); selectedDate.month,
if (!isBeforeCurrentTime) { selectedDate.day,
selectedTime.hour,
selectedTime.minute,
);
if (!endDateTime.isBefore(DateTime.now())) {
"Please select a time before the current time.".showToast; "Please select a time before the current time.".showToast;
return; 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; return;
} }
model.endDate = selectedDate; onUpdate((model) {
requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel); model.endDate = endDateTime;
ServiceRequestUtils.calculateAndAssignWorkingHours( ServiceRequestUtils.calculateAndAssignWorkingHours(
startTime: model.startDate, startTime: model.startDate,
endTime: model.endDate, endTime: model.endDate,
workingHoursController: _workingHoursController, workingHoursController: workingHoursController,
updateModel: (hours) { updateModel: (hours) => model.workingHours = hours,
model.workingHours = hours; );
}); });
} }
}); });
}, },
@ -211,13 +262,12 @@ class _AssistantEmployeeListState extends State<AssistantEmployeeList> {
AppTextFormField( AppTextFormField(
labelText: context.translation.workingHours, labelText: context.translation.workingHours,
backgroundColor: AppColor.neutral80, backgroundColor: AppColor.neutral80,
controller: _workingHoursController, controller: workingHoursController,
suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16), suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16),
initialValue: model.workingHours != null ? model.workingHours.toString() : '',
textAlign: TextAlign.center, textAlign: TextAlign.center,
labelStyle: AppTextStyles.textFieldLabelStyle,
enable: false, enable: false,
showShadow: false, showShadow: false,
labelStyle: AppTextStyles.textFieldLabelStyle,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
), ),
8.height, 8.height,
@ -229,18 +279,13 @@ class _AssistantEmployeeListState extends State<AssistantEmployeeList> {
labelStyle: AppTextStyles.textFieldLabelStyle, labelStyle: AppTextStyles.textFieldLabelStyle,
alignLabelWithHint: true, alignLabelWithHint: true,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
onChange: (value) { onChange: (value) => onUpdate((model) => model.technicalComment = value),
model.technicalComment = value; // onSaved: (value) => onUpdate((model) => model.technicalComment = value),
},
onSaved: (value) {
model.technicalComment = value;
},
), ),
8.height, 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:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_repair_location_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/providers/service_request_providers/last_situation_provider.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart';
import 'assistant_employee_card.dart';
class InternalMaintenanceRequest extends StatefulWidget { class InternalMaintenanceRequest extends StatefulWidget {
static const String id = "/add-internal-activity"; 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), ).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), // const AssistantEmployeeCard().toShadowContainer(context, paddingObject: const EdgeInsets.symmetric(horizontal: 16)).paddingOnly(start: 13, end: 14, top: 12),
100.height, 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/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_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/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/models/new_models/work_order_detail_model.dart';
import 'package:test_sa/modules/cm_module/service_request_detail_provider.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 { Future<void> getInitialData() async {
Provider.of<ServiceReportRepairLocationProvider>(context, listen: false).getTypes(); Provider.of<ServiceReportRepairLocationProvider>(context, listen: false).getTypes();
ServiceRequestDetailProvider requestDetailProvider = Provider.of<ServiceRequestDetailProvider>(context, listen: false); ServiceRequestDetailProvider requestDetailProvider = Provider.of<ServiceRequestDetailProvider>(context, listen: false);
requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees = // requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees =
requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees ?? ActivityMaintenanceAssistantEmployees(); // requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees ?? ActivityMaintenanceAssistantEmployees();
requestDetailProvider.activityMaintenanceHelperModel?.assistantEmployList = requestDetailProvider.activityMaintenanceHelperModel?.assistantEmployList ?? [];
} }
@override @override
@ -147,6 +149,7 @@ class _MaintenanceRequestFormState extends State<MaintenanceRequestForm> with Si
), ),
); );
}); });
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
if (requestDetailProvider.activityMaintenanceHelperModel?.id == 0) { if (requestDetailProvider.activityMaintenanceHelperModel?.id == 0) {
await requestDetailProvider.createActivityMaintenanceRequest().then((success) { await requestDetailProvider.createActivityMaintenanceRequest().then((success) {
@ -201,6 +204,36 @@ class _MaintenanceRequestFormState extends State<MaintenanceRequestForm> with Si
return false; 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) { // 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/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/widget_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/asset_transfer_attachment.dart';
import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/new_models/assigned_employee.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/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/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/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/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
@ -164,15 +166,34 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
return false; 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 (employee.employeeId != null) {
if (_formModel.modelAssistantEmployees?.startDate == null) { if (employee.startDate == null) {
Fluttertoast.showToast(msg: "Please Select Assistant Employee Start Time"); Fluttertoast.showToast(
return false; msg: "Please select start time for assistant employee ${employee.employeeName}",
} );
if (_formModel.modelAssistantEmployees?.endDate == null) { return false;
Fluttertoast.showToast(msg: "Please Select Assistant Employee End Time"); }
return false;
if (employee.endDate == null) {
Fluttertoast.showToast(
msg: "Please select end time for assistant employee ${employee.employeeName}",
);
return false;
}
}
} }
} }
return true; return true;
@ -252,10 +273,17 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
], ],
).toShadowContainer(context), ).toShadowContainer(context),
16.height, 16.height,
AssistantEmployeeCard( DeviceTransferAssistantEmployeeList(
isSender: widget.isSender, assetId: _formModel.assetId,
formModel: _formModel, createdDate: _formModel.createdDate??'',
).toShadowContainer(context, paddingObject: const EdgeInsets.symmetric(horizontal: 16)), assistantEmployeeList: widget.isSender?_formModel.assetTransferAssistantEmployeesSender:_formModel.assetTransferAssistantEmployeesReceiver,
cardPadding: 0,
onListChanged: (updatedList) {
setState(() {
_formModel.assistantEmployList = updatedList;
});
},
),
], ],
), ),
).expanded, ).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 @override
State<AssistantEmployeeCard> createState() => _AssistantEmployeeCardState(); State<DeviceTransferAssistantEmployeeList> createState() => _DeviceTransferAssistantEmployeeListState();
} }
class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> { class _DeviceTransferAssistantEmployeeListState extends State<DeviceTransferAssistantEmployeeList> {
final TextEditingController _workingHoursController = TextEditingController(text: ''); late List<AssetTransferAssistantEmployees> _list;
bool isCurrentUserIsAssistantEmp = false; late List<TextEditingController> _controllers;
bool isExpanded = false;
List<AssetTransferAssistantEmployees> employeeList = [];
AssistantEmployees selectedEmployee = AssistantEmployees();
@override @override
void initState() { void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) {
getInitialData();
});
super.initState(); super.initState();
_list = List<AssetTransferAssistantEmployees>.from(widget.assistantEmployeeList ?? []);
_controllers = _list.map((e) => TextEditingController(text: e.workingHours?.toString() ?? '')).toList();
} }
Future<void> getInitialData() async { void _addNewEntry() {
if (widget.isSender!) { setState(() {
employeeList = widget.formModel!.assetTransferAssistantEmployeesSender ?? []; _list.add(AssetTransferAssistantEmployees());
} else { _controllers.add(TextEditingController());
employeeList = widget.formModel!.assetTransferAssistantEmployeesReceiver ?? []; });
} 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(); void _updateModel(int index, void Function(AssetTransferAssistantEmployees model) updateList, {bool updateController = false}) {
if (employeeList.isNotEmpty) { setState(() {
assignedUser = AssignedEmployee( updateList(_list[index]);
id: employeeList[0].employeeId, });
name: employeeList[0].employeeName,
);
}
selectedEmployee = AssistantEmployees(userId: assignedUser.id, user: assignedUser);
} }
@override @override
void dispose() { Widget build(BuildContext context) {
_workingHoursController.dispose(); return ListView.builder(
super.dispose(); 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Column(
children: [ children: [
SizedBox( Row(
height: 56.toScreenHeight, mainAxisAlignment: MainAxisAlignment.spaceBetween,
child: Row( children: [
mainAxisAlignment: MainAxisAlignment.spaceBetween, context.translation.assistantEmployee.bodyText(context).custom(color: AppColor.black20),
children: [ Container(
context.translation.assistantEmployee.heading6(context).custom(color: AppColor.black10), height: 32,
Icon(isExpanded ? Icons.keyboard_arrow_up_rounded : Icons.keyboard_arrow_down_rounded), width: 32,
], padding: const EdgeInsets.all(6),
), child: "trash".toSvgAsset(height: 20, width: 20),
).onPress(() { ).onPress(onRemove),
setState(() { ],
isExpanded = !isExpanded; ),
}); 8.height,
}), Column(
isExpanded crossAxisAlignment: CrossAxisAlignment.stretch,
? Column( children: [
crossAxisAlignment: CrossAxisAlignment.stretch, ServiceReportAssistantEmployeeMenu(
children: [ title: context.translation.select,
ServiceReportAssistantEmployeeMenu( backgroundColor: AppColor.neutral100,
title: context.translation.select, assetId:assetId,
backgroundColor: AppColor.neutral100, initialValue: selectedEmployee,
assetId: widget.formModel?.assetId ?? 0, onSelect: (employee) {
initialValue: selectedEmployee, if (employee != null) {
onSelect: (employee) { onUpdate((model) {
if (employee == null) { selectedEmployee = employee.copyWith(id: 0);
widget.formModel?.assistantEmployees = []; model.employeeId = employee.user?.id;
} else { selectedEmployee?.user = AssignedEmployee(
selectedEmployee = employee; id: employee.user?.id,
widget.formModel?.assistantEmployees = [employee.copyWith(id: 0)]; name: employee.user?.name,
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: 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, ).expanded,
Row( 8.width,
mainAxisSize: MainAxisSize.min, ADatePicker(
children: [ label: context.translation.endTime,
ADatePicker( hideShadow: true,
label: context.translation.startTime, backgroundColor: AppColor.neutral100,
hideShadow: true, date: model.endDate,
backgroundColor: AppColor.neutral100, formatDateWithTime: true,
date: widget.formModel?.modelAssistantEmployees?.startDate, from: DateTime.tryParse(createdDate ?? ''),
from: DateTime.tryParse(widget.formModel?.createdDate ?? ''), onDatePicker: (selectedDate) {
formatDateWithTime: true, showTimePicker(
onDatePicker: (selectedDate) { context: context,
showTimePicker( initialTime: TimeOfDay.now(),
context: context, ).then((selectedTime) {
initialTime: TimeOfDay.now(), if (selectedTime != null) {
).then((selectedTime) { final endDateTime = DateTime(
// Handle the selected date and time here. selectedDate.year,
if (selectedTime != null) { selectedDate.month,
DateTime selectedDateTime = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute); selectedDate.day,
if (DateTime.tryParse(widget.formModel?.createdDate ?? '') != null && selectedDateTime.isBefore(DateTime.tryParse(widget.formModel?.createdDate ?? '')!)) { selectedTime.hour,
"Start time is before the request time.".showToast; selectedTime.minute,
selectedTime = null; );
return;
} if (!endDateTime.isBefore(DateTime.now())) {
if (selectedDateTime.isAfter(DateTime.now())) { "Please select a time before the current time.".showToast;
"Start time is after than current time".showToast; return;
selectedTime = null; }
return;
} if (model.startDate == null || !endDateTime.isAfter(model.startDate!)) {
widget.formModel?.modelAssistantEmployees?.startDate = selectedDateTime; "End date must be after start date".showToast;
ServiceRequestUtils.calculateAndAssignWorkingHours( return;
startTime: widget.formModel?.modelAssistantEmployees?.startDate, }
endTime: widget.formModel?.modelAssistantEmployees?.endDate,
workingHoursController: _workingHoursController, onUpdate((model) {
updateModel: (hours) { model.endDate = endDateTime;
widget.formModel?.modelAssistantEmployees?.workingHours = hours; ServiceRequestUtils.calculateAndAssignWorkingHours(
}); startTime: model.startDate,
setState(() {}); endTime: model.endDate,
} workingHoursController: workingHoursController,
}); updateModel: (hours) => model.workingHours = hours,
}, );
).expanded, });
8.width, }
ADatePicker( });
label: context.translation.endTime, },
hideShadow: true, ).expanded,
backgroundColor: AppColor.neutral100, ],
date: widget.formModel?.modelAssistantEmployees?.endDate, ),
formatDateWithTime: true, 8.height,
onDatePicker: (selectedDate) { AppTextFormField(
showTimePicker( labelText: context.translation.workingHours,
context: context, backgroundColor: AppColor.neutral80,
initialTime: TimeOfDay.now(), controller: workingHoursController,
).then((selectedTime) { suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16),
if (selectedTime != null) { textAlign: TextAlign.center,
DateTime selectedDateTime = DateTime( enable: false,
selectedDate.year, showShadow: false,
selectedDate.month, labelStyle: AppTextStyles.textFieldLabelStyle,
selectedDate.day, style: Theme.of(context).textTheme.titleMedium,
selectedTime.hour, ),
selectedTime.minute, 8.height,
); AppTextFormField(
if (widget.formModel?.modelAssistantEmployees?.startDate != null && selectedDateTime.isBefore(widget.formModel!.modelAssistantEmployees!.startDate!)) { initialValue: model.techComment,
"End Date time must be greater then start date".showToast; labelText: context.translation.technicalComment,
return; backgroundColor: AppColor.neutral100,
} showShadow: false,
labelStyle: AppTextStyles.textFieldLabelStyle,
selectedDate = selectedDate.add(Duration(hours: selectedTime.hour, minutes: selectedTime.minute)); alignLabelWithHint: true,
bool isBeforeCurrentTime = selectedDate.isBefore(DateTime.now()); textInputType: TextInputType.multiline,
bool isAfterStartTime = selectedDate.isAfter(widget.formModel!.modelAssistantEmployees!.startDate!); onChange: (value) => onUpdate((model) => model.techComment = value),
if (!isBeforeCurrentTime) { // onSaved: (value) => onUpdate((model) => model.technicalComment = value),
"Please select a time before the current time.".showToast; ),
return; 8.height,
} ],
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(),
], ],
); ).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