Merged with main_latest

merge-requests/31/head
zaid_daoud 3 years ago
parent 47b1a0ff36
commit c8f498db6a

@ -28,16 +28,14 @@ import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart';
import 'package:test_sa/views/widgets/parts/part_item.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart';
import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart';
import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart';
import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart';
import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; import 'package:test_sa/views/widgets/status/report/service_report_status.dart';
import 'package:test_sa/views/widgets/status/report/service_status.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart';
import '../../../../widgets/speech_to_text/speech_to_text.dart'; import '../../../../widgets/speech_to_text/speech_to_text.dart';
import '../../../../widgets/status/report/service_report_fault_description.dart';
import '../../../../widgets/status/report/service_report_repair_location.dart'; import '../../../../widgets/status/report/service_report_repair_location.dart';
class CreateServiceReport extends StatefulWidget { class CreateServiceReport extends StatefulWidget {
@ -75,7 +73,6 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
device: widget.request.device, device: widget.request.device,
parts: [], parts: [],
); );
super.initState(); super.initState();
} }
@ -275,12 +272,31 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
ServiceAssetTypeMenu( LoadingManager(
initialValue: _serviceReport.assetType, isLoading: _assetTypeProvider.isLoading,
onSelect: (status) { isFailedLoading: _assetTypeProvider.statuses == null,
_serviceReport.assetType = status; stateCode: _assetTypeProvider.stateCode,
onRefresh: () async {
_assetTypeProvider.reset();
await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host);
_serviceReport?.assetType = _assetTypeProvider.statuses?.firstWhere(
(element) => element.value == widget.request?.device?.hospital?.id,
orElse: () => null,
);
}, },
child: ATextFormField(
initialValue: _serviceReport?.assetType?.name ?? "NULL",
textAlign: TextAlign.center,
enable: false,
style: Theme.of(context).textTheme.titleMedium,
),
), ),
// ServiceAssetTypeMenu(
// initialValue: _serviceReport.assetType,
// onSelect: (status) {
// _serviceReport.assetType = status;
// },
// ),
const SizedBox( const SizedBox(
height: 8, height: 8,
), ),
@ -353,6 +369,21 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
), ),
], ],
), ),
if (_showCommentField)
const SizedBox(
height: 8,
),
if (_showCommentField)
ATextFormField(
initialValue: _serviceReport?.reviewComment,
hintText: "Review Comment",
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.multiline,
onSaved: (value) {
_serviceReport.reviewComment = value;
},
),
SizedBox( SizedBox(
height: 8 * AppStyle.getScaleFactor(context), height: 8 * AppStyle.getScaleFactor(context),
), ),
@ -417,176 +448,48 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
// _serviceReport.workHours = value; // _serviceReport.workHours = value;
}, },
), ),
// Report type and Reasons const SizedBox(
Row( height: 8,
children: [
// Report Status
// Expanded(
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ASubTitle(_subtitle.reportType),
// _validate && _serviceReport.type == null ?
// ASubTitle(_subtitle.requiredWord,color: Colors.red,):
// const SizedBox.shrink(),
// const SizedBox(height: 4,),
// ServiceReportTypeMenu(
// initialValue: _serviceReport.type,
// onSelect: (status){
// _serviceReport.type = status;
// },
// ),
// ],
// ),
// ),
// const SizedBox(width: 8,),
// visit date
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.visitDate),
_validate && _serviceReport.visitDate == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
Row(
children: [
Expanded(
child: ADatePicker(
date: _serviceReport.visitDate,
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)),
onDatePicker: (date) {
_serviceReport.visitDate = date;
setState(() {});
},
),
),
],
),
],
),
), ),
], // device sn
), Visibility(
const SizedBox( visible: widget.request.deviceSerialNumber == null,
height: 8,
),
// device sn
Visibility(
visible: widget.request.deviceSerialNumber == null,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.deviceSN),
_validate && _serviceReport.device?.id == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
AutoCompleteDeviceField(
hospitalId: widget.request.hospitalId,
initialValue: _serviceReport.device,
onPick: (id) {
_serviceReport.device.id = id;
},
),
const SizedBox(
height: 8,
),
],
),
),
const SizedBox(
height: 8,
),
ASubTitle(_subtitle.serviceType),
_validate && _serviceReport.assetType == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
LoadingManager(
isLoading: _assetTypeProvider.isLoading,
isFailedLoading: _assetTypeProvider.statuses == null,
stateCode: _assetTypeProvider.stateCode,
onRefresh: () async {
_assetTypeProvider.reset();
await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host);
_serviceReport?.assetType = _assetTypeProvider.statuses?.firstWhere(
(element) => element.value == widget.request?.device?.hospital?.id,
orElse: () => null,
);
},
child: ATextFormField(
initialValue: _serviceReport?.assetType?.name ?? "NULL",
textAlign: TextAlign.center,
enable: false,
style: Theme.of(context).textTheme.titleMedium,
),
),
// ServiceAssetTypeMenu(
// initialValue: _serviceReport.assetType,
// onSelect: (status) {
// _serviceReport.assetType = status;
// },
// ),
const SizedBox(
height: 8,
),
// Report status and Service Type
Row(
children: [
// report status
Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.reportStatus), ASubTitle(_subtitle.deviceSN),
_validate && _serviceReport.status == null _validate && _serviceReport.device?.id == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, _subtitle.requiredWord,
color: Colors.red, color: Colors.red,
) )
: const SizedBox.shrink(), : const SizedBox.shrink(),
const SizedBox( AutoCompleteDeviceField(
height: 4, hospitalId: widget.request.hospitalId,
), initialValue: _serviceReport.device,
ServiceReportStatusMenu( onPick: (id) {
report: _serviceReport, _serviceReport.device.id = id;
request: widget.request,
onSelect: (status) {
_serviceReport.status = status;
_showCommentField = _serviceReport.status?.name == "Resolved";
setState(() {});
}, },
), ),
const SizedBox(
height: 8,
),
], ],
), ),
), ),
const SizedBox( const SizedBox(
width: 8, height: 8,
), ),
// Provider.of<ServiceReportLastCallsProvider>(context).isLoading == null // Report status and Service Type
// ? const SizedBox.shrink(): Row(
// Call's last Situation children: [
Consumer<ServiceReportLastCallsProvider>( // report status
builder: (_, provider, __) { Expanded(
if (provider.isLoading == null) return const SizedBox.shrink();
return Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.callLastSituation), ASubTitle(_subtitle.reportStatus),
_validate && _serviceReport.callLastSituation == null _validate && _serviceReport.status == null
? ASubTitle( ? ASubTitle(
_subtitle.requiredWord, _subtitle.requiredWord,
color: Colors.red, color: Colors.red,
@ -595,121 +498,99 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
ServiceReportLastCallsMenu( ServiceReportStatusMenu(
report: _serviceReport, report: _serviceReport,
request: widget.request,
onSelect: (status) { onSelect: (status) {
if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { _serviceReport.status = status;
_serviceReport.callLastSituation = status; _showCommentField = _serviceReport.status?.name == "Resolved";
setState(() {}); setState(() {});
} else {
_serviceReport.callLastSituation = status;
}
}, },
), ),
], ],
), ),
); ),
}, const SizedBox(
width: 8,
),
// Provider.of<ServiceReportLastCallsProvider>(context).isLoading == null
// ? const SizedBox.shrink():
// Call's last Situation
Consumer<ServiceReportLastCallsProvider>(
builder: (_, provider, __) {
if (provider.isLoading == null) return const SizedBox.shrink();
return Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.callLastSituation),
_validate && _serviceReport.callLastSituation == null
? ASubTitle(
_subtitle.requiredWord,
color: Colors.red,
)
: const SizedBox.shrink(),
const SizedBox(
height: 4,
),
ServiceReportLastCallsMenu(
report: _serviceReport,
onSelect: (status) {
if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) {
_serviceReport.callLastSituation = status;
setState(() {});
} else {
_serviceReport.callLastSituation = status;
}
},
),
],
),
);
},
),
],
), ),
], if (_showCommentField)
), const SizedBox(
if (_showCommentField) height: 8,
const SizedBox(
height: 8,
),
if (_showCommentField)
ATextFormField(
initialValue: _serviceReport?.reviewComment,
hintText: "Review Comment",
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.multiline,
onSaved: (value) {
_serviceReport.reviewComment = value;
},
),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const ASubTitle("Start of Work"),
SizedBox(
height: 8 * AppStyle.getScaleFactor(context),
),
ADateTimePicker(
date: _serviceReport.startDate,
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)),
onDateTimePicker: (date) {
_serviceReport.startDate = date;
setState(() {});
},
),
],
), ),
), if (_showCommentField)
const SizedBox(width: 8), ATextFormField(
Expanded( initialValue: _serviceReport?.reviewComment,
child: Column( hintText: "Review Comment",
crossAxisAlignment: CrossAxisAlignment.stretch, textAlign: TextAlign.center,
children: [ style: Theme.of(context).textTheme.titleMedium,
const ASubTitle("End of Work"), textInputType: TextInputType.multiline,
SizedBox( onSaved: (value) {
height: 8 * AppStyle.getScaleFactor(context), _serviceReport.reviewComment = value;
), },
ADateTimePicker(
date: _serviceReport.endDate,
from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)),
onDateTimePicker: (date) {
_serviceReport.endDate = date;
setState(() {});
},
),
],
), ),
),
],
),
ASubTitle(_subtitle.workingHours),
const SizedBox(height: 4),
ATextFormField(
initialValue: null,
textAlign: TextAlign.center,
hintText: _serviceReport.startDate == null ? "0" : _serviceReport?.endDate?.difference(_serviceReport?.startDate)?.inHours?.toString() ?? "0",
enable: false,
style: Theme.of(context).textTheme.subtitle1,
validator: (value) => Validator.isNumeric(value.isEmpty ? "0" : value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.number,
onSaved: (value) {
// _serviceReport.workHours = value;
},
),
SizedBox( SizedBox(
height: 8 * AppStyle.getScaleFactor(context), height: 8 * AppStyle.getScaleFactor(context),
), ),
const ASubTitle("Assigned Employee"), // const ASubTitle("Assigned Employee"),
const SizedBox(height: 8), // const SizedBox(
_validate && _serviceReport.engineer == null // height: 8,
? ASubTitle( // ),
_subtitle.requiredWord, // _validate && _serviceReport.engineer == null
color: Colors.red, // ? ASubTitle(
) // _subtitle.requiredWord,
: const SizedBox.shrink(), // color: Colors.red,
const SizedBox(height: 4), // )
EngineersMenu( // : const SizedBox.shrink(),
initialValue: _serviceReport.engineer, // const SizedBox(
onSelect: (engineer) { // height: 4,
_serviceReport.engineer = engineer; // ),
}, // EngineersMenu(
), // initialValue: _serviceReport.engineer,
const SizedBox(height: 8), // onSelect: (engineer) {
// _serviceReport.engineer = engineer;
// },
// ),
// const SizedBox(
// height: 8,
// ),
// invoice number & code // invoice number & code
_serviceReport.callLastSituation?.id != 12 _serviceReport.callLastSituation?.id != 12
? const SizedBox.shrink() ? const SizedBox.shrink()
@ -736,13 +617,17 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
], ],
), ),
), ),
const SizedBox(width: 8), const SizedBox(
width: 8,
),
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.invoiceCode), ASubTitle(_subtitle.invoiceCode),
const SizedBox(height: 4), const SizedBox(
height: 4,
),
ATextFormField( ATextFormField(
initialValue: _serviceReport?.invoiceCode, initialValue: _serviceReport?.invoiceCode,
textAlign: TextAlign.center, textAlign: TextAlign.center,
@ -759,33 +644,35 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
], ],
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Row( ASubTitle(_subtitle.faultDescription),
children: [ const SizedBox(
ASubTitle(_subtitle.faultDescription), height: 4,
Expanded(
child: SizedBox(
height: 32 * AppStyle.getScaleFactor(context),
child: SpeechToTextButton(
controller: _faultController,
mini: true,
),
),
),
],
), ),
const SizedBox(height: 4), ServiceReportFaultDescription(
ATextFormField( requestId: widget.request?.id,
initialValue: _serviceReport?.faultDescriptionId?.toString(), initialValue: _serviceReport.faultDescription,
textAlign: TextAlign.center, onSelect: (status) {
controller: _faultController, _serviceReport.faultDescription = status;
style: Theme.of(context).textTheme.titleMedium, setState(() {});
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.multiline,
onSaved: (value) {
_serviceReport.faultDescriptionId = int.tryParse(value) ?? 0;
}, },
), ),
const SizedBox(height: 8), const SizedBox(
height: 4,
),
// ATextFormField(
// initialValue: _serviceReport?.faultDescriptionId?.toString(),
// textAlign: TextAlign.center,
// controller: _faultController,
// style: Theme.of(context).textTheme.titleMedium,
// validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
// textInputType: TextInputType.multiline,
// onSaved: (value) {
// _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0;
// },
// ),
const SizedBox(
height: 8,
),
Row( Row(
children: [ children: [
ASubTitle(_subtitle.workPreformed), ASubTitle(_subtitle.workPreformed),
@ -800,7 +687,9 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
), ),
], ],
), ),
const SizedBox(height: 4), const SizedBox(
height: 4,
),
ATextFormField( ATextFormField(
initialValue: _serviceReport?.workPreformed, initialValue: _serviceReport?.workPreformed,
textAlign: TextAlign.center, textAlign: TextAlign.center,
@ -812,145 +701,9 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
_serviceReport.workPreformed = value; _serviceReport.workPreformed = value;
}, },
), ),
const SizedBox(height: 8), const SizedBox(
SizedBox( height: 8,
height: 8 * AppStyle.getScaleFactor(context),
),
// const ASubTitle("Assigned Employee"),
// const SizedBox(
// height: 8,
// ),
// _validate && _serviceReport.engineer == null
// ? ASubTitle(
// _subtitle.requiredWord,
// color: Colors.red,
// )
// : const SizedBox.shrink(),
// const SizedBox(
// height: 4,
// ),
// EngineersMenu(
// initialValue: _serviceReport.engineer,
// onSelect: (engineer) {
// _serviceReport.engineer = engineer;
// },
// ),
// const SizedBox(
// height: 8,
// ),
// invoice number & code
_serviceReport.callLastSituation?.id != 12
? const SizedBox.shrink()
: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.invoiceNumber),
const SizedBox(
height: 8,
),
ATextFormField(
initialValue: _serviceReport?.invoiceNumber,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.number,
onSaved: (value) {
_serviceReport.invoiceNumber = value;
},
),
],
),
),
const SizedBox(
width: 8,
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.invoiceCode),
const SizedBox(
height: 4,
),
ATextFormField(
initialValue: _serviceReport?.invoiceCode,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.text,
onSaved: (value) {
_serviceReport.invoiceCode = value;
},
),
],
),
),
],
),
const SizedBox(height: 8),
ASubTitle(_subtitle.faultDescription),
const SizedBox(
height: 4,
),
ServiceReportFaultDescription(
requestId: widget.request.id,
initialValue: _serviceReport.faultDescription,
onSelect: (status) {
_serviceReport.faultDescription = status;
setState(() {});
},
),
const SizedBox(
height: 4,
),
// ATextFormField(
// initialValue: _serviceReport?.faultDescriptionId?.toString(),
// textAlign: TextAlign.center,
// controller: _faultController,
// style: Theme.of(context).textTheme.titleMedium,
// validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
// textInputType: TextInputType.multiline,
// onSaved: (value) {
// _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0;
// },
// ),
const SizedBox(
height: 8,
),
Row(
children: [
ASubTitle(_subtitle.workPreformed),
Expanded(
child: SizedBox(
height: 32 * AppStyle.getScaleFactor(context),
child: SpeechToTextButton(
controller: _workPreformedController,
mini: true,
),
),
), ),
],
),
const SizedBox(
height: 4,
),
ATextFormField(
initialValue: _serviceReport?.workPreformed,
textAlign: TextAlign.center,
controller: _workPreformedController,
style: Theme.of(context).textTheme.subtitle1,
validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.multiline,
onSaved: (value) {
_serviceReport.workPreformed = value;
},
),
const SizedBox(
height: 8,
),
const SizedBox(height: 8), const SizedBox(height: 8),
Row( Row(
@ -1263,8 +1016,8 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
if (!_serviceReport.validate()) return; if (!_serviceReport.validate()) return;
_formKey.currentState.save(); _formKey.currentState.save();
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
int status = await _serviceRequestsProvider.createServiceReport( int status = await _serviceRequestsProvider.createServiceReport(
user: _userProvider.user, user: _userProvider.user,

@ -28,7 +28,7 @@ class ServiceReportFaultDescription extends StatelessWidget {
menuProvider.reset(); menuProvider.reset();
await menuProvider.getData(user: userProvider.user, host: settingProvider.host, requestId: requestId); await menuProvider.getData(user: userProvider.user, host: settingProvider.host, requestId: requestId);
}, },
child: menuProvider.items.isEmpty child: menuProvider.items?.isEmpty ?? true
? const ATextFormField( ? const ATextFormField(
initialValue: "NULL", initialValue: "NULL",
enable: false, enable: false,

Loading…
Cancel
Save