Enhancements

pull/2/head
zaid_daoud 2 years ago
parent 52eee5196f
commit ffaa340d9d

@ -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> _assistantEmployees;
List<AssistantEmployees> 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<int> 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;
}
}
}

@ -10,7 +10,7 @@ import 'package:test_sa/models/engineer.dart';
class ServiceReportUsersProvider extends ChangeNotifier { class ServiceReportUsersProvider extends ChangeNotifier {
//reset provider data //reset provider data
void reset() { void reset() {
_calls = null; _engineers = null;
_loading = null; _loading = null;
_stateCode = null; _stateCode = null;
} }
@ -23,8 +23,8 @@ class ServiceReportUsersProvider extends ChangeNotifier {
// contain user data // contain user data
// when user not login or register _user = null // when user not login or register _user = null
List<Engineer> _calls; List<Engineer> _engineers;
List<Engineer> get users => _calls; List<Engineer> get engineers => _engineers;
// when categories in-process _loading = true // when categories in-process _loading = true
// done _loading = true // done _loading = true
@ -60,7 +60,7 @@ class ServiceReportUsersProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List usersListJson = json.decode(response.body); List usersListJson = json.decode(response.body);
_calls = usersListJson.map((type) => Engineer.fromJson(type)).toList(); _engineers = usersListJson.map((type) => Engineer.fromJson(type)).toList();
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();

@ -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/parts_provider.dart';
import 'controllers/providers/api/preventive_maintenance_visits_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/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_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_last_calls_provider.dart';
import 'controllers/providers/api/status_drop_down/report/service_report_reasons_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: (_) => ServiceReportVisitOperatorProvider()),
ChangeNotifierProvider(create: (_) => ServiceReportMaintenanceSituationProvider()), ChangeNotifierProvider(create: (_) => ServiceReportMaintenanceSituationProvider()),
ChangeNotifierProvider(create: (_) => ServiceReportUsersProvider()), ChangeNotifierProvider(create: (_) => ServiceReportUsersProvider()),
ChangeNotifierProvider(create: (_) => ServiceReportAssistantsEmployeeProvider()),
], ],
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {

@ -1,7 +1,6 @@
import 'package:test_sa/models/fault_description.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import '../fault_description.dart';
class SearchWorkOrder { class SearchWorkOrder {
SearchWorkOrder({ SearchWorkOrder({
this.id, this.id,
@ -97,6 +96,41 @@ class SearchWorkOrder {
nurseSignature = json['nurseSignature']; nurseSignature = json['nurseSignature'];
woParentDto = json['woParentDto'] != null ? WoParentDto.fromJson(json['woParentDto']) : null; 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 id;
num parentWOId; num parentWOId;
String workOrderNo; String workOrderNo;
@ -215,7 +249,7 @@ class SearchWorkOrder {
} }
map['visitDate'] = visitDate; map['visitDate'] = visitDate;
if (assistantEmployees != null) { if (assistantEmployees != null) {
map['assistantEmployees'] = assistantEmployees.map((v) => v.toJson()).toList(); map['assistantEmployees'] = assistantEmployees.map((v) => v?.user?.id).toList();
} }
if (supplier != null) { if (supplier != null) {
map['supplier'] = supplier.toJson(); map['supplier'] = supplier.toJson();
@ -250,7 +284,7 @@ class SearchWorkOrder {
map['reviewComment'] = reviewComment; map['reviewComment'] = reviewComment;
map['comment'] = comment; map['comment'] = comment;
if (attachmentsWorkOrder != null) { if (attachmentsWorkOrder != null) {
map['attachmentsWorkOrder'] = attachmentsWorkOrder.map((v) => {"name": v.name})?.toList(); map['attachmentsWorkOrder'] = attachmentsWorkOrder.map((v) => v.toJson()).toList();
} }
if (equipmentStatus != null) { if (equipmentStatus != null) {
map['equipmentStatus'] = equipmentStatus.toMap(); map['equipmentStatus'] = equipmentStatus.toMap();
@ -961,7 +995,7 @@ class SparePartsWorkOrders {
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id; map['id'] = id ?? 0;
if (sparePart != null) { if (sparePart != null) {
map['sparePart'] = sparePart.toJson(); map['sparePart'] = sparePart.toJson();
} }
@ -999,7 +1033,7 @@ class SparePart {
); );
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final map = <String, dynamic>{}; final map = <String, dynamic>{};
map['id'] = id; map['id'] = id ?? 0;
map['partNo'] = partNo; map['partNo'] = partNo;
map['partName'] = partName; map['partName'] = partName;
return map; return map;
@ -1078,7 +1112,7 @@ class AssistantEmployees {
AssistantEmployees.fromJson(dynamic json) { AssistantEmployees.fromJson(dynamic json) {
id = json['id']; 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; num id;
UserModel user; UserModel user;
@ -1689,6 +1723,8 @@ class Asset {
} }
if (supplier != null) { if (supplier != null) {
map['supplier'] = supplier.toJson(); map['supplier'] = supplier.toJson();
} else {
map['supplier'] = [];
} }
map['ipAddress'] = ipAddress; map['ipAddress'] = ipAddress;
map['macAddress'] = macAddress; map['macAddress'] = macAddress;
@ -1707,6 +1743,8 @@ class Asset {
} }
if (assetType != null) { if (assetType != null) {
map['assetType'] = assetType.toMap(); map['assetType'] = assetType.toMap();
} else {
map['assetType'] = [];
} }
if (site != null) { if (site != null) {
map['site'] = site.toJson(); map['site'] = site.toJson();

@ -1,5 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; 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/api_routes/http_status_manger.dart';
import '../../../controllers/localization/localization.dart'; import '../../../controllers/localization/localization.dart';
import '../../../models/fault_description.dart';
import '../../../models/subtitle.dart'; import '../../../models/subtitle.dart';
import '../../widgets/app_text_form_field.dart'; import '../../widgets/app_text_form_field.dart';
import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/buttons/app_back_button.dart';
@ -39,21 +38,21 @@ class CreateSubWorkOrderPage extends StatefulWidget {
class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> { class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
SearchWorkOrder _subWorkOrders =SearchWorkOrder(); final SearchWorkOrder _subWorkOrders = SearchWorkOrder();
Lookup _serviceReportReason=Lookup(); Lookup _serviceReportReason = const Lookup();
ServiceReport _serviceReport; ServiceReport _serviceReport;
File _image; File _image;
bool _isLoading = false; bool _isLoading = false;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final Subtitle subtitle = AppLocalization.of(context).subtitle; 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( return Scaffold(
body: SafeArea( body: SafeArea(
child: SingleChildScrollView( child: SingleChildScrollView(
@ -71,7 +70,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
child: Center( child: Center(
child: Text( child: Text(
"New Work Order", "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<CreateSubWorkOrderPage> {
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16),
child: Column( child: Column(
children: [ children: [
WorkOrderDetails(item: widget.workOrder,), WorkOrderDetails(
item: widget.workOrder,
),
const SizedBox(height: 8), const SizedBox(height: 8),
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle("Equipment status"), const ASubTitle("Equipment status"),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
ServiceReportEquipmentStatusMenu( ServiceReportEquipmentStatusMenu(
report: _serviceReport, report: _serviceReport,
onSelect: (status) { onSelect: (status) {
_subWorkOrders.equipmentStatus=status; _subWorkOrders.equipmentStatus = status;
_serviceReport.equipmentStatus=status; _serviceReport.equipmentStatus = status;
}, },
), ),
], ],
@ -109,7 +110,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle("Return to Service"), const ASubTitle("Return to Service"),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
@ -117,10 +118,10 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
children: [ children: [
Expanded( Expanded(
child: ADatePicker( child: ADatePicker(
date: DateTime.tryParse(_subWorkOrders.visitDate??""), date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""),
from: DateTime(1950), from: DateTime(1950),
onDatePicker: (date) { onDatePicker: (date) {
_subWorkOrders.visitDate=date?.toIso8601String(); _subWorkOrders.visitDate = date?.toIso8601String();
setState(() {}); setState(() {});
}, },
), ),
@ -133,14 +134,14 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle("Failure "+subtitle.reasons), ASubTitle("Failure ${subtitle.reasons}"),
const SizedBox( const SizedBox(
height: 4, height: 4,
), ),
ServiceReportReasonsMenu( ServiceReportReasonsMenu(
initialValue: _serviceReportReason, initialValue: _serviceReportReason,
onSelect: (status) { onSelect: (status) {
_serviceReportReason=status; _serviceReportReason = status;
_subWorkOrders.reason = status; _subWorkOrders.reason = status;
}, },
), ),
@ -155,41 +156,40 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
height: 4, height: 4,
), ),
ServiceReportFaultDescription( ServiceReportFaultDescription(
requestId: widget.workOrder.id.toString(), requestId: widget.workOrder.callRequest.id.toString(),
initialValue: FaultDescription(id: _subWorkOrders?.faultDescription?.id, defectName: _subWorkOrders?.faultDescription?.defectName, workPerformed: _subWorkOrders?.faultDescription?.workPerformed, estimatedTime: _subWorkOrders?.faultDescription?.estimatedTime), initialValue: _subWorkOrders.faultDescription,
onSelect: (status) { onSelect: (status) {
_subWorkOrders.faultDescription=status; _subWorkOrders.faultDescription = status;
}, },
), ),
], ],
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
// Column( Column(
// crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
// children: [ children: [
// ASubTitle("Solution"), const ASubTitle("Solution"),
// const SizedBox( const SizedBox(
// height: 4, height: 4,
// ), ),
// ATextFormField( ATextFormField(
// labelText: "Add some text", labelText: "Add some text",
// textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
// onSaved: (value) { onSaved: (value) {},
// ),
// }, ],
// ), ),
// ],
// ),
const SizedBox(height: 8), const SizedBox(height: 8),
InkWell( InkWell(
onTap: () { onTap: () async {
showModalBottomSheet( await showModalBottomSheet(
context: context, context: context,
useSafeArea: true, useSafeArea: true,
isScrollControlled: true, isScrollControlled: true,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
builder: (context) => WorkOrderDetailsBottomSheet(workOrder: widget.workOrder), builder: (context) => WorkOrderDetailsBottomSheet(subWorkOrder: _subWorkOrders),
); );
log(_subWorkOrders?.toJson()?.toString());
}, },
child: Card( child: Card(
child: ListTile( child: ListTile(
@ -208,14 +208,15 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
InkWell( InkWell(
onTap: () { onTap: () async {
showModalBottomSheet( await showModalBottomSheet(
context: context, context: context,
useSafeArea: true, useSafeArea: true,
isScrollControlled: true, isScrollControlled: true,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
builder: (context) => SparePartsBottomSheet(workOrder: widget.workOrder), builder: (context) => SparePartsBottomSheet(subWorkOrder: _subWorkOrders),
); );
log(_subWorkOrders?.toJson()?.toString());
}, },
child: Card( child: Card(
child: ListTile( child: ListTile(
@ -254,7 +255,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
child: AButton( child: AButton(
text: subtitle.create, text: subtitle.create,
onPressed: () async { onPressed: () async {
_subWorkOrders.parentWOId=widget.workOrder.id; _subWorkOrders.parentWOId = widget.workOrder.id;
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
if (_formKey.currentState?.validate() ?? false) {} if (_formKey.currentState?.validate() ?? false) {}
@ -263,7 +264,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
final status = await serviceRequestsProvider.createSubWorkOrder(workOrder: _subWorkOrders); final status = await serviceRequestsProvider.createSubWorkOrder(workOrder: _subWorkOrders);
_isLoading = false; _isLoading = false;
setState(() {}); setState(() {});
if (status>= 200 && status< 300) { if (status >= 200 && status < 300) {
Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully);
Navigator.of(context).pop(); Navigator.of(context).pop();
Navigator.of(context).pop(); Navigator.of(context).pop();

@ -1,21 +1,16 @@
import 'package:flutter/material.dart'; 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/models/service_request/search_work_order.dart';
import 'package:test_sa/views/app_style/colors.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/localization/localization.dart';
import '../../../controllers/providers/api/service_requests_provider.dart';
import '../../../models/subtitle.dart'; import '../../../models/subtitle.dart';
import '../../widgets/app_text_form_field.dart'; import '../../widgets/app_text_form_field.dart';
import '../../widgets/buttons/app_button.dart'; import '../../widgets/buttons/app_button.dart';
import '../../widgets/titles/app_sub_title.dart'; import '../../widgets/titles/app_sub_title.dart';
class SparePartsBottomSheet extends StatefulWidget { class SparePartsBottomSheet extends StatefulWidget {
final SearchWorkOrder workOrder; final SearchWorkOrder subWorkOrder;
const SparePartsBottomSheet({this.workOrder, Key key}) : super(key: key); const SparePartsBottomSheet({this.subWorkOrder, Key key}) : super(key: key);
@override @override
State<SparePartsBottomSheet> createState() => _SparePartsBottomSheetState(); State<SparePartsBottomSheet> createState() => _SparePartsBottomSheetState();
@ -24,11 +19,11 @@ class SparePartsBottomSheet extends StatefulWidget {
class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> { class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
SearchWorkOrder _workOrder; SearchWorkOrder _workOrder;
bool _isLoading = false;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_workOrder = widget.workOrder; _workOrder = widget.subWorkOrder;
} }
@override @override
@ -123,6 +118,7 @@ class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> {
const SizedBox(height: 8), const SizedBox(height: 8),
InkWell( InkWell(
onTap: () { onTap: () {
_workOrder.sparePartsWorkOrders ??= [];
_workOrder.sparePartsWorkOrders.add(SparePartsWorkOrders()); _workOrder.sparePartsWorkOrders.add(SparePartsWorkOrders());
setState(() {}); setState(() {});
}, },
@ -152,38 +148,14 @@ class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> {
), ),
), ),
), ),
_isLoading AButton(
? const ALoading() text: subtitle.submit,
: AButton( onPressed: () async {
text: subtitle.update, _formKey.currentState.save();
onPressed: () async { widget.subWorkOrder.copyFrom(_workOrder);
// _validate = true; Navigator.pop(context);
if (!_formKey.currentState.validate()) { },
setState(() {}); ),
return;
}
// if (!_serviceReport.validate()) {
// setState(() {});
// return;
// }
_formKey.currentState.save();
_isLoading = true;
setState(() {});
int status = await Provider.of<ServiceRequestsProvider>(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)));
}
},
),
], ],
), ),
), ),

@ -1,24 +1,20 @@
import 'package:flutter/material.dart'; 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/service_request/search_work_order.dart';
import 'package:test_sa/models/subtitle.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/app_text_form_field.dart';
import 'package:test_sa/views/widgets/buttons/app_button.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_maintenance_situation.dart';
import 'package:test_sa/views/widgets/status/report/service_report_repair_location.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 '../../../controllers/localization/localization.dart';
import '../../app_style/sizing.dart'; import '../../app_style/sizing.dart';
import '../../widgets/date_and_time/time_picker.dart'; import '../../widgets/date_and_time/time_picker.dart';
import '../../widgets/titles/app_sub_title.dart'; import '../../widgets/titles/app_sub_title.dart';
class WorkOrderDetailsBottomSheet extends StatefulWidget { class WorkOrderDetailsBottomSheet extends StatefulWidget {
final SearchWorkOrder workOrder; final SearchWorkOrder subWorkOrder;
const WorkOrderDetailsBottomSheet({this.workOrder, Key key}) : super(key: key); const WorkOrderDetailsBottomSheet({this.subWorkOrder, Key key}) : super(key: key);
@override @override
State<WorkOrderDetailsBottomSheet> createState() => _WorkOrderDetailsBottomSheetState(); State<WorkOrderDetailsBottomSheet> createState() => _WorkOrderDetailsBottomSheetState();
@ -27,12 +23,11 @@ class WorkOrderDetailsBottomSheet extends StatefulWidget {
class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomSheet> { class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomSheet> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
SearchWorkOrder _workOrder; SearchWorkOrder _workOrder;
bool _isLoading = false;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_workOrder = widget.workOrder; _workOrder = widget.subWorkOrder;
} }
@override @override
@ -70,14 +65,12 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
const SizedBox(height: 8), const SizedBox(height: 8),
const ASubTitle("Assistant Employee"), const ASubTitle("Assistant Employee"),
const SizedBox(height: 4), const SizedBox(height: 4),
// ServiceReportAllUsers( ServiceReportAssistantEmployeeMenu(
// initialValue: _workOrder.assistantEmployees == null || _workOrder.assistantEmployees.isEmpty initialValue: (_workOrder.assistantEmployees?.isEmpty ?? false) ? null : _workOrder.assistantEmployees?.first,
// ? null onSelect: (assistantsEmployee) {
// : Engineer(id: _workOrder.assistantEmployees?.first?.id, name: _workOrder.assistantEmployees?.first?.name), _workOrder.assistantEmployees = [assistantsEmployee];
// onSelect: (engineer) { },
// _workOrder.assistantEmployees = [AssignedEmployee(id: engineer.id, name: engineer.name)]; ),
// },
// ),
const SizedBox(height: 8), const SizedBox(height: 8),
Row( Row(
children: [ children: [
@ -200,38 +193,14 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
), ),
), ),
), ),
_isLoading AButton(
? const ALoading() text: subtitle.submit,
: AButton( onPressed: () async {
text: subtitle.update, _formKey.currentState.save();
onPressed: () async { widget.subWorkOrder.copyFrom(_workOrder);
// _validate = true; Navigator.pop(context);
if (!_formKey.currentState.validate()) { },
setState(() {}); ),
return;
}
// if (!_serviceReport.validate()) {
// setState(() {});
// return;
// }
_formKey.currentState.save();
_isLoading = true;
setState(() {});
int status = await Provider.of<ServiceRequestsProvider>(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)));
}
},
),
], ],
), ),
), ),

@ -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<AssistantEmployees> 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<AssistantEmployeeMenu> {
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<AssistantEmployees>(
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<DropdownMenuItem<AssistantEmployees>>((AssistantEmployees value) {
return DropdownMenuItem<AssistantEmployees>(
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(),
),
);
}
}

@ -14,14 +14,14 @@ class ServiceReportAllUsers extends StatelessWidget {
ServiceReportUsersProvider menuProvider = Provider.of<ServiceReportUsersProvider>(context); ServiceReportUsersProvider menuProvider = Provider.of<ServiceReportUsersProvider>(context);
return LoadingManager( return LoadingManager(
isLoading: menuProvider.isLoading, isLoading: menuProvider.isLoading,
isFailedLoading: menuProvider.users == null, isFailedLoading: menuProvider.engineers == null,
stateCode: menuProvider.stateCode, stateCode: menuProvider.stateCode,
onRefresh: () async { onRefresh: () async {
menuProvider.getAllUsers(); menuProvider.getAllUsers();
}, },
child: UsersMenu( child: UsersMenu(
initialStatus: initialValue, initialStatus: initialValue,
statuses: menuProvider.users, statuses: menuProvider.engineers,
onSelect: onSelect, onSelect: onSelect,
), ),
); );

@ -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<ServiceReportAssistantsEmployeeProvider>(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,
),
);
}
}
Loading…
Cancel
Save