Preparing the functionality [Still doesn't work]

pull/2/head
zaid_daoud 3 years ago
parent e2a2104087
commit 4fac73cd67

@ -10,6 +10,8 @@ class SearchWorkOrders {
String assetType; String assetType;
AssignedEmployee assignedEmployee; AssignedEmployee assignedEmployee;
String visitDate; String visitDate;
String startDate;
String endDate;
List assistantEmployees; List assistantEmployees;
String supplier; String supplier;
String vendorTicketNumber; String vendorTicketNumber;
@ -44,6 +46,8 @@ class SearchWorkOrders {
this.assetType, this.assetType,
this.assignedEmployee, this.assignedEmployee,
this.visitDate, this.visitDate,
this.startDate,
this.endDate,
this.assistantEmployees, this.assistantEmployees,
this.supplier, this.supplier,
this.vendorTicketNumber, this.vendorTicketNumber,
@ -79,6 +83,8 @@ class SearchWorkOrders {
assetType = json['assetType']; assetType = json['assetType'];
assignedEmployee = json['assignedEmployee'] != null ? new AssignedEmployee.fromJson(json['assignedEmployee']) : AssignedEmployee(); assignedEmployee = json['assignedEmployee'] != null ? new AssignedEmployee.fromJson(json['assignedEmployee']) : AssignedEmployee();
visitDate = json['visitDate']; visitDate = json['visitDate'];
startDate = json['startDate'];
endDate = json['endDate'];
if (json['assistantEmployees'] != null) { if (json['assistantEmployees'] != null) {
assistantEmployees = json['assistantEmployees']; assistantEmployees = json['assistantEmployees'];
} }
@ -127,6 +133,8 @@ class SearchWorkOrders {
data['assignedEmployee'] = this.assignedEmployee.toJson(); data['assignedEmployee'] = this.assignedEmployee.toJson();
} }
data['visitDate'] = this.visitDate; data['visitDate'] = this.visitDate;
data['startDate'] = this.startDate;
data['endDate'] = this.endDate;
if (this.assistantEmployees != null) { if (this.assistantEmployees != null) {
data['assistantEmployees'] = this.assistantEmployees.map((v) => v.toJson()).toList(); data['assistantEmployees'] = this.assistantEmployees.map((v) => v.toJson()).toList();
} }

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_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/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart'; import 'package:test_sa/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart';
import 'package:test_sa/views/pages/sub_workorder/work_order_details_bottom_sheet.dart'; import 'package:test_sa/views/pages/sub_workorder/work_order_details_bottom_sheet.dart';
@ -14,7 +15,8 @@ import '../../widgets/buttons/app_button.dart';
class CreateSubWorkOrderPage extends StatefulWidget { class CreateSubWorkOrderPage extends StatefulWidget {
static const id = "/CreateSubWorkOrder"; static const id = "/CreateSubWorkOrder";
const CreateSubWorkOrderPage({Key key}) : super(key: key); final SearchWorkOrders workOrder;
const CreateSubWorkOrderPage({this.workOrder, Key key}) : super(key: key);
@override @override
State<CreateSubWorkOrderPage> createState() => _CreateSubWorkOrderPageState(); State<CreateSubWorkOrderPage> createState() => _CreateSubWorkOrderPageState();
@ -66,7 +68,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
useSafeArea: true, useSafeArea: true,
isScrollControlled: true, isScrollControlled: true,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
builder: (context) => const WorkOrderDetailsBottomSheet(), builder: (context) => WorkOrderDetailsBottomSheet(workOrder: widget.workOrder),
); );
}, },
child: Card( child: Card(
@ -92,7 +94,7 @@ class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
useSafeArea: true, useSafeArea: true,
isScrollControlled: true, isScrollControlled: true,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
builder: (context) => const SparePartsBottomSheet(), builder: (context) => SparePartsBottomSheet(workOrder: widget.workOrder),
); );
}, },
child: Card( child: Card(

@ -5,6 +5,7 @@ import 'package:test_sa/models/engineer.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.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/pages/sub_workorder/create_sub_workorder_page.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/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
@ -14,7 +15,6 @@ import '../../../controllers/providers/api/service_requests_provider.dart';
import '../../app_style/colors.dart'; import '../../app_style/colors.dart';
import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/buttons/app_back_button.dart';
import '../../widgets/buttons/app_button.dart'; import '../../widgets/buttons/app_button.dart';
import '../../widgets/loaders/app_loading.dart';
import '../../widgets/status/report/service_report_all_users.dart'; import '../../widgets/status/report/service_report_all_users.dart';
import '../../widgets/status/report/service_report_maintenance_situation.dart'; import '../../widgets/status/report/service_report_maintenance_situation.dart';
import '../../widgets/status/report/service_report_visit_date_operator.dart'; import '../../widgets/status/report/service_report_visit_date_operator.dart';
@ -160,7 +160,7 @@ class _SearchSubWorkOrderPageState extends State<SearchSubWorkOrderPage> {
), ),
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
floatingActionButton: _isLoading floatingActionButton: _isLoading
? const ALoading() ? const CircularProgressIndicator()
: Padding( : Padding(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
child: AButton( child: AButton(
@ -188,8 +188,16 @@ class _SearchSubWorkOrderPageState extends State<SearchSubWorkOrderPage> {
body: ListView.builder( body: ListView.builder(
itemCount: woList.length, itemCount: woList.length,
shrinkWrap: true, shrinkWrap: true,
itemBuilder: (context, index) => Text( itemBuilder: (context, index) => InkWell(
woList[index].id?.toString(), onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => CreateSubWorkOrderPage(workOrder: woList[index])),
);
},
child: Text(
woList[index].id?.toString(),
),
), ),
), ),
), ),

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.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/app_style/colors.dart';
import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/api_routes/http_status_manger.dart';
@ -13,7 +14,8 @@ 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 {
const SparePartsBottomSheet({Key key}) : super(key: key); final SearchWorkOrders workOrder;
const SparePartsBottomSheet({this.workOrder, Key key}) : super(key: key);
@override @override
State<SparePartsBottomSheet> createState() => _SparePartsBottomSheetState(); State<SparePartsBottomSheet> createState() => _SparePartsBottomSheetState();
@ -21,6 +23,14 @@ 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>();
SearchWorkOrders _workOrder;
bool _isLoading = false;
@override
void initState() {
super.initState();
_workOrder = widget.workOrder;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final size = MediaQuery.of(context).size; final size = MediaQuery.of(context).size;
@ -53,42 +63,46 @@ class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox(height: 8), const SizedBox(height: 8),
ListView.builder( if (_workOrder.sparePartsWorkOrders?.length != null)
itemCount: 1, ListView.builder(
shrinkWrap: true, itemCount: _workOrder.sparePartsWorkOrders?.length,
physics: const NeverScrollableScrollPhysics(), shrinkWrap: true,
itemBuilder: (context, index) => Column( physics: const NeverScrollableScrollPhysics(),
children: [ itemBuilder: (context, index) {
const ATextFormField(labelText: "Part No."), final wo = _workOrder.sparePartsWorkOrders[index];
const SizedBox(height: 8), return Column(
const ATextFormField( children: [
labelText: "Description", const ATextFormField(labelText: "Part No."),
hintText: "Add Some Text", const SizedBox(height: 8),
textInputType: TextInputType.multiline, const ATextFormField(
), labelText: "Description",
const SizedBox(height: 8), hintText: "Add Some Text",
const ATextFormField( textInputType: TextInputType.multiline,
labelText: "Quantity", ),
textInputType: TextInputType.number, const SizedBox(height: 8),
), const ATextFormField(
const SizedBox(height: 8), labelText: "Quantity",
InkWell( textInputType: TextInputType.number,
onTap: () {}, ),
child: Row( const SizedBox(height: 8),
mainAxisAlignment: MainAxisAlignment.end, InkWell(
children: [ onTap: () {},
const Icon(Icons.delete, color: Colors.red), child: Row(
Text( mainAxisAlignment: MainAxisAlignment.end,
"Remove this part", children: [
style: Theme.of(context).textTheme.bodySmall, const Icon(Icons.delete, color: Colors.red),
Text(
"Remove this part",
style: Theme.of(context).textTheme.bodySmall,
),
],
), ),
], ),
), const SizedBox(height: 8),
), ],
const SizedBox(height: 8), );
], },
), ),
),
const Divider(), const Divider(),
const SizedBox(height: 8), const SizedBox(height: 8),
InkWell( InkWell(
@ -135,11 +149,11 @@ class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> {
// } // }
_formKey.currentState.save(); _formKey.currentState.save();
// _isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
int status = await Provider.of<ServiceRequestsProvider>(context).updateServiceReport(report: ServiceReport()); int status = await Provider.of<ServiceRequestsProvider>(context).updateServiceReport(report: ServiceReport());
// _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);

@ -2,6 +2,8 @@ import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/models/lookup.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';
@ -10,6 +12,7 @@ import 'package:test_sa/views/widgets/status/report/service_report_repair_locati
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/engineer.dart';
import '../../../models/service_report.dart'; import '../../../models/service_report.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';
@ -17,7 +20,8 @@ import '../../widgets/status/report/service_report_all_users.dart';
import '../../widgets/titles/app_sub_title.dart'; import '../../widgets/titles/app_sub_title.dart';
class WorkOrderDetailsBottomSheet extends StatefulWidget { class WorkOrderDetailsBottomSheet extends StatefulWidget {
const WorkOrderDetailsBottomSheet({Key key}) : super(key: key); final SearchWorkOrders workOrder;
const WorkOrderDetailsBottomSheet({this.workOrder, Key key}) : super(key: key);
@override @override
State<WorkOrderDetailsBottomSheet> createState() => _WorkOrderDetailsBottomSheetState(); State<WorkOrderDetailsBottomSheet> createState() => _WorkOrderDetailsBottomSheetState();
@ -25,6 +29,15 @@ 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>();
SearchWorkOrders _workOrder;
bool _isLoading = false;
@override
void initState() {
super.initState();
_workOrder = widget.workOrder;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final size = MediaQuery.of(context).size; final size = MediaQuery.of(context).size;
@ -56,14 +69,16 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox(height: 8), const SizedBox(height: 8),
const ATextFormField(enable: false, hintText: "Assigned Employee: ${123}"), ATextFormField(enable: false, hintText: "Assigned Employee: ${_workOrder.assignedEmployee?.name}"),
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( ServiceReportAllUsers(
// initialValue: _searchWorkOrders.assignedEmployee == null ? null : Engineer(id: _searchWorkOrders.assignedEmployee.id, name: _searchWorkOrders.assignedEmployee.name), initialValue: _workOrder.assistantEmployees == null || _workOrder.assistantEmployees.isEmpty
? null
: Engineer(id: _workOrder.assistantEmployees?.first?.id, name: _workOrder.assistantEmployees?.first?.name),
onSelect: (engineer) { onSelect: (engineer) {
// _searchWorkOrders.assignedEmployee = AssignedEmployee(id: engineer.id, name: engineer.name); _workOrder.assistantEmployees = [AssignedEmployee(id: engineer.id, name: engineer.name)];
}, },
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
@ -78,12 +93,12 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
height: 8 * AppStyle.getScaleFactor(context), height: 8 * AppStyle.getScaleFactor(context),
), ),
ADateTimePicker( ADateTimePicker(
// date: _gasRefillProvider.startDate, date: DateTime.tryParse(_workOrder.startDate ?? ""),
from: DateTime.now().subtract(const Duration(days: 365)), from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)), to: DateTime.now().add(const Duration(days: 365)),
onDateTimePicker: (date) { onDateTimePicker: (date) {
// _gasRefillProvider.startDate = date; _workOrder.startDate = date?.toIso8601String();
// setState(() {}); setState(() {});
}, },
), ),
], ],
@ -99,12 +114,12 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
height: 8 * AppStyle.getScaleFactor(context), height: 8 * AppStyle.getScaleFactor(context),
), ),
ADateTimePicker( ADateTimePicker(
// date: _gasRefillProvider.endDate, date: DateTime.tryParse(_workOrder.endDate ?? ""),
from: DateTime.now().subtract(const Duration(days: 365)), from: DateTime.now().subtract(const Duration(days: 365)),
to: DateTime.now().add(const Duration(days: 365)), to: DateTime.now().add(const Duration(days: 365)),
onDateTimePicker: (date) { onDateTimePicker: (date) {
// _gasRefillProvider.endDate = date; _workOrder.endDate = date?.toIso8601String();
// setState(() {}); setState(() {});
}, },
), ),
], ],
@ -118,53 +133,66 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
ATextFormField( ATextFormField(
initialValue: null, initialValue: null,
textAlign: TextAlign.center, textAlign: TextAlign.center,
// hintText: _gasRefillProvider.startDate == null hintText: _workOrder.startDate == null
// ? "0" ? "0"
// : ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", : ((DateTime.tryParse(_workOrder.endDate)?.difference(DateTime.tryParse(_workOrder.startDate ?? ""))?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0",
enable: false, enable: false,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
// validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, // validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord,
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value) { onSaved: (value) {
// _serviceReport.workHours = value; _workOrder.workingHours = double.tryParse(value);
}, },
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
const ATextFormField( ATextFormField(
labelText: "Travel Hours", labelText: "Travel Hours",
initialValue: _workOrder.travelingHours?.toString(),
textInputType: TextInputType.number,
onSaved: (value) {
_workOrder.travelingHours = num.tryParse(value);
},
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
const ATextFormField( ATextFormField(
labelText: "Travel Expense", labelText: "Travel Expense",
initialValue: _workOrder.travelingExpenses?.toString(),
textInputType: TextInputType.number,
onSaved: (value) {
_workOrder.travelingExpenses = num.tryParse(value);
},
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
ASubTitle(subtitle.callLastSituation), ASubTitle(subtitle.callLastSituation),
const SizedBox(height: 4), const SizedBox(height: 4),
ServiceReportMaintenanceSituation( ServiceReportMaintenanceSituation(
initialValue: null /*_searchWorkOrders.calllastSituation*/, initialValue: _workOrder.calllastSituation,
onSelect: (status) { onSelect: (status) {
// if (status?.value == 12 || _searchWorkOrders.calllastSituation?.value == 12) { if (status?.value == 12 || _workOrder.calllastSituation?.value == 12) {
// _searchWorkOrders.calllastSituation = status; _workOrder.calllastSituation = status;
// setState(() {}); setState(() {});
// } else { } else {
// _searchWorkOrders.calllastSituation = status; _workOrder.calllastSituation = status;
// } }
}, },
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
const ASubTitle("Repair Location"), const ASubTitle("Repair Location"),
const SizedBox(height: 4), const SizedBox(height: 4),
ServiceReportRepairLocation( ServiceReportRepairLocation(
// initialValue: _serviceReport.repairLocation, initialValue: _workOrder.repairLocation != null ? Lookup(name: _workOrder.repairLocation) : null,
onSelect: (status) { onSelect: (status) {
// _serviceReport.repairLocation = status; _workOrder.repairLocation = status.name;
}, },
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
const ATextFormField( ATextFormField(
labelText: "Technical Comments", labelText: "Technical Comments",
hintText: "Add Some Text", initialValue: _workOrder.reviewComment,
textInputType: TextInputType.multiline, textInputType: TextInputType.multiline,
onSaved: (value) {
_workOrder.reviewComment = value;
},
), ),
const SizedBox(height: 24), const SizedBox(height: 24),
], ],
@ -186,11 +214,11 @@ class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomShee
// } // }
_formKey.currentState.save(); _formKey.currentState.save();
// _isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
int status = await Provider.of<ServiceRequestsProvider>(context).updateServiceReport(report: ServiceReport()); int status = await Provider.of<ServiceRequestsProvider>(context).updateServiceReport(report: ServiceReport());
// _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);

Loading…
Cancel
Save