From ffaa340d9ddb9eef44aaff37a0e7c8b2d09bbde8 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 20 Jun 2023 12:40:06 +0300 Subject: [PATCH] Enhancements --- ...e_report_assistants_employee_provider.dart | 76 ++++++++++++ .../report/service_report_users_provider.dart | 8 +- lib/main.dart | 2 + .../service_request/search_work_order.dart | 52 +++++++-- .../create_sub_workorder_page.dart | 87 +++++++------- .../spare_parts_details_bottom_sheet.dart | 54 +++------ .../work_order_details_bottom_sheet.dart | 67 +++-------- .../status/assistant_employee_menu.dart | 109 ++++++++++++++++++ .../report/service_report_all_users.dart | 4 +- ...ervice_report_assistant_employee_menu.dart | 31 +++++ 10 files changed, 344 insertions(+), 146 deletions(-) create mode 100644 lib/controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart create mode 100644 lib/views/widgets/status/assistant_employee_menu.dart create mode 100644 lib/views/widgets/status/report/service_report_assistant_employee_menu.dart diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart new file mode 100644 index 00000000..922242a9 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart @@ -0,0 +1,76 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/service_request/search_work_order.dart'; + +class ServiceReportAssistantsEmployeeProvider extends ChangeNotifier { + //reset provider data + void reset() { + _assistantEmployees = null; + _loading = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _assistantEmployees; + List get assistantEmployees => _assistantEmployees; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading) { + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// return state code if request complete may be 200, 404 or 403 + /// for more details check http state manager + /// lib\controllers\http_status_manger\http_status_manger.dart + Future getAssistantEmployees() async { + if (_loading == true) return -2; + _loading = true; + notifyListeners(); + Response response; + try { + response = await ApiManager.instance.get( + "${URLs.getEngineers}", + ); + // response = await get( + // Uri.parse( + // URLs.getServiceReportLastCalls + // +(serviceStatus == null ? "" : "?service_status=$serviceStatus") + // ), + // ); + _stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List usersListJson = json.decode(response.body); + _assistantEmployees = []; + _assistantEmployees = usersListJson.map((type) => AssistantEmployees.fromJson(type ?? {})).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart index 42132b29..6fcd5f80 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart @@ -10,7 +10,7 @@ import 'package:test_sa/models/engineer.dart'; class ServiceReportUsersProvider extends ChangeNotifier { //reset provider data void reset() { - _calls = null; + _engineers = null; _loading = null; _stateCode = null; } @@ -23,8 +23,8 @@ class ServiceReportUsersProvider extends ChangeNotifier { // contain user data // when user not login or register _user = null - List _calls; - List get users => _calls; + List _engineers; + List get engineers => _engineers; // when categories in-process _loading = true // done _loading = true @@ -60,7 +60,7 @@ class ServiceReportUsersProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List usersListJson = json.decode(response.body); - _calls = usersListJson.map((type) => Engineer.fromJson(type)).toList(); + _engineers = usersListJson.map((type) => Engineer.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/main.dart b/lib/main.dart index 89f7489a..466e0528 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -55,6 +55,7 @@ import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; import 'controllers/providers/api/parts_provider.dart'; import 'controllers/providers/api/preventive_maintenance_visits_provider.dart'; import 'controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart'; +import 'controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart'; @@ -129,6 +130,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => ServiceReportVisitOperatorProvider()), ChangeNotifierProvider(create: (_) => ServiceReportMaintenanceSituationProvider()), ChangeNotifierProvider(create: (_) => ServiceReportUsersProvider()), + ChangeNotifierProvider(create: (_) => ServiceReportAssistantsEmployeeProvider()), ], child: GestureDetector( onTap: () { diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index e2961414..d13626f6 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -1,7 +1,6 @@ +import 'package:test_sa/models/fault_description.dart'; import 'package:test_sa/models/lookup.dart'; -import '../fault_description.dart'; - class SearchWorkOrder { SearchWorkOrder({ this.id, @@ -97,6 +96,41 @@ class SearchWorkOrder { nurseSignature = json['nurseSignature']; woParentDto = json['woParentDto'] != null ? WoParentDto.fromJson(json['woParentDto']) : null; } + + void copyFrom(SearchWorkOrder wo) { + parentWOId = wo.parentWOId ?? parentWOId; + workOrderNo = wo.workOrderNo ?? workOrderNo; + workOrderYear = wo.workOrderYear ?? workOrderYear; + workOrderSequennce = wo.workOrderSequennce ?? workOrderSequennce; + callRequest = wo.callRequest ?? callRequest; + assetType = wo.assetType ?? assetType; + assignedEmployee = wo.assignedEmployee ?? assignedEmployee; + visitDate = wo.visitDate ?? visitDate; + assistantEmployees = wo.assistantEmployees ?? assistantEmployees; + supplier = wo.supplier ?? supplier; + vendorTicketNumber = wo.vendorTicketNumber ?? vendorTicketNumber; + contactPersonWorkOrders = wo.contactPersonWorkOrders ?? contactPersonWorkOrders; + calllastSituation = wo.calllastSituation ?? calllastSituation; + currentSituation = wo.currentSituation ?? currentSituation; + repairLocation = wo.repairLocation ?? repairLocation; + reason = wo.reason ?? reason; + startofWorkTime = wo.startofWorkTime ?? startofWorkTime; + endofWorkTime = wo.endofWorkTime ?? endofWorkTime; + workingHours = wo.workingHours ?? workingHours; + travelingHours = wo.travelingHours ?? travelingHours; + travelingExpenses = wo.travelingExpenses ?? travelingExpenses; + faultDescription = wo.faultDescription ?? faultDescription; + sparePartsWorkOrders = wo.sparePartsWorkOrders ?? sparePartsWorkOrders; + reviewComment = wo.reviewComment ?? reviewComment; + comment = wo.comment ?? comment; + attachmentsWorkOrder = wo.attachmentsWorkOrder ?? attachmentsWorkOrder; + equipmentStatus = wo.equipmentStatus ?? equipmentStatus; + suppEngineerWorkOrders = wo.suppEngineerWorkOrders ?? suppEngineerWorkOrders; + engSignature = wo.engSignature ?? engSignature; + nurseSignature = wo.nurseSignature ?? nurseSignature; + woParentDto = wo.woParentDto ?? woParentDto; + } + num id; num parentWOId; String workOrderNo; @@ -215,7 +249,7 @@ class SearchWorkOrder { } map['visitDate'] = visitDate; if (assistantEmployees != null) { - map['assistantEmployees'] = assistantEmployees.map((v) => v.toJson()).toList(); + map['assistantEmployees'] = assistantEmployees.map((v) => v?.user?.id).toList(); } if (supplier != null) { map['supplier'] = supplier.toJson(); @@ -250,7 +284,7 @@ class SearchWorkOrder { map['reviewComment'] = reviewComment; map['comment'] = comment; if (attachmentsWorkOrder != null) { - map['attachmentsWorkOrder'] = attachmentsWorkOrder.map((v) => {"name": v.name})?.toList(); + map['attachmentsWorkOrder'] = attachmentsWorkOrder.map((v) => v.toJson()).toList(); } if (equipmentStatus != null) { map['equipmentStatus'] = equipmentStatus.toMap(); @@ -961,7 +995,7 @@ class SparePartsWorkOrders { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id ?? 0; if (sparePart != null) { map['sparePart'] = sparePart.toJson(); } @@ -999,7 +1033,7 @@ class SparePart { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id ?? 0; map['partNo'] = partNo; map['partName'] = partName; return map; @@ -1078,7 +1112,7 @@ class AssistantEmployees { AssistantEmployees.fromJson(dynamic json) { id = json['id']; - user = json['user'] != null ? UserModel.fromJson(json['user']) : null; + user = json['user'] != null ? UserModel.fromJson(json['user']) : UserModel(name: json['userName'], id: json['userId']); } num id; UserModel user; @@ -1689,6 +1723,8 @@ class Asset { } if (supplier != null) { map['supplier'] = supplier.toJson(); + } else { + map['supplier'] = []; } map['ipAddress'] = ipAddress; map['macAddress'] = macAddress; @@ -1707,6 +1743,8 @@ class Asset { } if (assetType != null) { map['assetType'] = assetType.toMap(); + } else { + map['assetType'] = []; } if (site != null) { map['site'] = site.toJson(); diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index ea5e6701..f111c11e 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -1,5 +1,5 @@ - import 'dart:convert'; +import 'dart:developer'; import 'dart:io'; import 'package:flutter/material.dart'; @@ -16,7 +16,6 @@ import 'package:test_sa/views/pages/sub_workorder/workorder_details.dart'; import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; -import '../../../models/fault_description.dart'; import '../../../models/subtitle.dart'; import '../../widgets/app_text_form_field.dart'; import '../../widgets/buttons/app_back_button.dart'; @@ -39,21 +38,21 @@ class CreateSubWorkOrderPage extends StatefulWidget { class _CreateSubWorkOrderPageState extends State { final GlobalKey _formKey = GlobalKey(); - SearchWorkOrder _subWorkOrders =SearchWorkOrder(); - Lookup _serviceReportReason=Lookup(); + final SearchWorkOrder _subWorkOrders = SearchWorkOrder(); + Lookup _serviceReportReason = const Lookup(); ServiceReport _serviceReport; File _image; bool _isLoading = false; @override void initState() { - super.initState(); } + @override Widget build(BuildContext context) { final Subtitle subtitle = AppLocalization.of(context).subtitle; - _serviceReport =ServiceReport(id: widget.workOrder.id, type: widget.workOrder.assetType,equipmentStatus:widget.workOrder.equipmentStatus); + _serviceReport = ServiceReport(id: widget.workOrder.id, type: widget.workOrder.assetType, equipmentStatus: widget.workOrder.equipmentStatus); return Scaffold( body: SafeArea( child: SingleChildScrollView( @@ -71,7 +70,7 @@ class _CreateSubWorkOrderPageState extends State { child: Center( child: Text( "New Work Order", - style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ), @@ -87,20 +86,22 @@ class _CreateSubWorkOrderPageState extends State { padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), child: Column( children: [ - WorkOrderDetails(item: widget.workOrder,), + WorkOrderDetails( + item: widget.workOrder, + ), const SizedBox(height: 8), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle("Equipment status"), + const ASubTitle("Equipment status"), const SizedBox( height: 4, ), ServiceReportEquipmentStatusMenu( report: _serviceReport, onSelect: (status) { - _subWorkOrders.equipmentStatus=status; - _serviceReport.equipmentStatus=status; + _subWorkOrders.equipmentStatus = status; + _serviceReport.equipmentStatus = status; }, ), ], @@ -109,7 +110,7 @@ class _CreateSubWorkOrderPageState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle("Return to Service"), + const ASubTitle("Return to Service"), const SizedBox( height: 4, ), @@ -117,10 +118,10 @@ class _CreateSubWorkOrderPageState extends State { children: [ Expanded( child: ADatePicker( - date: DateTime.tryParse(_subWorkOrders.visitDate??""), + date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""), from: DateTime(1950), onDatePicker: (date) { - _subWorkOrders.visitDate=date?.toIso8601String(); + _subWorkOrders.visitDate = date?.toIso8601String(); setState(() {}); }, ), @@ -133,14 +134,14 @@ class _CreateSubWorkOrderPageState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle("Failure "+subtitle.reasons), + ASubTitle("Failure ${subtitle.reasons}"), const SizedBox( height: 4, ), ServiceReportReasonsMenu( initialValue: _serviceReportReason, onSelect: (status) { - _serviceReportReason=status; + _serviceReportReason = status; _subWorkOrders.reason = status; }, ), @@ -155,41 +156,40 @@ class _CreateSubWorkOrderPageState extends State { height: 4, ), ServiceReportFaultDescription( - requestId: widget.workOrder.id.toString(), - initialValue: FaultDescription(id: _subWorkOrders?.faultDescription?.id, defectName: _subWorkOrders?.faultDescription?.defectName, workPerformed: _subWorkOrders?.faultDescription?.workPerformed, estimatedTime: _subWorkOrders?.faultDescription?.estimatedTime), + requestId: widget.workOrder.callRequest.id.toString(), + initialValue: _subWorkOrders.faultDescription, onSelect: (status) { - _subWorkOrders.faultDescription=status; + _subWorkOrders.faultDescription = status; }, ), ], ), const SizedBox(height: 8), - // Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle("Solution"), - // const SizedBox( - // height: 4, - // ), - // ATextFormField( - // labelText: "Add some text", - // textInputType: TextInputType.multiline, - // onSaved: (value) { - // - // }, - // ), - // ], - // ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ASubTitle("Solution"), + const SizedBox( + height: 4, + ), + ATextFormField( + labelText: "Add some text", + textInputType: TextInputType.multiline, + onSaved: (value) {}, + ), + ], + ), const SizedBox(height: 8), InkWell( - onTap: () { - showModalBottomSheet( + onTap: () async { + await showModalBottomSheet( context: context, useSafeArea: true, isScrollControlled: true, backgroundColor: Colors.transparent, - builder: (context) => WorkOrderDetailsBottomSheet(workOrder: widget.workOrder), + builder: (context) => WorkOrderDetailsBottomSheet(subWorkOrder: _subWorkOrders), ); + log(_subWorkOrders?.toJson()?.toString()); }, child: Card( child: ListTile( @@ -208,14 +208,15 @@ class _CreateSubWorkOrderPageState extends State { ), const SizedBox(height: 8), InkWell( - onTap: () { - showModalBottomSheet( + onTap: () async { + await showModalBottomSheet( context: context, useSafeArea: true, isScrollControlled: true, backgroundColor: Colors.transparent, - builder: (context) => SparePartsBottomSheet(workOrder: widget.workOrder), + builder: (context) => SparePartsBottomSheet(subWorkOrder: _subWorkOrders), ); + log(_subWorkOrders?.toJson()?.toString()); }, child: Card( child: ListTile( @@ -254,7 +255,7 @@ class _CreateSubWorkOrderPageState extends State { child: AButton( text: subtitle.create, onPressed: () async { - _subWorkOrders.parentWOId=widget.workOrder.id; + _subWorkOrders.parentWOId = widget.workOrder.id; _isLoading = true; setState(() {}); if (_formKey.currentState?.validate() ?? false) {} @@ -263,7 +264,7 @@ class _CreateSubWorkOrderPageState extends State { final status = await serviceRequestsProvider.createSubWorkOrder(workOrder: _subWorkOrders); _isLoading = false; setState(() {}); - if (status>= 200 && status< 300) { + if (status >= 200 && status < 300) { Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); Navigator.of(context).pop(); Navigator.of(context).pop(); diff --git a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart index 444207ca..dec9771b 100644 --- a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart @@ -1,21 +1,16 @@ import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/widgets/loaders/app_loading.dart'; -import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; -import '../../../controllers/providers/api/service_requests_provider.dart'; import '../../../models/subtitle.dart'; import '../../widgets/app_text_form_field.dart'; import '../../widgets/buttons/app_button.dart'; import '../../widgets/titles/app_sub_title.dart'; class SparePartsBottomSheet extends StatefulWidget { - final SearchWorkOrder workOrder; - const SparePartsBottomSheet({this.workOrder, Key key}) : super(key: key); + final SearchWorkOrder subWorkOrder; + const SparePartsBottomSheet({this.subWorkOrder, Key key}) : super(key: key); @override State createState() => _SparePartsBottomSheetState(); @@ -24,11 +19,11 @@ class SparePartsBottomSheet extends StatefulWidget { class _SparePartsBottomSheetState extends State { final GlobalKey _formKey = GlobalKey(); SearchWorkOrder _workOrder; - bool _isLoading = false; + @override void initState() { super.initState(); - _workOrder = widget.workOrder; + _workOrder = widget.subWorkOrder; } @override @@ -123,6 +118,7 @@ class _SparePartsBottomSheetState extends State { const SizedBox(height: 8), InkWell( onTap: () { + _workOrder.sparePartsWorkOrders ??= []; _workOrder.sparePartsWorkOrders.add(SparePartsWorkOrders()); setState(() {}); }, @@ -152,38 +148,14 @@ class _SparePartsBottomSheetState extends State { ), ), ), - _isLoading - ? const ALoading() - : AButton( - text: subtitle.update, - onPressed: () async { - // _validate = true; - if (!_formKey.currentState.validate()) { - setState(() {}); - return; - } - // if (!_serviceReport.validate()) { - // setState(() {}); - // return; - // } - _formKey.currentState.save(); - - _isLoading = true; - setState(() {}); - - int status = await Provider.of(context, listen: false).updateWorkOrderDetails(workOrder: _workOrder); - _isLoading = false; - setState(() {}); - if (status >= 200 && status < 300) { - Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); - Navigator.of(context).pop(); - // Navigator.of(context).pop(); - } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: subtitle); - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); - } - }, - ), + AButton( + text: subtitle.submit, + onPressed: () async { + _formKey.currentState.save(); + widget.subWorkOrder.copyFrom(_workOrder); + Navigator.pop(context); + }, + ), ], ), ), diff --git a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart index d52ee389..9f9f185c 100644 --- a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart @@ -1,24 +1,20 @@ import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/loaders/app_loading.dart'; +import 'package:test_sa/views/widgets/status/report/service_report_assistant_employee_menu.dart'; import 'package:test_sa/views/widgets/status/report/service_report_maintenance_situation.dart'; import 'package:test_sa/views/widgets/status/report/service_report_repair_location.dart'; -import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; import '../../app_style/sizing.dart'; import '../../widgets/date_and_time/time_picker.dart'; import '../../widgets/titles/app_sub_title.dart'; class WorkOrderDetailsBottomSheet extends StatefulWidget { - final SearchWorkOrder workOrder; - const WorkOrderDetailsBottomSheet({this.workOrder, Key key}) : super(key: key); + final SearchWorkOrder subWorkOrder; + const WorkOrderDetailsBottomSheet({this.subWorkOrder, Key key}) : super(key: key); @override State createState() => _WorkOrderDetailsBottomSheetState(); @@ -27,12 +23,11 @@ class WorkOrderDetailsBottomSheet extends StatefulWidget { class _WorkOrderDetailsBottomSheetState extends State { final GlobalKey _formKey = GlobalKey(); SearchWorkOrder _workOrder; - bool _isLoading = false; @override void initState() { super.initState(); - _workOrder = widget.workOrder; + _workOrder = widget.subWorkOrder; } @override @@ -70,14 +65,12 @@ class _WorkOrderDetailsBottomSheetState extends State(context, listen: false).updateWorkOrderDetails(workOrder: _workOrder); - _isLoading = false; - setState(() {}); - if (status >= 200 && status < 300) { - Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); - Navigator.of(context).pop(); - // Navigator.of(context).pop(); - } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: subtitle); - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); - } - }, - ), + AButton( + text: subtitle.submit, + onPressed: () async { + _formKey.currentState.save(); + widget.subWorkOrder.copyFrom(_workOrder); + Navigator.pop(context); + }, + ), ], ), ), diff --git a/lib/views/widgets/status/assistant_employee_menu.dart b/lib/views/widgets/status/assistant_employee_menu.dart new file mode 100644 index 00000000..fa7d9ed8 --- /dev/null +++ b/lib/views/widgets/status/assistant_employee_menu.dart @@ -0,0 +1,109 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../../models/service_request/search_work_order.dart'; + +class AssistantEmployeeMenu extends StatefulWidget { + final List statuses; + final AssistantEmployees initialStatus; + final Function(AssistantEmployees) onSelect; + + const AssistantEmployeeMenu({Key key, this.statuses, this.onSelect, this.initialStatus}) : super(key: key); + + @override + _SingleAssistantEmployeeMenuState createState() => _SingleAssistantEmployeeMenuState(); +} + +class _SingleAssistantEmployeeMenuState extends State { + AssistantEmployees _selectedStatus; + + @override + void setState(VoidCallback fn) { + if (mounted) super.setState(fn); + } + + @override + void didUpdateWidget(covariant AssistantEmployeeMenu oldWidget) { + if (widget.initialStatus != null) { + final result = widget.statuses?.where((element) { + return element == widget.initialStatus; + }); + if (result.isNotEmpty) { + _selectedStatus = result.first; + } else { + _selectedStatus = null; + } + if ((widget.initialStatus?.user?.id ?? "") != (_selectedStatus?.user?.id ?? "")) { + widget.onSelect(_selectedStatus); + } + } else { + _selectedStatus = null; + } + super.didUpdateWidget(oldWidget); + } + + @override + void initState() { + if (widget.initialStatus != null) { + final result = widget.statuses?.where((element) { + return element == widget.initialStatus; + }); + if (result.isNotEmpty) _selectedStatus = result.first; + if (widget.initialStatus?.user?.id != _selectedStatus?.user?.id) { + widget.onSelect(_selectedStatus); + } + } + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: DropdownButton( + value: _selectedStatus, + iconSize: 24, + icon: const Icon(Icons.keyboard_arrow_down_rounded), + elevation: 0, + isExpanded: true, + hint: Text( + "Select", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle(color: Theme.of(context).primaryColor), + underline: const SizedBox.shrink(), + onChanged: (AssistantEmployees newValue) { + setState(() { + _selectedStatus = newValue; + }); + widget.onSelect(newValue); + }, + items: widget.statuses.map>((AssistantEmployees value) { + return DropdownMenuItem( + value: value, + child: Text( + value.user?.name ?? "NULL", + style: Theme.of(context).textTheme.titleMedium.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), + ), + ); + }).toList(), + ), + ); + } +} diff --git a/lib/views/widgets/status/report/service_report_all_users.dart b/lib/views/widgets/status/report/service_report_all_users.dart index 981806f8..c3098096 100644 --- a/lib/views/widgets/status/report/service_report_all_users.dart +++ b/lib/views/widgets/status/report/service_report_all_users.dart @@ -14,14 +14,14 @@ class ServiceReportAllUsers extends StatelessWidget { ServiceReportUsersProvider menuProvider = Provider.of(context); return LoadingManager( isLoading: menuProvider.isLoading, - isFailedLoading: menuProvider.users == null, + isFailedLoading: menuProvider.engineers == null, stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.getAllUsers(); }, child: UsersMenu( initialStatus: initialValue, - statuses: menuProvider.users, + statuses: menuProvider.engineers, onSelect: onSelect, ), ); diff --git a/lib/views/widgets/status/report/service_report_assistant_employee_menu.dart b/lib/views/widgets/status/report/service_report_assistant_employee_menu.dart new file mode 100644 index 00000000..24b0cb6c --- /dev/null +++ b/lib/views/widgets/status/report/service_report_assistant_employee_menu.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/models/service_request/search_work_order.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/assistant_employee_menu.dart'; + +import '../../../../controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart'; + +class ServiceReportAssistantEmployeeMenu extends StatelessWidget { + final Function(AssistantEmployees) onSelect; + final AssistantEmployees initialValue; + const ServiceReportAssistantEmployeeMenu({Key key, @required this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + ServiceReportAssistantsEmployeeProvider menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.assistantEmployees == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + await menuProvider.getAssistantEmployees(); + print("ccccccccccccccc"); + }, + child: AssistantEmployeeMenu( + initialStatus: initialValue, + statuses: menuProvider.assistantEmployees, + onSelect: onSelect, + ), + ); + } +}