From 13be4e960a4cf5971028d5aae102028b00c005ea Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 19 Jun 2025 12:35:34 +0300 Subject: [PATCH 1/3] notification issue, otp issue fixed. --- .../firebase_notification_manger.dart | 25 +++++++++-------- .../providers/api/user_provider.dart | 2 +- .../service_request_detail_provider.dart | 2 +- .../views/components/verify_arrival_view.dart | 27 +++++++++---------- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/lib/controllers/notification/firebase_notification_manger.dart b/lib/controllers/notification/firebase_notification_manger.dart index 26fe0e69..50371c4f 100644 --- a/lib/controllers/notification/firebase_notification_manger.dart +++ b/lib/controllers/notification/firebase_notification_manger.dart @@ -84,6 +84,9 @@ class FirebaseNotificationManger { static void handleMessage(context, Map messageData) { if (messageData["requestType"] != null && messageData["requestNumber"] != null) { Widget? serviceClass; + + String? transactionType = messageData["transactionType"]?.toString(); + // PPM=1, // ServiceRequestEngineer = 3, // AssetTransfer=7, @@ -91,31 +94,31 @@ class FirebaseNotificationManger { // GasRefill=9, // TechnicalRetirmentWO = 11, // Recurrent = 12,​ - switch (messageData["transactionType"]) { - case 1: + switch (transactionType) { + case "1": serviceClass = PpmDetailsPage(requestId: int.parse(messageData["requestNumber"].toString())); break; //these three request are same corrective maintenance.... - case 3: - serviceClass = ServiceRequestDetailMain(requestId: messageData["requestNumber"] ?? ''); + case "3": + serviceClass = ServiceRequestDetailMain(requestId: int.parse(messageData["requestNumber"].toString())); break; - case 8: - serviceClass = ServiceRequestDetailMain(requestId: messageData["requestNumber"] ?? ''); + case "8": + serviceClass = ServiceRequestDetailMain(requestId: int.parse(messageData["requestNumber"].toString())); break; - case 11: - serviceClass = ServiceRequestDetailMain(requestId: messageData["requestNumber"] ?? ''); + case "11": + serviceClass = ServiceRequestDetailMain(requestId: int.parse(messageData["requestNumber"].toString())); break; - case 7: + case "7": serviceClass = DeviceTransferDetails(model: DeviceTransfer(id: int.parse(messageData["requestNumber"].toString()))); break; - case 9: + case "9": serviceClass = GasRefillDetailsPage( priority: messageData["priority"], date: messageData["createdOn"], model: GasRefillModel(id: int.parse(messageData["requestNumber"].toString())), ); break; - case 12: + case "12": serviceClass = RecurrentWorkOrderView(taskId: int.parse(messageData["requestNumber"].toString())); //Didn't handle task request yet... // case 6: diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index 296be168..559ef226 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -295,7 +295,7 @@ class UserProvider extends ChangeNotifier { "userId": userId, }; try { - response = await ApiManager.instance.post(URLs.getSwipeLastTransactionUrl, body: body); + response = await ApiManager.instance.post(URLs.getSwipeLastTransactionUrl, body: body,showToast: false); if (response.statusCode >= 200 && response.statusCode < 300) { swipeTransactionModel = SwipeTransaction.fromJson(json.decode(response.body)['data']); diff --git a/lib/modules/cm_module/service_request_detail_provider.dart b/lib/modules/cm_module/service_request_detail_provider.dart index 55df5224..8d333177 100644 --- a/lib/modules/cm_module/service_request_detail_provider.dart +++ b/lib/modules/cm_module/service_request_detail_provider.dart @@ -945,7 +945,7 @@ class ServiceRequestDetailProvider extends ChangeNotifier { isLoading = true; notifyListeners(); try { - final response = await ApiManager.instance.post(URLs.sendOtpUrl + "$workOrderId", body: {}); + final response = await ApiManager.instance.post(URLs.sendOtpUrl + "$workOrderId", body: {},showToast: false); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) {} isLoading = false; diff --git a/lib/modules/cm_module/views/components/verify_arrival_view.dart b/lib/modules/cm_module/views/components/verify_arrival_view.dart index 942949ed..6c55c953 100644 --- a/lib/modules/cm_module/views/components/verify_arrival_view.dart +++ b/lib/modules/cm_module/views/components/verify_arrival_view.dart @@ -49,7 +49,7 @@ class _VerifyArrivalViewState extends State { //backgroundColor: const Color(0xfff8f9fb), body: Consumer(builder: (context, ServiceRequestDetailProvider requestDetailProvider, child) { return SafeArea( - child: requestDetailProvider.isArrivalLoading + child: requestDetailProvider.isArrivalLoading || requestDetailProvider.isLoading ? const CircularProgressIndicator(color: AppColor.primary10).center : requestDetailProvider.arrivalTypeList.isEmpty ? const NoDataFound().center @@ -62,6 +62,7 @@ class _VerifyArrivalViewState extends State { icon: item.verificationTypes!.icon ?? '', heading: item.verificationTypes!.name ?? '', subHeading: item.description ?? '', + // isLoading: requestDetailProvider.isLoading, onTap: () { onItemTap(requestDetailProvider: requestDetailProvider, context: context, verificationTypeId: item.verificationTypes?.value); }); @@ -72,7 +73,7 @@ class _VerifyArrivalViewState extends State { ); } - Widget customListItem({required String icon, required String heading, required String subHeading, required VoidCallback onTap}) { + Widget customListItem({required String icon, required String heading, required String subHeading, required VoidCallback onTap, bool isLoading = false}) { return GestureDetector( onTap: onTap, // Handles the tap child: Card( @@ -81,33 +82,29 @@ class _VerifyArrivalViewState extends State { ), color: Colors.white, child: Row( - crossAxisAlignment: CrossAxisAlignment.start, // Align items at the top + crossAxisAlignment: CrossAxisAlignment.center, // Align items at the top children: [ - // Icon Section - icon - .toSvgAsset( - width: 32, - color: AppColor.neutral120, - height: 29, - ) - .paddingOnly(top: 8), - 14.width, + icon.toSvgAsset(width: 30, color: AppColor.neutral120, height: 30).paddingOnly(top: 0), + 12.width, Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, children: [ Text( heading, style: AppTextStyles.heading6.copyWith(color: AppColor.neutral50), ), - 7.height, + 6.height, Text( subHeading, style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120), ), ], - ).paddingOnly(end: 50), + ), ), + 12.width, + SizedBox(width: 24, height: 24, child: isLoading ? const CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 2) : const SizedBox()) ], ).paddingAll(12), ), @@ -150,7 +147,7 @@ class _VerifyArrivalViewState extends State { } break; case 3: - requestDetailProvider.sendOtp(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!); + await requestDetailProvider.sendOtp(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!); Navigator.pushReplacement( context, MaterialPageRoute(builder: (context) => const VerifyOtpView()), From bed3a9821eed8c925ea71a1180baec84a8d4542f Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 19 Jun 2025 12:44:47 +0300 Subject: [PATCH 2/3] decimal keyboard on traveling hours, email keyboard for email for external engineer --- lib/modules/cm_module/views/components/verify_otp_view.dart | 5 +---- .../maintenance_request/components/external_request.dart | 5 +---- .../maintenance_request/components/internal_request.dart | 2 +- .../user/requests/add_supplier_engineer_bottom_sheet.dart | 2 +- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/lib/modules/cm_module/views/components/verify_otp_view.dart b/lib/modules/cm_module/views/components/verify_otp_view.dart index c54c66fa..63346dcf 100644 --- a/lib/modules/cm_module/views/components/verify_otp_view.dart +++ b/lib/modules/cm_module/views/components/verify_otp_view.dart @@ -18,10 +18,7 @@ class VerifyOtpView extends StatelessWidget { final defaultPinTheme = PinTheme( width: 51.toScreenWidth, height: 63.toScreenHeight, - textStyle: const TextStyle( - fontSize: 22, - color: Colors.black, - ), + textStyle: const TextStyle(fontSize: 22, color: Colors.black), decoration: BoxDecoration( color: AppColor.neutral100, borderRadius: BorderRadius.circular(10), diff --git a/lib/modules/cm_module/views/forms/maintenance_request/components/external_request.dart b/lib/modules/cm_module/views/forms/maintenance_request/components/external_request.dart index 2b72b142..6733c8dc 100644 --- a/lib/modules/cm_module/views/forms/maintenance_request/components/external_request.dart +++ b/lib/modules/cm_module/views/forms/maintenance_request/components/external_request.dart @@ -111,10 +111,7 @@ class _ExternalMaintenanceRequestState extends State borderRadius: BorderRadius.circular(10), boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], ), - child: Icon( - Icons.add, - color: context.isDark ? null : AppColor.neutral60, - ), + child: Icon(Icons.add, color: context.isDark ? null : AppColor.neutral60), ).onPress(requestDetailProvider.activityMaintenanceHelperModel?.supplier?.suppliername == null ? null : () async { diff --git a/lib/modules/cm_module/views/forms/maintenance_request/components/internal_request.dart b/lib/modules/cm_module/views/forms/maintenance_request/components/internal_request.dart index a711a50d..f9385cbc 100644 --- a/lib/modules/cm_module/views/forms/maintenance_request/components/internal_request.dart +++ b/lib/modules/cm_module/views/forms/maintenance_request/components/internal_request.dart @@ -257,7 +257,7 @@ class _InternalMaintenanceRequestState extends State labelStyle: AppTextStyles.textFieldLabelStyle, suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16), initialValue: requestDetailProvider.activityMaintenanceHelperModel?.travelHours?.toString(), - textInputType: TextInputType.number, + textInputType: const TextInputType.numberWithOptions(decimal: true), onChange: (value) { requestDetailProvider.activityMaintenanceHelperModel?.travelHours = num.parse(value); // int.tryParse(value); }, diff --git a/lib/views/pages/user/requests/add_supplier_engineer_bottom_sheet.dart b/lib/views/pages/user/requests/add_supplier_engineer_bottom_sheet.dart index b3b2c451..7f13df6c 100644 --- a/lib/views/pages/user/requests/add_supplier_engineer_bottom_sheet.dart +++ b/lib/views/pages/user/requests/add_supplier_engineer_bottom_sheet.dart @@ -104,7 +104,7 @@ class _AddSupplierEngineerBottomSheetState extends State Date: Thu, 19 Jun 2025 12:55:22 +0300 Subject: [PATCH 3/3] improvement. --- .../ppm_wo/update_ppm/wo_info_form.dart | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart b/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart index 9d303e40..fbbbd801 100644 --- a/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart +++ b/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart @@ -6,10 +6,11 @@ import 'package:test_sa/controllers/providers/api/ppm_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart'; -import 'package:test_sa/models/device/model_definition.dart'; -import 'package:test_sa/models/device/supplier.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/device/model_definition.dart'; +import 'package:test_sa/models/device/supplier.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/department.dart'; @@ -25,12 +26,10 @@ import 'package:test_sa/providers/ppm_asset_availability_provider.dart'; import 'package:test_sa/providers/ppm_electrical_safety_provider.dart'; import 'package:test_sa/providers/ppm_service_provider.dart'; import 'package:test_sa/providers/ppm_task_status_provider.dart'; - import 'package:test_sa/views/widgets/bottom_sheets/asset_detail_bottom_sheet.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; -import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; class WoInfoForm extends StatefulWidget { @@ -63,9 +62,7 @@ class _WoInfoFormState extends State { double totalWorkingHours = widget.planPreventiveVisit.preventiveVisitTimers?.fold(0.0, (sum, item) => (sum ?? 0) + DateTime.parse(item.endDateTime!).difference(DateTime.parse(item.startDateTime!)).inSeconds) ?? 0; - return Consumer(builder: (context, ppmProvider, child) { - return ListView( padding: const EdgeInsets.only(left: 16, right: 16, top: 8, bottom: 16), children: [ @@ -109,7 +106,7 @@ class _WoInfoFormState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - widget.planPreventiveVisit.assetName!.bodyText(context).custom(color: AppColor.black10), + widget.planPreventiveVisit.assetName!.bodyText(context).custom(color: AppColor.black10).expanded, "info_icon".toSvgAsset(height: 17, width: 17).onPress( () { // There is only limited information for asset is returned from backend to show all info need to return the whole model from backend... @@ -171,7 +168,8 @@ class _WoInfoFormState extends State { SingleItemDropDownMenu( context: context, showShadow: false, - initialValue: widget.planPreventiveVisit.taskStatus == null ? null : Lookup(name: widget.planPreventiveVisit.taskStatus?.name ?? "", id: widget.planPreventiveVisit.taskStatus?.id), + initialValue: + widget.planPreventiveVisit.taskStatus == null ? null : Lookup(name: widget.planPreventiveVisit.taskStatus?.name ?? "", id: widget.planPreventiveVisit.taskStatus?.id), title: context.translation.pmTestResult, backgroundColor: AppColor.neutral100, onSelect: (value) { @@ -331,8 +329,8 @@ class _WoInfoFormState extends State { floor: Floor(name: model.floorName), site: Site(custName: model.siteName), supplier: Supplier(suppliername: model.supplierName), - modelDefinition: ModelDefinition(modelName: model.model, manufacturerName: model.manufacturer), - room: Rooms(value: int.tryParse(model.roomName??'')), + modelDefinition: ModelDefinition(modelName: model.model, manufacturerName: model.manufacturer, assetName: model.assetName), + room: Rooms(value: int.tryParse(model.roomName ?? '')), department: Department(departmentName: model.departmentName), ); return AssetDetailBottomSheet(asset);