Enhancements

pull/2/head
zaid_daoud 1 year 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 {
//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<Engineer> _calls;
List<Engineer> get users => _calls;
List<Engineer> _engineers;
List<Engineer> 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();

@ -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: () {

@ -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<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['id'] = id ?? 0;
if (sparePart != null) {
map['sparePart'] = sparePart.toJson();
}
@ -999,7 +1033,7 @@ class SparePart {
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
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();

@ -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<CreateSubWorkOrderPage> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
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<CreateSubWorkOrderPage> {
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<CreateSubWorkOrderPage> {
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<CreateSubWorkOrderPage> {
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<CreateSubWorkOrderPage> {
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<CreateSubWorkOrderPage> {
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<CreateSubWorkOrderPage> {
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<CreateSubWorkOrderPage> {
),
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<CreateSubWorkOrderPage> {
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<CreateSubWorkOrderPage> {
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();

@ -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<SparePartsBottomSheet> createState() => _SparePartsBottomSheetState();
@ -24,11 +19,11 @@ class SparePartsBottomSheet extends StatefulWidget {
class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
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<SparePartsBottomSheet> {
const SizedBox(height: 8),
InkWell(
onTap: () {
_workOrder.sparePartsWorkOrders ??= [];
_workOrder.sparePartsWorkOrders.add(SparePartsWorkOrders());
setState(() {});
},
@ -152,38 +148,14 @@ class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> {
),
),
),
_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<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)));
}
},
),
AButton(
text: subtitle.submit,
onPressed: () async {
_formKey.currentState.save();
widget.subWorkOrder.copyFrom(_workOrder);
Navigator.pop(context);
},
),
],
),
),

@ -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<WorkOrderDetailsBottomSheet> createState() => _WorkOrderDetailsBottomSheetState();
@ -27,12 +23,11 @@ class WorkOrderDetailsBottomSheet extends StatefulWidget {
class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomSheet> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
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<WorkOrderDetailsBottomShee
const SizedBox(height: 8),
const ASubTitle("Assistant Employee"),
const SizedBox(height: 4),
// ServiceReportAllUsers(
// initialValue: _workOrder.assistantEmployees == null || _workOrder.assistantEmployees.isEmpty
// ? null
// : Engineer(id: _workOrder.assistantEmployees?.first?.id, name: _workOrder.assistantEmployees?.first?.name),
// onSelect: (engineer) {
// _workOrder.assistantEmployees = [AssignedEmployee(id: engineer.id, name: engineer.name)];
// },
// ),
ServiceReportAssistantEmployeeMenu(
initialValue: (_workOrder.assistantEmployees?.isEmpty ?? false) ? null : _workOrder.assistantEmployees?.first,
onSelect: (assistantsEmployee) {
_workOrder.assistantEmployees = [assistantsEmployee];
},
),
const SizedBox(height: 8),
Row(
children: [
@ -200,38 +193,14 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
),
),
),
_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<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)));
}
},
),
AButton(
text: subtitle.submit,
onPressed: () async {
_formKey.currentState.save();
widget.subWorkOrder.copyFrom(_workOrder);
Navigator.pop(context);
},
),
],
),
),

@ -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);
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,
),
);

@ -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