|
|
|
|
@ -5,42 +5,44 @@ import 'package:flutter/material.dart';
|
|
|
|
|
import 'package:flutter/rendering.dart';
|
|
|
|
|
import 'package:fluttertoast/fluttertoast.dart';
|
|
|
|
|
import 'package:provider/provider.dart';
|
|
|
|
|
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
|
|
|
|
|
import 'package:test_sa/controllers/localization/localization.dart';
|
|
|
|
|
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
|
|
|
|
|
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
|
|
|
|
|
import 'package:test_sa/controllers/providers/api/user_provider.dart';
|
|
|
|
|
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
|
|
|
|
|
import 'package:test_sa/controllers/validator/validator.dart';
|
|
|
|
|
import 'package:test_sa/models/part.dart';
|
|
|
|
|
import 'package:test_sa/models/service_report.dart';
|
|
|
|
|
import 'package:test_sa/models/service_request/service_request.dart';
|
|
|
|
|
import 'package:test_sa/models/subtitle.dart';
|
|
|
|
|
import 'package:test_sa/views/app_style/colors.dart';
|
|
|
|
|
import 'package:test_sa/views/app_style/sizing.dart';
|
|
|
|
|
import 'package:test_sa/views/widgets/app_text_form_field.dart';
|
|
|
|
|
import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
|
|
|
|
|
import 'package:test_sa/views/widgets/buttons/app_button.dart';
|
|
|
|
|
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
|
|
|
|
|
import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart';
|
|
|
|
|
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/parts/auto_complete_parts_field.dart';
|
|
|
|
|
import 'package:test_sa/views/widgets/parts/part_item.dart';
|
|
|
|
|
import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.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_status.dart';
|
|
|
|
|
import 'package:test_sa/views/widgets/status/report/service_report_type.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 '../../../../../controllers/http_status_manger/http_status_manger.dart';
|
|
|
|
|
import '../../../../../controllers/localization/localization.dart';
|
|
|
|
|
import '../../../../../controllers/providers/api/service_requests_provider.dart';
|
|
|
|
|
import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
|
|
|
|
|
import '../../../../../controllers/providers/api/user_provider.dart';
|
|
|
|
|
import '../../../../../controllers/providers/settings/setting_provider.dart';
|
|
|
|
|
import '../../../../../controllers/validator/validator.dart';
|
|
|
|
|
import '../../../../../models/part.dart';
|
|
|
|
|
import '../../../../../models/service_report.dart';
|
|
|
|
|
import '../../../../../models/service_request/service_request.dart';
|
|
|
|
|
import '../../../../../models/subtitle.dart';
|
|
|
|
|
import '../../../../app_style/colors.dart';
|
|
|
|
|
import '../../../../app_style/sizing.dart';
|
|
|
|
|
import '../../../../widgets/app_text_form_field.dart';
|
|
|
|
|
import '../../../../widgets/buttons/app_back_button.dart';
|
|
|
|
|
import '../../../../widgets/buttons/app_button.dart';
|
|
|
|
|
import '../../../../widgets/date_and_time/date_picker.dart';
|
|
|
|
|
import '../../../../widgets/equipment/auto_complete_devices_field.dart';
|
|
|
|
|
import '../../../../widgets/images/mini_one_image_picker.dart';
|
|
|
|
|
import '../../../../widgets/loaders/loading_manager.dart';
|
|
|
|
|
import '../../../../widgets/parts/auto_complete_parts_field.dart';
|
|
|
|
|
import '../../../../widgets/parts/part_item.dart';
|
|
|
|
|
import '../../../../widgets/speech_to_text/speech_to_text.dart';
|
|
|
|
|
import '../../../../widgets/status/report/service_report_last_call.dart';
|
|
|
|
|
import '../../../../widgets/status/report/service_report_reasons.dart';
|
|
|
|
|
import '../../../../widgets/status/report/service_report_status.dart';
|
|
|
|
|
import '../../../../widgets/status/report/service_report_type.dart';
|
|
|
|
|
import '../../../../widgets/status/report/service_status.dart';
|
|
|
|
|
import '../../../../widgets/timer/app_timer.dart';
|
|
|
|
|
import '../../../../widgets/titles/app_sub_title.dart';
|
|
|
|
|
|
|
|
|
|
class EditServiceReport extends StatefulWidget {
|
|
|
|
|
static final String id = "/edit-service-report";
|
|
|
|
|
final ServiceRequest request ;
|
|
|
|
|
final ServiceReport report;
|
|
|
|
|
|
|
|
|
|
const EditServiceReport({Key key, this.request, this.report}) : super(key: key);
|
|
|
|
|
const EditServiceReport({Key? key, required this.request, required this.report}) : super(key: key);
|
|
|
|
|
@override
|
|
|
|
|
_EditServiceReportState createState() => _EditServiceReportState();
|
|
|
|
|
}
|
|
|
|
|
@ -48,16 +50,16 @@ class EditServiceReport extends StatefulWidget {
|
|
|
|
|
class _EditServiceReportState extends State<EditServiceReport> with TickerProviderStateMixin{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UserProvider _userProvider;
|
|
|
|
|
SettingProvider _settingProvider;
|
|
|
|
|
ServiceRequestsProvider _serviceRequestsProvider;
|
|
|
|
|
late UserProvider _userProvider;
|
|
|
|
|
late SettingProvider _settingProvider;
|
|
|
|
|
late ServiceRequestsProvider _serviceRequestsProvider;
|
|
|
|
|
|
|
|
|
|
bool _validate = false;
|
|
|
|
|
ServiceReport _serviceReport;
|
|
|
|
|
late ServiceReport _serviceReport;
|
|
|
|
|
bool _isLoading = false;
|
|
|
|
|
|
|
|
|
|
Subtitle _subtitle;
|
|
|
|
|
File _image;
|
|
|
|
|
late Subtitle _subtitle;
|
|
|
|
|
late File _image;
|
|
|
|
|
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
|
|
|
|
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
|
|
|
|
|
TextEditingController _faultController = TextEditingController();
|
|
|
|
|
@ -80,7 +82,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
|
|
|
|
|
_userProvider = Provider.of<UserProvider>(context);
|
|
|
|
|
_settingProvider = Provider.of<SettingProvider>(context);
|
|
|
|
|
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
|
|
|
|
|
_subtitle = AppLocalization.of(context).subtitle;
|
|
|
|
|
_subtitle = AppLocalization.of(context)!.subtitle!;
|
|
|
|
|
return Scaffold(
|
|
|
|
|
key: _scaffoldKey,
|
|
|
|
|
body: SafeArea(
|
|
|
|
|
@ -102,7 +104,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
|
|
|
|
|
padding: const EdgeInsets.all(8.0),
|
|
|
|
|
child: Text(
|
|
|
|
|
_subtitle.editServiceReport,
|
|
|
|
|
style: Theme.of(context).textTheme.headline5.copyWith(
|
|
|
|
|
style: Theme.of(context).textTheme.headline5?.copyWith(
|
|
|
|
|
color: AColors.cyan,
|
|
|
|
|
fontSize: 28,
|
|
|
|
|
fontWeight: FontWeight.bold
|
|
|
|
|
@ -117,7 +119,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
|
|
|
|
|
color: AColors.grey,
|
|
|
|
|
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
|
|
|
|
|
boxShadow: [
|
|
|
|
|
const BoxShadow(
|
|
|
|
|
BoxShadow(
|
|
|
|
|
color: AColors.grey,
|
|
|
|
|
offset: Offset(0,-1),
|
|
|
|
|
)
|
|
|
|
|
@ -135,7 +137,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
|
|
|
|
|
ASubTitle("${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",font: 14,),
|
|
|
|
|
Text(
|
|
|
|
|
"${_subtitle.customer}: ${widget.request.hospitalName}",
|
|
|
|
|
style: Theme.of(context).textTheme.subtitle1.copyWith(
|
|
|
|
|
style: Theme.of(context).textTheme.subtitle1?.copyWith(
|
|
|
|
|
fontWeight: FontWeight.bold,
|
|
|
|
|
fontSize: 12,
|
|
|
|
|
),
|
|
|
|
|
@ -212,9 +214,9 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
|
|
|
|
|
const SizedBox.shrink(),
|
|
|
|
|
AutoCompleteDeviceField(
|
|
|
|
|
hospitalId: widget.request.hospitalId,
|
|
|
|
|
initialValue: _serviceReport.device,
|
|
|
|
|
initialValue: _serviceReport.device!,
|
|
|
|
|
onPick: (id){
|
|
|
|
|
_serviceReport.device.id = id;
|
|
|
|
|
_serviceReport.device?.id = id;
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
const SizedBox(height: 8,),
|
|
|
|
|
@ -303,8 +305,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
|
|
|
|
|
textAlign: TextAlign.center,
|
|
|
|
|
style: Theme.of(context).textTheme.subtitle1,
|
|
|
|
|
validator: (value) =>
|
|
|
|
|
Validator.hasValue(value)
|
|
|
|
|
? null : _subtitle.requiredWord,
|
|
|
|
|
Validator.hasValue(value!)
|
|
|
|
|
? '' : _subtitle.requiredWord,
|
|
|
|
|
textInputType: TextInputType.number,
|
|
|
|
|
onSaved: (value){
|
|
|
|
|
_serviceReport.invoiceNumber = value;
|
|
|
|
|
@ -325,8 +327,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
|
|
|
|
|
textAlign: TextAlign.center,
|
|
|
|
|
style: Theme.of(context).textTheme.subtitle1,
|
|
|
|
|
validator: (value) =>
|
|
|
|
|
Validator.hasValue(value)
|
|
|
|
|
? null : _subtitle.requiredWord,
|
|
|
|
|
Validator.hasValue(value!)
|
|
|
|
|
? '' : _subtitle.requiredWord,
|
|
|
|
|
textInputType: TextInputType.text,
|
|
|
|
|
onSaved: (value){
|
|
|
|
|
_serviceReport.invoiceCode = value;
|
|
|
|
|
@ -360,8 +362,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
|
|
|
|
|
controller: _faultController,
|
|
|
|
|
style: Theme.of(context).textTheme.subtitle1,
|
|
|
|
|
validator: (value) =>
|
|
|
|
|
Validator.hasValue(value)
|
|
|
|
|
? null : _subtitle.requiredWord,
|
|
|
|
|
Validator.hasValue(value!)
|
|
|
|
|
? '' : _subtitle.requiredWord,
|
|
|
|
|
textInputType: TextInputType.multiline,
|
|
|
|
|
onSaved: (value){
|
|
|
|
|
_serviceReport.faultDescription = value;
|
|
|
|
|
@ -389,8 +391,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
|
|
|
|
|
controller: _workPreformedController,
|
|
|
|
|
style: Theme.of(context).textTheme.subtitle1,
|
|
|
|
|
validator: (value) =>
|
|
|
|
|
Validator.hasValue(value)
|
|
|
|
|
? null : _subtitle.requiredWord,
|
|
|
|
|
Validator.hasValue(value!)
|
|
|
|
|
? '' : _subtitle.requiredWord,
|
|
|
|
|
textInputType: TextInputType.multiline,
|
|
|
|
|
onSaved: (value){
|
|
|
|
|
_serviceReport.workPreformed = value;
|
|
|
|
|
@ -482,8 +484,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
|
|
|
|
|
hintText: "i.e 3, 3.5, 4",
|
|
|
|
|
style: Theme.of(context).textTheme.subtitle1,
|
|
|
|
|
validator: (value) =>
|
|
|
|
|
Validator.isNumeric(value)
|
|
|
|
|
? null : _subtitle.requiredWord,
|
|
|
|
|
Validator.isNumeric(value!)
|
|
|
|
|
? '' : _subtitle.requiredWord,
|
|
|
|
|
textInputType: TextInputType.number,
|
|
|
|
|
onSaved: (value){
|
|
|
|
|
_serviceReport.travelingHours = value;
|
|
|
|
|
@ -510,8 +512,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
|
|
|
|
|
hintText: "i.e 3, 3.5, 4",
|
|
|
|
|
style: Theme.of(context).textTheme.subtitle1,
|
|
|
|
|
validator: (value) =>
|
|
|
|
|
Validator.isNumeric(value)
|
|
|
|
|
? null : _subtitle.requiredWord,
|
|
|
|
|
Validator.isNumeric(value!)
|
|
|
|
|
? '' : _subtitle.requiredWord,
|
|
|
|
|
textInputType: TextInputType.number,
|
|
|
|
|
onSaved: (value){
|
|
|
|
|
_serviceReport.operatingHours = value;
|
|
|
|
|
@ -557,7 +559,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
|
|
|
|
|
const SizedBox(height: 4,),
|
|
|
|
|
AutoCompletePartsField(
|
|
|
|
|
onPick: (part){
|
|
|
|
|
_serviceReport.parts.add(part);
|
|
|
|
|
_serviceReport.parts?.add(part);
|
|
|
|
|
setState(() {});
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
@ -576,13 +578,13 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
|
|
|
|
|
),
|
|
|
|
|
Column(
|
|
|
|
|
children: List.generate(
|
|
|
|
|
_serviceReport.parts.length,
|
|
|
|
|
_serviceReport.parts!.length,
|
|
|
|
|
(index) {
|
|
|
|
|
Part _part = _serviceReport.parts[index];
|
|
|
|
|
Part _part = _serviceReport.parts![index];
|
|
|
|
|
return PartItem(
|
|
|
|
|
part: _part,
|
|
|
|
|
onDelete: (part){
|
|
|
|
|
_serviceReport.parts.remove(part);
|
|
|
|
|
_serviceReport.parts?.remove(part);
|
|
|
|
|
setState(() {});
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
@ -601,7 +603,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
|
|
|
|
|
text: _subtitle.update,
|
|
|
|
|
onPressed: () async {
|
|
|
|
|
_validate = true;
|
|
|
|
|
if(!_formKey.currentState.validate()){
|
|
|
|
|
if(!(_formKey.currentState?.validate()??false)){
|
|
|
|
|
setState(() {});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
@ -609,14 +611,14 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
|
|
|
|
|
setState(() {});
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
_formKey.currentState.save();
|
|
|
|
|
_formKey.currentState?.save();
|
|
|
|
|
|
|
|
|
|
_isLoading =true;
|
|
|
|
|
setState(() {});
|
|
|
|
|
|
|
|
|
|
int status = await _serviceRequestsProvider.updateServiceReport(
|
|
|
|
|
user: _userProvider.user,
|
|
|
|
|
host: _settingProvider.host,
|
|
|
|
|
user: _userProvider.user!,
|
|
|
|
|
host: _settingProvider.host??"",
|
|
|
|
|
report: _serviceReport,
|
|
|
|
|
request: widget.request
|
|
|
|
|
);
|
|
|
|
|
|