You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
247 lines
13 KiB
Dart
247 lines
13 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:test_sa/controllers/providers/api/parts_provider.dart';
|
|
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
|
|
import 'package:test_sa/controllers/providers/api/user_provider.dart';
|
|
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
|
|
import 'package:test_sa/extensions/context_extension.dart';
|
|
import 'package:test_sa/extensions/int_extensions.dart';
|
|
import 'package:test_sa/extensions/text_extensions.dart';
|
|
import 'package:test_sa/extensions/widget_extensions.dart';
|
|
import 'package:test_sa/models/device/asset.dart';
|
|
import 'package:test_sa/models/service_request/service_report.dart';
|
|
import 'package:test_sa/new_views/app_style/app_color.dart';
|
|
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
|
|
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
|
|
import 'package:test_sa/providers/loading_list_notifier.dart';
|
|
import 'package:test_sa/providers/work_order/reason_provider.dart';
|
|
import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart';
|
|
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
|
|
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
|
|
import '../../../../../controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
|
|
import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart';
|
|
import '../../../../../models/lookup.dart';
|
|
import '../../../../../models/service_request/spare_parts.dart';
|
|
import '../../../../../new_views/common_widgets/app_text_form_field.dart';
|
|
import '../../../../../new_views/common_widgets/default_app_bar.dart';
|
|
import '../../../controllers/validator/validator.dart';
|
|
|
|
class SparePartRequest extends StatefulWidget {
|
|
static const String id = "/spare-part-request";
|
|
|
|
const SparePartRequest({Key key}) : super(key: key);
|
|
|
|
@override
|
|
_SparePartRequestState createState() => _SparePartRequestState();
|
|
}
|
|
|
|
class _SparePartRequestState extends State<SparePartRequest> with TickerProviderStateMixin {
|
|
UserProvider _userProvider;
|
|
SettingProvider _settingProvider;
|
|
ServiceRequestsProvider _serviceRequestsProvider;
|
|
ServiceStatusProvider _assetTypeProvider;
|
|
PartsProvider _partsProvider;
|
|
ServiceReport _serviceReport;
|
|
bool _isLoading = false;
|
|
List<SparePart> _spareParts = [];
|
|
|
|
final List<File> _files = [];
|
|
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
|
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
|
|
final TextEditingController _faultController = TextEditingController();
|
|
final TextEditingController _workPreformedController = TextEditingController();
|
|
final TextEditingController _partQtyController = TextEditingController();
|
|
final TextEditingController _oracleNoController = TextEditingController();
|
|
|
|
@override
|
|
void initState() {
|
|
_serviceReport = ServiceReport(
|
|
// returnToService: DateTime.now(),
|
|
// //type: const Lookup(value: 2),
|
|
// device: widget.request.device,
|
|
sparePartsWorkOrders: [],
|
|
);
|
|
super.initState();
|
|
if (context.mounted) {
|
|
ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
|
|
Provider.of<ServiceReportLastCallsProvider>(context, listen: false).reset();
|
|
Provider.of<ReasonProvider>(context, listen: false).reset();
|
|
Provider.of<ReasonProvider>(context, listen: false).serviceRequestId = serviceRequestsProvider.currentSelectedRequest.id;
|
|
}
|
|
// _isLoading = true;
|
|
}
|
|
|
|
Asset loanAvailabilityAsset;
|
|
|
|
@override
|
|
void dispose() {
|
|
_faultController.dispose();
|
|
_workPreformedController.dispose();
|
|
_partQtyController.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
void getRequestForWorkOrder() async {
|
|
_isLoading = true;
|
|
setState(() {});
|
|
ServiceRequestsProvider serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
|
|
_serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: serviceRequestsProvider.currentSelectedRequest.id);
|
|
await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host);
|
|
_serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee;
|
|
_serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType;
|
|
_serviceReport.serviceType = Lookup(id: 65, name: "Interval", value: 1); // default value in service type as in web
|
|
_spareParts = await _partsProvider.getPartsList(assetId: serviceRequestsProvider.currentSelectedRequest.deviceId);
|
|
_isLoading = false;
|
|
setState(() {});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
_userProvider = Provider.of<UserProvider>(context);
|
|
_settingProvider = Provider.of<SettingProvider>(context);
|
|
_serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context);
|
|
_assetTypeProvider = Provider.of<ServiceStatusProvider>(context);
|
|
_partsProvider = Provider.of<PartsProvider>(context);
|
|
if (_serviceReport.callRequest == null) {
|
|
getRequestForWorkOrder();
|
|
}
|
|
_serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere(
|
|
(element) => element.value == _serviceReport.callRequest?.assetType,
|
|
orElse: () => null,
|
|
);
|
|
|
|
return Scaffold(
|
|
key: _scaffoldKey,
|
|
appBar: DefaultAppBar(title: context.translation.sparePartRequest),
|
|
body: Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
|
|
return SafeArea(
|
|
child: LoadingManager(
|
|
isLoading: _isLoading,
|
|
isFailedLoading: false,
|
|
stateCode: 200,
|
|
onRefresh: () async {},
|
|
child: Form(
|
|
key: _formKey,
|
|
child: Column(
|
|
children: [
|
|
SingleChildScrollView(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
children: [
|
|
Card(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
children: [
|
|
context.translation.sparePartDetails.heading5(context),
|
|
12.height,
|
|
SingleItemDropDownMenu<SparePart, NullableLoadingProvider>(
|
|
context: context,
|
|
title: context.translation.partNo,
|
|
staticData: _spareParts,
|
|
height: 80.toScreenHeight,
|
|
showShadow: false,
|
|
initialValue: serviceRequestProvider.initialSelectedSparePart.sparePart,
|
|
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
|
|
onSelect: (part) {
|
|
serviceRequestProvider.initialSelectedSparePart = SparePartsWorkOrders(id: 0, sparePart: part, qty: 0);
|
|
},
|
|
),
|
|
15.height,
|
|
AppTextFormField(
|
|
controller: _partQtyController,
|
|
labelText: context.translation.quantity,
|
|
textInputType: TextInputType.number,
|
|
contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight),
|
|
showWithoutDecoration: true,
|
|
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
|
|
enable: serviceRequestProvider.initialSelectedSparePart != null && serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null,
|
|
validator: (value) => value == null || value.isEmpty
|
|
? context.translation.requiredField
|
|
: Validator.isNumeric(value)
|
|
? null
|
|
: context.translation.onlyNumbers,
|
|
onSaved: (text) {
|
|
serviceRequestProvider.initialSelectedSparePart.qty = num.tryParse(text ?? "");
|
|
},
|
|
),
|
|
15.height,
|
|
AppTextFormField(
|
|
controller: _oracleNoController,
|
|
labelText: context.translation.oracleNo,
|
|
textInputType: TextInputType.number,
|
|
contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 20.toScreenHeight),
|
|
showWithoutDecoration: true,
|
|
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
|
|
enable: serviceRequestProvider.initialSelectedSparePart != null && serviceRequestProvider.initialSelectedSparePart.sparePart?.id != null,
|
|
validator: (value) => value == null || value.isEmpty
|
|
? context.translation.requiredField
|
|
: Validator.isNumeric(value)
|
|
? null
|
|
: context.translation.onlyNumbers,
|
|
onSaved: (text) {
|
|
//TODO set the values...
|
|
// serviceRequestProvider.initialSelectedSparePart. = num.tryParse(text ?? "");
|
|
},
|
|
),
|
|
15.height,
|
|
AppTextFormField(
|
|
initialValue: _serviceReport?.comment,
|
|
backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
|
|
labelText: context.translation.description,
|
|
alignLabelWithHint: true,
|
|
showWithoutDecoration: true,
|
|
textInputType: TextInputType.multiline,
|
|
onSaved: (value) {
|
|
_serviceReport.comment = value;
|
|
},
|
|
),
|
|
15.height,
|
|
MultiFilesPicker(label: context.translation.attachQuotation, files: _files),
|
|
],
|
|
).paddingAll(16),
|
|
),
|
|
8.height,
|
|
],
|
|
),
|
|
).expanded,
|
|
AppFilledButton(
|
|
label: context.translation.addSparePartActivity,
|
|
buttonColor: AppColor.green70,
|
|
onPressed: () async {
|
|
ServiceRequestBottomSheet.actionBottomSheet(context: context, title: context.translation.addSparePartActionHeading);
|
|
// bool shouldReloadData = (await showModalBottomSheet(
|
|
// context: context,
|
|
// useSafeArea: true,
|
|
// isScrollControlled: true,
|
|
// backgroundColor: Colors.transparent,
|
|
// builder: (context) => ActionBottomSheet(title: context.translation.addSparePartActionHeading),
|
|
// )) as bool;
|
|
// if (shouldReloadData ?? false) {}
|
|
//TODO write add sparepart logic
|
|
|
|
// if ((!_formKey.currentState.validate()) || (!(await _serviceReport.validate(context)))) {
|
|
// setState(() {});
|
|
// return;
|
|
// }
|
|
// _formKey.currentState.save();
|
|
// _serviceReport.attachmentsWorkOrder ??= [];
|
|
// if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = [];
|
|
// for (var file in _files) {
|
|
// _serviceReport.attachmentsWorkOrder.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"));
|
|
// }
|
|
// final user = Provider.of<UserProvider>(context, listen: false).user;
|
|
// await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: serviceRequestProvider.serviceRequest, user: user);
|
|
},
|
|
),
|
|
],
|
|
).paddingAll(16),
|
|
),
|
|
),
|
|
);
|
|
}),
|
|
);
|
|
}
|
|
}
|