diff --git a/.gitignore b/.gitignore index a8e938c0..090e52bd 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ migrate_working_dir/ .pub/ /build/ + # Web related lib/generated_plugin_registrant.dart @@ -41,6 +42,10 @@ app.*.symbols # Obfuscation related app.*.map.json +# Ignore gradle.properties file +android/gradle.properties + + # Android Studio will place build artifacts here /android/app/debug /android/app/profile diff --git a/android/gradle.properties b/android/gradle.properties index ff5389fd..08dfdfcb 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,4 @@ org.gradle.jvmargs=-Xmx2048m android.useAndroidX=true android.enableJetifier=true +org.gradle.java.home=/Users/waseem/Library/Java/JavaVirtualMachines/jbr-17.0.12/Contents/Home diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 02e5f581..4ced9cb5 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Jun 23 08:50:38 CEST 2017 +#Tue Oct 15 10:26:35 AST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 62829ad2..8d696f91 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -51,6 +51,7 @@ "emailExist": "البريد الالكتروني موجود بالفعل", "phoneNumberExist": "رقم الهاتف موجود بالفعل", "next": "التالي", + "assetSituation": "حالة الأصول", "back": "السابق", "search": "بحث", "searchByName": "بحث بالاسم", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 5c469d71..fd91c197 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -18,6 +18,7 @@ "name": "Name", "email": "Email", "retirementType": "Retirement Type", + "assetSituation": "Asset Situation", "phoneNumber": "Phone Number", "password": "Password", "confirmPassword": "Confirm Password", diff --git a/lib/new_views/app_style/app_color.dart b/lib/new_views/app_style/app_color.dart index bb7aa2ee..8f263e2b 100644 --- a/lib/new_views/app_style/app_color.dart +++ b/lib/new_views/app_style/app_color.dart @@ -236,4 +236,19 @@ class AppColor { return blueStatus(context); } } + static Color getEquipmentStatusColor(BuildContext context, int id) { + switch (id) { + case 368: + //partially Down + return greenStatus(context); + case 369: + // Completely Down + return redStatus(context); + case 790: + //UP + return blueStatus(context); + default: + return blueStatus(context); + } + } } diff --git a/lib/providers/work_order/fault_description_provider.dart b/lib/providers/work_order/fault_description_provider.dart index 82cb277e..0c9c7a78 100644 --- a/lib/providers/work_order/fault_description_provider.dart +++ b/lib/providers/work_order/fault_description_provider.dart @@ -26,7 +26,6 @@ class FaultDescriptionProvider extends ChangeNotifier { late Response response; try { response = await ApiManager.instance.get(URLs.getFaultDescription+"?assetId=$assetId",); - List list = []; if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received diff --git a/lib/service_request_latest/utilities/service_request_utils.dart b/lib/service_request_latest/utilities/service_request_utils.dart new file mode 100644 index 00000000..5acb4a51 --- /dev/null +++ b/lib/service_request_latest/utilities/service_request_utils.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +class ServiceRequestUtils{ + static int calculateAndAssignWorkingHours({ + required DateTime? startTime, + required DateTime? endTime, + required TextEditingController workingHoursController, + required Function(int) updateModel, // A callback to update the model + }) { + print('end date i got is ${endTime}'); + if (startTime != null && endTime != null) { + + Duration difference = endTime.difference(startTime); + int hours = difference.inHours; + + // Update the controller and model + workingHoursController.text = hours.toString(); + updateModel(hours); // Call the function to update the model + + return hours; + } else { + return -1; // Indicating invalid input + } + } +} \ No newline at end of file diff --git a/lib/service_request_latest/views/components/asset_detail_card.dart b/lib/service_request_latest/views/components/asset_detail_card.dart new file mode 100644 index 00000000..46f70274 --- /dev/null +++ b/lib/service_request_latest/views/components/asset_detail_card.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:provider/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/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/service_request_latest/request_detail_provider.dart'; +import 'package:test_sa/service_request_latest/views/components/bottom_sheets/service_request_bottomsheet.dart'; +import 'package:test_sa/service_request_latest/views/components/verify_arrival_view.dart'; +import 'package:test_sa/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart'; +import 'package:test_sa/views/widgets/requests/request_status.dart'; + +class AssetDetailCard extends StatelessWidget { + const AssetDetailCard({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Consumer(builder: (context, RequestDetailProvider requestDetailProvider, snapshot) { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(14), + color: AppColor.white10, + ), + padding: EdgeInsets.symmetric(horizontal: 12.toScreenWidth, vertical: 14.toScreenHeight), + margin: EdgeInsets.only(top: 10.toScreenHeight), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + StatusLabel( + label: requestDetailProvider.engineerUpdateWorkOrderHelperModel?.equipmentStatus?.name, + id: requestDetailProvider.engineerUpdateWorkOrderHelperModel!.equipmentStatus!.id ?? 0, + radius: 4, + textColor: AppColor.white10, + backgroundColor: AppColor.getEquipmentStatusColor(context, requestDetailProvider.engineerUpdateWorkOrderHelperModel!.equipmentStatus!.id ?? 0), + ), + "edit_icon".toSvgAsset(height: 21, width: 21).onPress(() { + Navigator.push(context, MaterialPageRoute(builder: (context) => const VerifyAssetDetails())); + }), + ]), + 6.height, + context.translation.assetSituation.heading6(context).custom(color: AppColor.black20), + 6.height, + Text( + '${context.translation.returnToService}: ${requestDetailProvider.engineerUpdateWorkOrderHelperModel?.returnToService?.toAssetDetailsFormat}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), + ), + 6.height, + Text( + '${context.translation.loanAvailability}: ${requestDetailProvider.engineerUpdateWorkOrderHelperModel?.loanAvailability?.name}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), + ), + 6.height, + Text( + '${context.translation.failureReason}: ${requestDetailProvider.engineerUpdateWorkOrderHelperModel?.failureReason?.name}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), + ), + + ], + ), + ); + }); + } +} diff --git a/lib/service_request_latest/views/components/request_detail_view.dart b/lib/service_request_latest/views/components/request_detail_view.dart index ab590e87..106bdcba 100644 --- a/lib/service_request_latest/views/components/request_detail_view.dart +++ b/lib/service_request_latest/views/components/request_detail_view.dart @@ -15,6 +15,7 @@ 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/service_request_latest/request_detail_provider.dart'; import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart'; +import 'package:test_sa/service_request_latest/views/components/asset_detail_card.dart'; import 'package:test_sa/service_request_latest/views/components/initial_visit_card.dart'; import 'package:test_sa/service_request_latest/views/components/timer_widget.dart'; import 'package:test_sa/service_request_latest/views/forms/asset_retired/asset_retired.dart'; @@ -47,6 +48,7 @@ class WorkOrderDetailView extends StatelessWidget { children: [ workOrderDetailCard(context, requestProvider.currentWorkOrder!.data!, _userProvider), initialVisitCard(requestDetailProvider: requestProvider, userProvider: _userProvider), + assetDetailCard(requestDetailProvider: requestProvider, userProvider: _userProvider), 20.height, ], ), @@ -318,6 +320,29 @@ class WorkOrderDetailView extends StatelessWidget { } } } + Widget assetDetailCard({required RequestDetailProvider requestDetailProvider, required UserProvider userProvider}) { + //TODO add proper check to hide and show that widget + // if (requestDetailProvider.currentWorkOrder!.data!.needAVisitDateTime != null && + // userProvider.user?.type == UsersTypes.engineer && + // requestDetailProvider.currentWorkOrder?.data?.nextStep!.workOrderNextStepEnum == WorkOrderNextStepEnum.verifyAssetDetail) { + WorkOrderData currentWorkOrderData = requestDetailProvider.currentWorkOrder!.data!; + requestDetailProvider.engineerUpdateWorkOrderHelperModel = EngineerUpdateWorkOrderHelperModel( + workOrderId: currentWorkOrderData.requestId, + equipmentStatus: currentWorkOrderData.equipmentStatus, + loanAvailability: currentWorkOrderData.loanAvailablity, + failureReason: currentWorkOrderData.failureReasone, + // faultDescription: currentWorkOrderData.fa, + solution: currentWorkOrderData.solution?.name, + returnToService: currentWorkOrderData.returnToService, + serviceType: currentWorkOrderData.serviceType, + ); + // requestDetailProvider.updateNeedVisitHelperModel(requestDetailProvider.needVisitHelperModel); + return const AssetDetailCard(); + // } + // else { + // return const SizedBox(); + // } + } } // class RequestDetailView extends StatefulWidget { diff --git a/lib/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart b/lib/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart index b1cbcad0..dd7337e7 100644 --- a/lib/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart +++ b/lib/service_request_latest/views/forms/asset_retired/verify_asset_detail.dart @@ -28,7 +28,7 @@ import 'package:test_sa/views/widgets/equipment/pick_asset.dart'; import '../../../../../../models/lookup.dart'; import '../../../../../../new_views/common_widgets/default_app_bar.dart'; -//TODO Have some details need to confirm from backend failure reason, fault description, solutions... +//TODO Have some details need to confirm from backend fault description, class VerifyAssetDetails extends StatefulWidget { static const String id = "/verify-asset-detail"; @@ -75,7 +75,9 @@ class _VerifyAssetDetailsState extends State with TickerProv _faultDescriptionProvider = Provider.of(context, listen: false); _equipmentStatusProvider = Provider.of(context, listen: false); _equipmentStatusProvider!.reset(); - _equipmentStatusProvider!.getDate(); + WidgetsBinding.instance.addPostFrameCallback((_) { + _equipmentStatusProvider!.getDate(); + }); _reasonProvider?.serviceRequestId = _requestDetailProvider?.currentWorkOrder!.data!.requestId.toString(); WorkOrderData currentWorkOrderData = _requestDetailProvider!.currentWorkOrder!.data!; _requestDetailProvider?.engineerUpdateWorkOrderHelperModel = EngineerUpdateWorkOrderHelperModel(