@ -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 ;
@ -210,88 +231,96 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
) ,
) ,
key: _scaffoldKey ,
key: _scaffoldKey ,
body: LoadingManager (
body: LoadingManager (
isLoading: _isLoading ,
isLoading: _isLoading ,
isFailedLoading: false ,
isFailedLoading: false ,
stateCode: 200 ,
stateCode: 200 ,
onRefresh: ( ) async { } ,
onRefresh: ( ) async { } ,
child: Form (
child: Form (
key: _formKey ,
key: _formKey ,
child: Column (
child: Column (
children: [
children: [
SingleChildScrollView (
SingleChildScrollView (
padding: EdgeInsets . all ( 12 * AppStyle . getScaleFactor ( context ) ) ,
padding: EdgeInsets . all ( 12 * AppStyle . getScaleFactor ( context ) ) ,
child: Column (
child: Column (
children: [
children: [
Column (
Column (
crossAxisAlignment: CrossAxisAlignment . stretch ,
crossAxisAlignment: CrossAxisAlignment . stretch ,
children: [
children: [
_timerWidget ( context , totalWorkingHours , isTimerEnable ) ,
_timerWidget ( context , totalWorkingHours , isTimerEnable ) ,
8. height ,
8. height ,
AppTextFormField (
AppTextFormField (
initialValue: widget . isSender ? _formModel . senderComment ? ? " " : _formModel . receiverComment ? ? " " ,
initialValue: widget . isSender ? _formModel . senderComment ? ? " " : _formModel . receiverComment ? ? " " ,
labelText: context . translation . technicalComment ,
labelText: context . translation . technicalComment ,
labelStyle: AppTextStyles . tinyFont . copyWith ( color: AppColor . neutral20 ) ,
labelStyle: AppTextStyles . tinyFont . copyWith ( color: AppColor . neutral20 ) ,
textInputType: TextInputType . multiline ,
textInputType: TextInputType . multiline ,
backgroundColor: AppColor . neutral100 ,
backgroundColor: AppColor . neutral100 ,
showShadow: false ,
showShadow: false ,
alignLabelWithHint: true ,
alignLabelWithHint: true ,
onSaved: ( value ) {
onSaved: ( value ) {
widget . isSender ? _formModel . senderComment = value : _formModel . receiverComment = value ;
widget . isSender ? _formModel . senderComment = value : _formModel . receiverComment = value ;
} ,
} ,
) ,
) ,
8. height ,
8. height ,
MultiFilesPicker (
MultiFilesPicker (
label: context . translation . attachFiles ,
label: context . translation . attachFiles ,
files: _files ,
files: _files ,
buttonColor: AppColor . black10 ,
buttonColor: AppColor . black10 ,
onlyImages: false ,
onlyImages: false ,
buttonIcon: ' image-plus ' . toSvgAsset ( color: AppColor . neutral120 ) ,
buttonIcon: ' image-plus ' . toSvgAsset ( color: AppColor . neutral120 ) ,
) ,
) ,
8. height ,
8. height ,
] ,
] ,
) . 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 ) {
) . expanded ,
setState ( ( ) {
FooterActionButton . footerContainer (
_formModel . assistantEmployList = updatedList ;
child: Row (
} ) ;
mainAxisAlignment: MainAxisAlignment . spaceAround ,
} ,
children: [
) ,
AppFilledButton (
] ,
label: context . translation . save ,
) ,
buttonColor: AppColor . white60 ,
) . expanded ,
textColor: AppColor . black10 ,
FooterActionButton . footerContainer (
onPressed: ( ) = > _update ( status: 0 ) ,
child: Row (
) . expanded ,
mainAxisAlignment: MainAxisAlignment . spaceAround ,
12. width ,
children: [
if ( ! widget . isSender & & _formModel . senderMachineStatusValue = = 3 ) . . . [
AppFilledButton (
AppFilledButton (
label: context . translation . save ,
buttonColor: AppColor . white60 ,
textColor: AppColor . black10 ,
onPressed: ( ) = > _update ( status: 0 ) ,
) . expanded ,
12. width ,
if ( ! widget . isSender & & _formModel . senderMachineStatusValue = = 3 ) . . . [
AppFilledButton (
label: context . translation . complete ,
buttonColor: AppColor . primary10 ,
onPressed: ( ) {
_update ( status: 1 ) ;
} ) . expanded ,
] else if ( widget . isSender ) . . . [
AppFilledButton (
label: context . translation . complete ,
label: context . translation . complete ,
buttonColor: AppColor . primary10 ,
buttonColor: AppColor . primary10 ,
onPressed: ( ) {
onPressed: ( ) {
_update ( status: 1 ) ;
_update ( status: 1 ) ;
} ) . expanded ,
} ,
] else if ( widget . isSender ) . . . [
) . expanded ,
AppFilledButton (
] ,
label: context . translation . complete ,
buttonColor: AppColor . primary10 ,
onPressed: ( ) {
_update ( status: 1 ) ;
} ,
) . expanded ,
] ,
] ,
] ,
) ,
) ,
) ,
) ,
] ,
] ,
) ,
) ,
) ,
) ,
) ,
) ,
) . handlePopScope (
) . handlePopScope (
cxt: context ,
cxt: context ,
onSave: ( ) {
onSave: ( ) {
@ -351,224 +380,513 @@ 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 ( ) = > _DeviceTransferAssistantEmployeeList State( ) ;
}
}
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 {
model . employeeName = employee . user ? . name ;
selectedEmployee = employee ;
selectedEmployee ? . user = AssignedEmployee (
widget . formModel ? . assistantEmployees = [ employee . copyWith ( id: 0 ) ] ;
id: employee . user ? . id ,
widget . formModel ? . modelAssistantEmployees ? . employeeId = 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 ,
) . 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 ( ) ,
/ / ] ,
/ / ) ;
/ / }
/ / }