From 932841cbef4d4e0e375105578368f0b07be428ed Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 5 Nov 2023 14:33:18 +0300 Subject: [PATCH] PPM Done --- .../api/regular_visits_provider.dart | 16 ++++- lib/main.dart | 2 + lib/models/pantry/pentry.dart | 11 ++-- lib/models/pantry/pm_kit.dart | 6 +- .../common_widgets/app_text_form_field.dart | 50 +++++++------- lib/providers/ppm_device_status_provider.dart | 35 ++++++++++ .../pages/user/visits/pantry/edit_pentry.dart | 66 ++++--------------- .../parts/auto_complete_parts_field.dart | 8 +++ .../auto_complete_devices_field.dart | 8 +++ .../widgets/pentry/pentry_pm_kit_form.dart | 4 +- .../pentry/pentry_ppm_check_list_form.dart | 9 +++ lib/views/widgets/pentry/pentry_tbs_form.dart | 39 ++++------- 12 files changed, 139 insertions(+), 115 deletions(-) create mode 100644 lib/providers/ppm_device_status_provider.dart diff --git a/lib/controllers/providers/api/regular_visits_provider.dart b/lib/controllers/providers/api/regular_visits_provider.dart index 4fae99fa..fccfe190 100644 --- a/lib/controllers/providers/api/regular_visits_provider.dart +++ b/lib/controllers/providers/api/regular_visits_provider.dart @@ -1,16 +1,20 @@ import 'dart:convert'; -import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:http/http.dart'; import 'package:logger/logger.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_search.dart'; +import '../../../new_views/common_widgets/app_lazy_loading.dart'; + class RegularVisitsProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 12; @@ -144,13 +148,14 @@ class RegularVisitsProvider extends ChangeNotifier { return pantry; } - Future updatePentry({ - @required String host, + Future updatePentry( + BuildContext context, { @required User user, @required Pentry pentry, @required Visit visit, }) async { try { + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); Response response; Map body = pentry.toMap(visit.id); body["id"] = visit.id; @@ -169,7 +174,12 @@ class RegularVisitsProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { reset(); //visit.status = pentry.ppmVisitStatus; notifyListeners(); + Fluttertoast.showToast(msg: context.translation.successfulRequestMessage); + Navigator.of(context).pop(); + } else { + Fluttertoast.showToast(msg: "${context.translation.failedToCompleteRequest} ${jsonDecode(response.body)["message"]}"); } + Navigator.of(context).pop(); return response.statusCode; } catch (error) { return -1; diff --git a/lib/main.dart b/lib/main.dart index 0a7bbad9..6b3e6cd7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -53,6 +53,7 @@ import 'package:test_sa/providers/gas_request_providers/gas_status_provider.dart import 'package:test_sa/providers/gas_request_providers/gas_types_provider.dart'; import 'package:test_sa/providers/gas_request_providers/site_provider.dart'; import 'package:test_sa/providers/loading_list_notifier.dart'; +import 'package:test_sa/providers/ppm_device_status_provider.dart'; import 'package:test_sa/providers/ppm_visit_status_provider.dart'; import 'package:test_sa/providers/service_request_providers/equipment_status_provider.dart'; import 'package:test_sa/providers/service_request_providers/first_action_provider.dart'; @@ -179,6 +180,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => ServiceTypeProvider()), ChangeNotifierProvider(create: (_) => PPMVisitStatusProvider()), ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()), + ChangeNotifierProvider(create: (_) => PPMDeviceStatusProvider()), ], child: GestureDetector( onTap: () { diff --git a/lib/models/pantry/pentry.dart b/lib/models/pantry/pentry.dart index c59e651f..85fa0eb4 100644 --- a/lib/models/pantry/pentry.dart +++ b/lib/models/pantry/pentry.dart @@ -48,12 +48,16 @@ class Pentry { this.localEngineerSignature}); Future validate() async { + if (ppmVisitStatus == null) { + await Fluttertoast.showToast(msg: "PPM Visit Status is Required"); + return false; + } if (actualVisitDate == null) { await Fluttertoast.showToast(msg: "Actual visit date is Required"); return false; } if (expectedVisitDate == null) { - await Fluttertoast.showToast(msg: "expected visit date is Required"); + await Fluttertoast.showToast(msg: "Expected visit date is Required"); return false; } if (timer?.startAt == null) { @@ -64,7 +68,6 @@ class Pentry { await Fluttertoast.showToast(msg: "Please Stop The Timer"); return false; } - if (ppmVisitStatus == null) return false; if (status?.id == null) { await Fluttertoast.showToast(msg: "Device Status is Required"); return false; @@ -75,8 +78,8 @@ class Pentry { Map toMap(int visitId) { Map map = {}; - map["visitStatusId"] = ppmVisitStatus?.id?.toString(); - if (status != null) map["deviceStatusId"] = status?.id?.toString(); + map["visitStatusId"] = ppmVisitStatus?.id; + if (status != null) map["deviceStatusId"] = status?.id; if (travelingHours != null) map["travelingHours"] = travelingHours; //if(imageFile != null) map["file_attachement"] = base64Encode(imageFile.readAsBytesSync()); map["actualDate"] = actualVisitDate.toIso8601String(); diff --git a/lib/models/pantry/pm_kit.dart b/lib/models/pantry/pm_kit.dart index fb3fa857..c32d2458 100644 --- a/lib/models/pantry/pm_kit.dart +++ b/lib/models/pantry/pm_kit.dart @@ -16,12 +16,12 @@ class PMKit { return { "id": id ?? 0, "visitId": visitId, - if (itemCode != null) 'partCatalogItemId': (itemCode?.id).toString(), - // if(itemName != null) 'itemName': itemName, + if (itemCode != null) 'partCatalogItemId': (itemCode?.id), + if (itemName != null) 'itemName': itemName, // if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame, // if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand, // if(availability != null) 'availability': availability, - // if(quantityNeeded != null) 'quantityNeeded': quantityNeeded, + if (quantityNeeded != null) 'quantityNeeded': quantityNeeded, // if(quantityReserved != null) 'quantityReserved': quantityReserved, }; } diff --git a/lib/new_views/common_widgets/app_text_form_field.dart b/lib/new_views/common_widgets/app_text_form_field.dart index 2e1af846..29676754 100644 --- a/lib/new_views/common_widgets/app_text_form_field.dart +++ b/lib/new_views/common_widgets/app_text_form_field.dart @@ -28,31 +28,31 @@ class AppTextFormField extends StatefulWidget { final Color backgroundColor; final bool alignLabelWithHint; - const AppTextFormField({ - Key key, - this.onSaved, - this.validator, - this.node, - this.onChange, - this.obscureText, - this.showPassword, - this.hintText, - this.labelText, - this.textInputType = TextInputType.text, - this.initialValue, - this.enable = true, - this.style, - this.textAlign, - this.suffixIcon, - this.prefixIcon, - this.prefixIconData, - this.prefixIconSize, - this.controller, - this.textInputAction, - this.onAction, - this.backgroundColor, - this.alignLabelWithHint - }) : super(key: key); + const AppTextFormField( + {Key key, + this.onSaved, + this.validator, + this.node, + this.onChange, + this.obscureText, + this.showPassword, + this.hintText, + this.labelText, + this.textInputType = TextInputType.text, + this.initialValue, + this.enable = true, + this.style, + this.textAlign, + this.suffixIcon, + this.prefixIcon, + this.prefixIconData, + this.prefixIconSize, + this.controller, + this.textInputAction, + this.onAction, + this.backgroundColor, + this.alignLabelWithHint}) + : super(key: key); @override State createState() => _AppTextFormFieldState(); diff --git a/lib/providers/ppm_device_status_provider.dart b/lib/providers/ppm_device_status_provider.dart new file mode 100644 index 00000000..a7eaca05 --- /dev/null +++ b/lib/providers/ppm_device_status_provider.dart @@ -0,0 +1,35 @@ +import 'dart:convert'; + +import 'package:http/http.dart'; +import 'package:test_sa/models/lookup.dart'; + +import '../../controllers/api_routes/api_manager.dart'; +import '../../controllers/api_routes/urls.dart'; +import 'loading_list_notifier.dart'; + +class PPMDeviceStatusProvider extends LoadingListNotifier { + @override + Future getDate() async { + if (loading ?? false) return -2; + loading = true; + notifyListeners(); + Response response; + try { + response = await ApiManager.instance.get(URLs.getPentryStatus); + } catch (error) { + loading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List listJson = json.decode(response.body)["data"]; + items = listJson.map((department) => Lookup.fromJson(department)).toList(); + } + loading = false; + notifyListeners(); + return response.statusCode; + } +} diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart index a4d7ae00..38fd4aa3 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -50,25 +49,9 @@ class _EditPentryState extends State with SingleTickerProviderStateM setState(() {}); return; } - _isLoading = true; - setState(() {}); + _pentry.clearEmptyObjects(); - int status = await _regularVisitsProvider.updatePentry(user: _userProvider.user, host: _settingProvider.host, pentry: _pentry, visit: widget.visit); - _isLoading = false; - setState(() {}); - if (status >= 200 && status < 300) { - Fluttertoast.showToast( - msg: context.translation.successfulRequestMessage, - ); - Navigator.of(context).pop(); - Navigator.of(context).pop(); - } else { - // String errorMessage = HttpStatusManger.getStatusMessage( - // status: status, subtitle: context.translation); - // Fluttertoast.showToast( - // msg: errorMessage, - // ); - } + await _regularVisitsProvider.updatePentry(context, user: _userProvider.user, pentry: _pentry, visit: widget.visit); } @override @@ -134,40 +117,17 @@ class _EditPentryState extends State with SingleTickerProviderStateM PentryPMChecklistForm(models: _pentry.ppmCheckLists, enableValidate: _validate), ], ).expanded, - AppFilledButton(onPressed: () {}, label: context.translation.next).paddingOnly(top: 16), - // Padding( - // padding: const EdgeInsets.all(8.0), - // child: Row( - // children: [ - // if (_tabController.index != 0) - // ASmallButton( - // text: context.translation.back, - // onPressed: () { - // _tabController.animateTo( - // _tabController.index - 1, - // ); - // setState(() {}); - // }, - // ), - // const Spacer(), - // if (_tabController.index != _tabController.length - 1) - // ASmallButton( - // text: context.translation.next, - // onPressed: () { - // _tabController.animateTo( - // _tabController.index + 1, - // ); - // setState(() {}); - // }, - // ), - // if (_tabController.index == _tabController.length - 1) - // ASmallButton( - // text: context.translation.update, - // onPressed: _onSubmit, - // ), - // ], - // ), - // ), + AppFilledButton( + onPressed: () { + if (_tabController.index == 3) { + _onSubmit(); + } else { + _tabController.animateTo(_tabController.index + 1); + setState(() {}); + } + }, + label: _tabController.index == 3 ? context.translation.submit : context.translation.next, + ).paddingOnly(top: 16), ], ).paddingAll(16), ), diff --git a/lib/views/widgets/parts/auto_complete_parts_field.dart b/lib/views/widgets/parts/auto_complete_parts_field.dart index ec742632..cc94e248 100644 --- a/lib/views/widgets/parts/auto_complete_parts_field.dart +++ b/lib/views/widgets/parts/auto_complete_parts_field.dart @@ -34,6 +34,14 @@ class _AutoCompletePartsFieldState extends State { super.initState(); } + @override + void didUpdateWidget(covariant AutoCompletePartsField oldWidget) { + if (widget.initialValue != oldWidget.initialValue) { + _controller = TextEditingController(text: widget.initialValue); + } + super.didUpdateWidget(oldWidget); + } + @override void dispose() { _controller.dispose(); diff --git a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart index 67288f1b..8fe86d6c 100644 --- a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart +++ b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart @@ -35,6 +35,14 @@ class _AutoCompleteDeviceNumberFieldState extends State { ); } final model = widget.models[index]; + final TextEditingController controller = TextEditingController(text: model.quantityNeeded); return Container( padding: const EdgeInsets.all(16), margin: EdgeInsets.only(bottom: 16.toScreenHeight), @@ -75,11 +76,12 @@ class _PentryPMKitFormState extends State { initialValue: (model.itemCode?.name ?? "").toString(), onPick: (part) { model.itemCode = Lookup(id: part.id, name: part?.sparePart?.partNo); + model.itemName = part?.sparePart?.partName; }, ), 8.height, AppTextFormField( - initialValue: model.quantityNeeded, + controller: controller, labelText: context.translation.quantity, textInputType: TextInputType.number, onChange: (text) { diff --git a/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart b/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart index 3dd6fd52..0faa222f 100644 --- a/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart +++ b/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.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/models/pantry/ppm_check_list.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; class PentryPMChecklistForm extends StatefulWidget { final List models; @@ -32,6 +34,13 @@ class _PentryPMChecklistFormState extends State { initiallyExpanded: index == 0, iconColor: AppColor.neutral50, collapsedIconColor: AppColor.neutral50, + childrenPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), + children: [ + AppTextFormField(labelText: "Measured Value", initialValue: model.measuredValue, enable: false), + 8.height, + AppTextFormField(labelText: context.translation.comment, initialValue: model.comment, enable: false), + 8.height, + ], ), ); }, diff --git a/lib/views/widgets/pentry/pentry_tbs_form.dart b/lib/views/widgets/pentry/pentry_tbs_form.dart index b87a1401..b554b882 100644 --- a/lib/views/widgets/pentry/pentry_tbs_form.dart +++ b/lib/views/widgets/pentry/pentry_tbs_form.dart @@ -6,6 +6,7 @@ import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; +import 'package:test_sa/providers/ppm_device_status_provider.dart'; import 'package:test_sa/providers/ppm_visit_status_provider.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; @@ -37,10 +38,9 @@ class _PentryTBSFormState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ 8.height, - - /// required SingleItemDropDownMenu( context: context, + initialValue: widget.model.ppmVisitStatus, title: "PPM Visit Status", onSelect: (value) { if (value != null) { @@ -49,8 +49,6 @@ class _PentryTBSFormState extends State { }, ), 8.height, - - /// required AppTimer( timer: widget.model.timer, enabled: widget.model.timer.endAt == null, @@ -60,26 +58,17 @@ class _PentryTBSFormState extends State { }, ), 8.height, - // const ASubTitle("Status"), - // if (widget.enableValidate && widget.model.status == null) - // ASubTitle( - // context.translation.requiredWord, - // color: Colors.red, - // ), - // const SizedBox( - // height: 4, - // ), - // PentryStatusMenu( - // initialValue: widget.model.status, - // onSelect: (status) { - // widget.model.status = status; - // }, - // ), - // const SizedBox( - // height: 8, - // ), - - /// required + SingleItemDropDownMenu( + context: context, + initialValue: widget.model.status, + title: "Device Status", + onSelect: (value) { + if (value != null) { + widget.model.status = value; + } + }, + ), + 8.height, ADatePicker( label: "Actual Visit Date", date: widget.model.actualVisitDate, @@ -91,8 +80,6 @@ class _PentryTBSFormState extends State { }, ), 8.height, - - /// required ADatePicker( label: "Expected Visit Date", date: widget.model.expectedVisitDate,