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