From df66cf5c7796dc34f35c5dd8bd562a28abd2a513 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 7 Sep 2025 11:03:23 +0300 Subject: [PATCH] improvements --- .../action_button/footer_action_button.dart | 420 +++++++++--------- .../views/components/history_log_view.dart | 87 ++-- .../selection_fullscreen_dialog.dart | 2 +- 3 files changed, 254 insertions(+), 255 deletions(-) diff --git a/lib/modules/cm_module/views/components/action_button/footer_action_button.dart b/lib/modules/cm_module/views/components/action_button/footer_action_button.dart index e6e8de75..c9a833e5 100644 --- a/lib/modules/cm_module/views/components/action_button/footer_action_button.dart +++ b/lib/modules/cm_module/views/components/action_button/footer_action_button.dart @@ -23,10 +23,10 @@ import 'package:test_sa/new_views/swipe_module/dialoge/acknowledge_work_dialog.d import 'package:test_sa/providers/service_request_providers/reject_reason_provider.dart'; class FooterActionButton { - static Widget footerContainer({required Widget child,required BuildContext context}) { + static Widget footerContainer({required Widget child, required BuildContext context}) { return Container( alignment: Alignment.bottomCenter, - padding: const EdgeInsets.only(left: 16, right: 16, top: 12,bottom: 8), + padding: const EdgeInsets.only(left: 16, right: 16, top: 12, bottom: 8), color: AppColor.background(context), child: SafeArea(child: child), ); @@ -49,16 +49,16 @@ class FooterActionButton { switch (workOrderNextStepStatus) { case WorkOrderNextStepEnum.assignToMe: return footerContainer( - context: context, + context: context, child: AppFilledButton( - label: 'Assign To Me', - // maxWidth: true, - buttonColor: AppColor.primary10, - onPressed: () async { - requestDetailProvider.engineerAssignWorkOrderToHimself(id: requestDetailProvider.currentWorkOrder!.data!.requestId.toString()); - }, - fontSize: 12.toScreenWidth, - )); + label: 'Assign To Me', + // maxWidth: true, + buttonColor: AppColor.primary10, + onPressed: () async { + requestDetailProvider.engineerAssignWorkOrderToHimself(id: requestDetailProvider.currentWorkOrder!.data!.requestId.toString()); + }, + fontSize: 12.toScreenWidth, + )); case WorkOrderNextStepEnum.markedAsFixed: break; // TODO: Handle this case. @@ -79,20 +79,20 @@ class FooterActionButton { return footerContainer( context: context, child: AppFilledButton( - label: context.translation.close, - // maxWidth: true, - buttonColor: AppColor.primary10, - onPressed: () async { - Navigator.pop(context); - }, - )); + label: context.translation.close, + // maxWidth: true, + buttonColor: AppColor.primary10, + onPressed: () async { + Navigator.pop(context); + }, + )); case WorkOrderNextStepEnum.nTakeAction: if (requestDetailProvider.isReadOnlyRequest) { return footerContainer( context: context, child: AppFilledButton( label: context.translation.activities, - buttonColor: context.isDark? AppColor.primary10:AppColor.neutral50, + buttonColor: context.isDark ? AppColor.primary10 : AppColor.neutral50, textColor: context.isDark ? AppColor.black10 : Colors.white, onPressed: () async { Navigator.push(context, MaterialPageRoute(builder: (context) => const ActivitiesListView())); @@ -103,148 +103,148 @@ class FooterActionButton { return footerContainer( context: context, child: AppFilledButton( - label: context.translation.close, - // maxWidth: true, - buttonColor: AppColor.primary10, - onPressed: () async { - Navigator.pop(context); - }, - )); + label: context.translation.close, + // maxWidth: true, + buttonColor: AppColor.primary10, + onPressed: () async { + Navigator.pop(context); + }, + )); case WorkOrderNextStepEnum.eRejectAccept: return footerContainer( context: context, child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.min, - children: [ - AppFilledButton( - label: context.translation.reject, - maxWidth: true, - buttonColor:AppColor.background(context), - // textColor: context.isDark ? AppColor.neutral30 : Colors.white, - textColor: AppColor.red30, - showBorder: true, - onPressed: () async { - //TODO need to discuss getData is not called by default... - if (context.mounted) { - RejectReasonProvider rejectionReasonProvider = Provider.of(context, listen: false); - rejectionReasonProvider.reset(); - //rejectionReasonProvider.getDate(); - } - ServiceRequestBottomSheet.rejectRequestBottomSheet(context: context); - }, - ).expanded, - const SizedBox( - width: 20, - ), - AppFilledButton( - label: context.translation.accept, - maxWidth: true, - buttonColor: AppColor.green70, - onPressed: () async { - requestDetailProvider.engineerAcceptWorkOrder(id: requestDetailProvider.currentWorkOrder!.data!.requestId.toString()); - }, - ).expanded, - ], - )); + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.min, + children: [ + AppFilledButton( + label: context.translation.reject, + maxWidth: true, + buttonColor: AppColor.background(context), + // textColor: context.isDark ? AppColor.neutral30 : Colors.white, + textColor: AppColor.red30, + showBorder: true, + onPressed: () async { + //TODO need to discuss getData is not called by default... + if (context.mounted) { + RejectReasonProvider rejectionReasonProvider = Provider.of(context, listen: false); + rejectionReasonProvider.reset(); + //rejectionReasonProvider.getDate(); + } + ServiceRequestBottomSheet.rejectRequestBottomSheet(context: context); + }, + ).expanded, + const SizedBox( + width: 20, + ), + AppFilledButton( + label: context.translation.accept, + maxWidth: true, + buttonColor: AppColor.green70, + onPressed: () async { + requestDetailProvider.engineerAcceptWorkOrder(id: requestDetailProvider.currentWorkOrder!.data!.requestId.toString()); + }, + ).expanded, + ], + )); case WorkOrderNextStepEnum.eFixRemotelyNeedVisit: return footerContainer( context: context, child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.min, - children: [ - AppFilledButton( - label: context.translation.needAVisit, - maxWidth: true, - buttonColor: AppColor.neutral50, - onPressed: () async { - requestDetailProvider.needVisitHelperModel = NeedVisitHelperModel(); - ServiceRequestBottomSheet.initialVisitBottomSheet(context: context); - }, - ).expanded, - const SizedBox( - width: 20, - ), - AppFilledButton( - label: context.translation.fixedRemotely, - maxWidth: true, - buttonColor: AppColor.green70, - onPressed: () async { - requestDetailProvider.fixRemotelyHelperModel = FixRemotelyHelperModel(); - ServiceRequestBottomSheet.fixRemotelyBottomSheet(context: context); - }, - ).expanded, - ], - )); + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.min, + children: [ + AppFilledButton( + label: context.translation.needAVisit, + maxWidth: true, + buttonColor: AppColor.neutral50, + onPressed: () async { + requestDetailProvider.needVisitHelperModel = NeedVisitHelperModel(); + ServiceRequestBottomSheet.initialVisitBottomSheet(context: context); + }, + ).expanded, + const SizedBox( + width: 20, + ), + AppFilledButton( + label: context.translation.fixedRemotely, + maxWidth: true, + buttonColor: AppColor.green70, + onPressed: () async { + requestDetailProvider.fixRemotelyHelperModel = FixRemotelyHelperModel(); + ServiceRequestBottomSheet.fixRemotelyBottomSheet(context: context); + }, + ).expanded, + ], + )); case WorkOrderNextStepEnum.eArrived: return footerContainer( context: context, child: AppFilledButton( - label: context.translation.iHaveArrived, - showIcon: true, - icon: 'arrived_icon'.toSvgAsset(), - buttonColor: AppColor.green70, - onPressed: () async { - Navigator.push(context, MaterialPageRoute(builder: (context) => const VerifyArrivalView())); - }, - )); + label: context.translation.iHaveArrived, + showIcon: true, + icon: 'arrived_icon'.toSvgAsset(), + buttonColor: AppColor.green70, + onPressed: () async { + Navigator.push(context, MaterialPageRoute(builder: (context) => const VerifyArrivalView())); + }, + )); case WorkOrderNextStepEnum.verifyAssetDetail: return footerContainer( context: context, child: AppFilledButton( - label: context.translation.updateAssetDetails, - // maxWidth: true, - buttonColor: AppColor.primary10, - onPressed: () async { - Navigator.push(context, MaterialPageRoute(builder: (context) => VerifyAssetDetails(isEdit: false))); - }, - )); + label: context.translation.updateAssetDetails, + // maxWidth: true, + buttonColor: AppColor.primary10, + onPressed: () async { + Navigator.push(context, MaterialPageRoute(builder: (context) => VerifyAssetDetails(isEdit: false))); + }, + )); case WorkOrderNextStepEnum.activity: return footerContainer( context: context, child: Column( - children: [ - AppFilledButton( - label: context.translation.activities, - textColor: context.isDark ? AppColor.black10 : Colors.white, - buttonColor: context.isDark? AppColor.primary10:AppColor.neutral50, - onPressed: () async { - // ServiceRequestBottomSheet.activityTypeBottomSheet(context: context); - Navigator.push(context, MaterialPageRoute(builder: (context) => const ActivitiesListView())); - }, - ), - if (showMarkAsFixedButton) ...[ - 8.height, - AppFilledButton( - label: context.translation.markAsCompleted, - // maxWidth: true, - buttonColor: AppColor.green70, - onPressed: () { - bool isValid = ServiceRequestBottomSheet.validateAssetSituation(Provider.of(context, listen: false)); - if (isValid) { - showDialog( - context: context, - builder: (BuildContext cxt) => AcknowledgeWorkDialog( - message: "Are you sure you want to mark this Work Order as complete ", - confirmButtonText: 'Complete', - cancelButtonText: 'Cancel', - onSave: () async { - int status = await requestDetailProvider.engineerMarkAsFixed(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, feedback: ''); - if (status != -1) { - Navigator.of(cxt).pop(); - } - }, - onDiscard: () {}, - ), - ); - } - // ServiceRequestBottomSheet.feedBackBottomSheet(context: context); - }, - ), - ] - ], - )); + children: [ + AppFilledButton( + label: context.translation.activities, + textColor: context.isDark ? AppColor.black10 : Colors.white, + buttonColor: context.isDark ? AppColor.primary10 : AppColor.neutral50, + onPressed: () async { + // ServiceRequestBottomSheet.activityTypeBottomSheet(context: context); + Navigator.push(context, MaterialPageRoute(builder: (context) => const ActivitiesListView())); + }, + ), + if (showMarkAsFixedButton) ...[ + 8.height, + AppFilledButton( + label: context.translation.markAsCompleted, + // maxWidth: true, + buttonColor: AppColor.green70, + onPressed: () { + bool isValid = ServiceRequestBottomSheet.validateAssetSituation(Provider.of(context, listen: false)); + if (isValid) { + showDialog( + context: context, + builder: (BuildContext cxt) => AcknowledgeWorkDialog( + message: "Are you sure you want to mark this Work Order as complete ", + confirmButtonText: 'Complete', + cancelButtonText: 'Cancel', + onSave: () async { + int status = await requestDetailProvider.engineerMarkAsFixed(workOrderId: requestDetailProvider.currentWorkOrder!.data!.requestId!, feedback: ''); + if (status != -1) { + Navigator.of(cxt).pop(); + } + }, + onDiscard: () {}, + ), + ); + } + // ServiceRequestBottomSheet.feedBackBottomSheet(context: context); + }, + ), + ] + ], + )); case WorkOrderNextStepEnum.endWorkFlow: return const SizedBox(); @@ -252,60 +252,60 @@ class FooterActionButton { return footerContainer( context: context, child: AppFilledButton( - label: context.translation.assetRetiredPendingOpManagementApproval, - buttonColor: AppColor.background(context), - textColor: context.isDark ? Colors.white: AppColor.neutral150, - fontSize: 12.toScreenWidth, - )); + label: context.translation.assetRetiredPendingOpManagementApproval, + buttonColor: AppColor.background(context), + textColor: context.isDark ? Colors.white : AppColor.neutral150, + fontSize: 12.toScreenWidth, + )); case WorkOrderNextStepEnum.waitingForRequesterToConfirm: return footerContainer( context: context, child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AppFilledButton( - label: 'Waiting for requester to verify', - buttonColor: AppColor.background(context), - textColor: context.isDark ? Colors.white: AppColor.neutral150, - // buttonColor: AppColor.neutral140, - // textColor: AppColor.neutral150, - fontSize: 12.toScreenWidth, - ), - 12.height, - Row( + mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Icon(Icons.info_outline_rounded, size: 16, color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), - 6.width, - Text( - "If you're experiencing issues with verification, please select another method to continue", - style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), - ).expanded, + AppFilledButton( + label: 'Waiting for requester to verify', + buttonColor: AppColor.background(context), + textColor: context.isDark ? Colors.white : AppColor.neutral150, + // buttonColor: AppColor.neutral140, + // textColor: AppColor.neutral150, + fontSize: 12.toScreenWidth, + ), + 12.height, + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Icon(Icons.info_outline_rounded, size: 16, color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), + 6.width, + Text( + "If you're experiencing issues with verification, please select another method to continue", + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), + ).expanded, + ], + ), + 12.height, + AppFilledButton( + label: "Switch Arrival Method", + showIcon: true, + buttonColor: AppColor.green70, + onPressed: () { + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + Provider.of(context, listen: false).switchToIHaveArrived().then((value) { + Navigator.pop(context); + if (value) { + Navigator.push(context, MaterialPageRoute(builder: (context) => const VerifyArrivalView())); + } else { + "Failed to switch, please try again".showToast; + } + }); + }, + ) ], - ), - 12.height, - AppFilledButton( - label: "Switch Arrival Method", - showIcon: true, - buttonColor: AppColor.green70, - onPressed: () { - showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); - Provider.of(context, listen: false).switchToIHaveArrived().then((value) { - Navigator.pop(context); - if (value) { - Navigator.push(context, MaterialPageRoute(builder: (context) => const VerifyArrivalView())); - } else { - "Failed to switch, please try again".showToast; - } - }); - }, - ) - ], - )); + )); case WorkOrderNextStepEnum.eFixRemotely: return footerContainer( - context: context, + context: context, child: AppFilledButton( label: context.translation.fixedRemotely, maxWidth: true, @@ -320,40 +320,40 @@ class FooterActionButton { return footerContainer( context: context, child: AppFilledButton( - label: context.translation.needAVisit, - maxWidth: true, + label: context.translation.needAVisit, + maxWidth: true, textColor: context.isDark ? AppColor.neutral30 : Colors.white, - buttonColor: AppColor.neutral50, - onPressed: () async { - requestDetailProvider.needVisitHelperModel = NeedVisitHelperModel(); - ServiceRequestBottomSheet.initialVisitBottomSheet(context: context); - }, - )); + buttonColor: AppColor.neutral50, + onPressed: () async { + requestDetailProvider.needVisitHelperModel = NeedVisitHelperModel(); + ServiceRequestBottomSheet.initialVisitBottomSheet(context: context); + }, + )); } } else { if (workOrderNextStepStatus == WorkOrderNextStepEnum.nTakeAction) { return footerContainer( - context: context, + context: context, child: AppFilledButton( - label: context.translation.takeAction, - // maxWidth: true, - buttonColor: AppColor.primary10, - onPressed: () async { - ServiceRequestBottomSheet.nurseTakeActionBottomSheet(context: context); - }, - )); + label: context.translation.takeAction, + // maxWidth: true, + buttonColor: AppColor.primary10, + onPressed: () async { + ServiceRequestBottomSheet.nurseTakeActionBottomSheet(context: context); + }, + )); } if (workOrderNextStepStatus == WorkOrderNextStepEnum.waitingForRequesterToConfirm) { return footerContainer( - context: context, + context: context, child: AppFilledButton( - label: context.translation.takeAction, - // maxWidth: true, - buttonColor: AppColor.primary10, - onPressed: () async { - ServiceRequestBottomSheet.nurseVerifyArrivalBottomSheet(context: context); - }, - )); + label: context.translation.takeAction, + // maxWidth: true, + buttonColor: AppColor.primary10, + onPressed: () async { + ServiceRequestBottomSheet.nurseVerifyArrivalBottomSheet(context: context); + }, + )); } } return const SizedBox(); diff --git a/lib/modules/cm_module/views/components/history_log_view.dart b/lib/modules/cm_module/views/components/history_log_view.dart index ddcf5c0d..0066d51e 100644 --- a/lib/modules/cm_module/views/components/history_log_view.dart +++ b/lib/modules/cm_module/views/components/history_log_view.dart @@ -14,7 +14,6 @@ import 'package:test_sa/modules/cm_module/service_request_detail_provider.dart'; import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; - import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; @@ -41,58 +40,60 @@ class HistoryLogView extends StatelessWidget { endIndent: 10, ), ), - Builder(builder: (cxt) { - List items = []; - String lastStatus = ""; - DateTime? nextDate; - var workOrderHistory = requestProvider.currentWorkOrder!.data!.workOrderHistory; - bool isNurse = (Provider.of(context, listen: false).user?.type) == UsersTypes.normal_user; - if(isNurse) { - workOrderHistory.removeWhere((element)=>element.step?.id==5617); - } - for (int i = 0; i < workOrderHistory.length; i++) { - var object = workOrderHistory[i]; - String currentStatus = object.workorderStatus!.name!; - if (lastStatus.isEmpty) { - lastStatus = currentStatus; + SafeArea( + child: Builder(builder: (cxt) { + List items = []; + String lastStatus = ""; + DateTime? nextDate; + var workOrderHistory = requestProvider.currentWorkOrder!.data!.workOrderHistory; + bool isNurse = (Provider.of(context, listen: false).user?.type) == UsersTypes.normal_user; + if (isNurse) { + workOrderHistory.removeWhere((element) => element.step?.id == 5617); } - if (lastStatus == currentStatus) { - if (i + 1 < workOrderHistory.length) { - nextDate = workOrderHistory[i + 1].date; - String timeDifference = ServiceRequestUtils.calculateTimeDifference(object.date!, nextDate!); - object.timeDifference = timeDifference; - } else { - object.timeDifference = ''; // Empty string for the last action + for (int i = 0; i < workOrderHistory.length; i++) { + var object = workOrderHistory[i]; + String currentStatus = object.workorderStatus!.name!; + if (lastStatus.isEmpty) { + lastStatus = currentStatus; } - items.add(historyLogCard(cxt, object)); - } else { - items.add(statusCard(cxt, lastStatus)); - lastStatus = currentStatus; - if (i + 1 < workOrderHistory.length) { - nextDate = workOrderHistory[i + 1].date; - String timeDifference = ServiceRequestUtils.calculateTimeDifference(object.date!, nextDate!); - object.timeDifference = timeDifference; + if (lastStatus == currentStatus) { + if (i + 1 < workOrderHistory.length) { + nextDate = workOrderHistory[i + 1].date; + String timeDifference = ServiceRequestUtils.calculateTimeDifference(object.date!, nextDate!); + object.timeDifference = timeDifference; + } else { + object.timeDifference = ''; // Empty string for the last action + } + items.add(historyLogCard(cxt, object)); } else { - object.timeDifference = ''; // Empty string for the last action + items.add(statusCard(cxt, lastStatus)); + lastStatus = currentStatus; + if (i + 1 < workOrderHistory.length) { + nextDate = workOrderHistory[i + 1].date; + String timeDifference = ServiceRequestUtils.calculateTimeDifference(object.date!, nextDate!); + object.timeDifference = timeDifference; + } else { + object.timeDifference = ''; // Empty string for the last action + } + items.add(historyLogCard(cxt, object)); } - items.add(historyLogCard(cxt, object)); } - } - items.add(statusCard(cxt, lastStatus)); - return SingleChildScrollView( - padding: const EdgeInsets.all(16), - child: Column(children: items), - ); - }), + items.add(statusCard(cxt, lastStatus)); + return SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column(children: items), + ); + }), + ), ], )); }); } Widget historyLogCard(BuildContext context, WorkOrderHistory object) { - String title =object.step!.name!; + String title = object.step!.name!; - if(object.step!.value == 18 || object.step!.value == 27 || object.step!.value == 28) { + if (object.step!.value == 18 || object.step!.value == 27 || object.step!.value == 28) { title = object.activityStatus?.name ?? ""; } @@ -116,8 +117,7 @@ class HistoryLogView extends StatelessWidget { children: [ if (object.assetVerificationType?.value == 4 && object.photoVerfication != null) ...[ Padding( - padding: EdgeInsets.symmetric(vertical: 12.toScreenWidth), - + padding: EdgeInsets.symmetric(vertical: 12.toScreenWidth), child: InteractiveViewer(child: Image.network(URLs.getFileUrl(object.photoVerfication ?? '')!, height: 143.toScreenHeight)), ).onPress(() async { Navigator.of(context).push( @@ -138,7 +138,6 @@ class HistoryLogView extends StatelessWidget { ], title.bodyText(context).custom(color: AppColor.textColor(context)), object.timeDifference.isNotEmpty ? object.timeDifference.tinyFont(context).custom(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120) : const SizedBox(), - ], ), ), diff --git a/lib/views/widgets/fullscreen_dialogs/selection_fullscreen_dialog.dart b/lib/views/widgets/fullscreen_dialogs/selection_fullscreen_dialog.dart index fe95e5d0..ca25c673 100644 --- a/lib/views/widgets/fullscreen_dialogs/selection_fullscreen_dialog.dart +++ b/lib/views/widgets/fullscreen_dialogs/selection_fullscreen_dialog.dart @@ -167,7 +167,7 @@ class _SelectionBottomSheetState extends State