From a722635dfe0be5cbfc351c76f11d51211f6b5f92 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 6 May 2026 15:12:06 +0300 Subject: [PATCH] loan & cm item view ui changes --- .../pages/loan_equipment_item_view.dart | 65 ++++------------- .../requests/service_request_item_view.dart | 72 +++++-------------- .../widgets/item_views/info_date_widget.dart | 13 ++++ .../item_views/info_header_widget.dart | 12 ++++ .../widgets/item_views/info_text_widget.dart | 37 ++++++++++ .../widgets/requests/request_status.dart | 2 +- 6 files changed, 92 insertions(+), 109 deletions(-) create mode 100644 lib/views/widgets/item_views/info_date_widget.dart create mode 100644 lib/views/widgets/item_views/info_header_widget.dart create mode 100644 lib/views/widgets/item_views/info_text_widget.dart diff --git a/lib/modules/loan_module/pages/loan_equipment_item_view.dart b/lib/modules/loan_module/pages/loan_equipment_item_view.dart index 8b4fa64c..76adefe0 100644 --- a/lib/modules/loan_module/pages/loan_equipment_item_view.dart +++ b/lib/modules/loan_module/pages/loan_equipment_item_view.dart @@ -10,6 +10,9 @@ import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart'; import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/equipment_internal_audit_detail_page.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/views/widgets/item_views/info_date_widget.dart'; +import 'package:test_sa/views/widgets/item_views/info_header_widget.dart'; +import 'package:test_sa/views/widgets/item_views/info_text_widget.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'loan_equipment_detail_page.dart'; @@ -36,30 +39,12 @@ class LoanEquipmentItemView extends StatelessWidget { backgroundColor: AppColor.getRequestStatusColorByName(context, requestData!.statusName!), ), 1.width.expanded, - Text( - requestData!.transactionDate?.toServiceRequestCardFormat ?? "", - textAlign: TextAlign.end, - style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), - ), - ], - ), - 8.height, - (requestData?.typeTransaction ?? "Loan Request").heading5(context), - infoWidget(label: context.translation.requestType, value: requestData?.requestTypeName, context: context), - infoWidget(label: context.translation.requestNo, value: requestData?.requestNo, context: context), - // infoWidget(label: context.translation.site, value: requestData?., context: context), - 8.height, - Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - context.translation.viewDetails, - style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)), - ), - 4.width, - Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14) + InfoDateWidget(requestData!.transactionDate ?? ""), ], ), + InfoHeaderWidget(requestData?.typeTransaction ?? "Loan Request"), + InfoTextWidget(label: context.translation.requestType, value: requestData?.requestTypeName), + InfoTextWidget(label: context.translation.requestNo, value: requestData?.requestNo, showArrow: true), ], ).toShadowContainer(context, withShadow: showShadow).onPress(() async { Navigator.push(context, MaterialPageRoute(builder: (context) => LoanEquipmentDetailPage(loanId: requestDetails!.id!))); @@ -67,6 +52,7 @@ class LoanEquipmentItemView extends StatelessWidget { } return Column( crossAxisAlignment: CrossAxisAlignment.start, + spacing: 1, children: [ Row( crossAxisAlignment: CrossAxisAlignment.start, @@ -77,41 +63,16 @@ class LoanEquipmentItemView extends StatelessWidget { backgroundColor: AppColor.getRequestStatusColorByName(context, requestDetails?.status!), ), 1.width.expanded, - Text( - requestDetails!.date?.toServiceRequestCardFormat ?? "", - textAlign: TextAlign.end, - style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), - ), - ], - ), - 8.height, - (requestDetails?.nameOfType ?? "Loan Request").heading5(context), - 8.height, - infoWidget(label: context.translation.requestType, value: requestDetails!.requestType, context: context), - infoWidget(label: context.translation.requestNo, value: requestDetails!.requestNo, context: context), - infoWidget(label: context.translation.site, value: requestDetails!.site, context: context), - 8.height, - Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - context.translation.viewDetails, - style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)), - ), - 4.width, - Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14) + InfoDateWidget(requestDetails!.date ?? ""), ], ), + InfoHeaderWidget(requestDetails?.nameOfType ?? "Loan Request"), + InfoTextWidget(label: context.translation.requestType, value: requestDetails!.requestType), + InfoTextWidget(label: context.translation.requestNo, value: requestDetails!.requestNo), + InfoTextWidget(label: context.translation.site, value: requestDetails!.site, showArrow: true), ], ).toShadowContainer(context, withShadow: showShadow).onPress(() async { Navigator.push(context, MaterialPageRoute(builder: (context) => LoanEquipmentDetailPage(loanId: requestDetails!.id!))); }); } - - Widget infoWidget({required String label, String? value, required BuildContext context}) { - if (value != null && value.isNotEmpty) { - return '$label: $value'.bodyText(context); - } - return const SizedBox(); - } } diff --git a/lib/new_views/pages/land_page/requests/service_request_item_view.dart b/lib/new_views/pages/land_page/requests/service_request_item_view.dart index b24a01cc..d7ab5924 100644 --- a/lib/new_views/pages/land_page/requests/service_request_item_view.dart +++ b/lib/new_views/pages/land_page/requests/service_request_item_view.dart @@ -12,6 +12,9 @@ import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart'; import 'package:test_sa/modules/cm_module/cm_detail_page.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/views/widgets/item_views/info_date_widget.dart'; +import 'package:test_sa/views/widgets/item_views/info_header_widget.dart'; +import 'package:test_sa/views/widgets/item_views/info_text_widget.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; class ServiceRequestItemView extends StatelessWidget { @@ -46,39 +49,16 @@ class ServiceRequestItemView extends StatelessWidget { backgroundColor: AppColor.getHistoryLogStatusColorByName(requestData!.statusName!), ), 1.width.expanded, - Text(requestData!.transactionDate!.toServiceRequestCardFormat, - textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)), + InfoDateWidget(requestData!.transactionDate!), ], ), - 8.height, - (requestData?.typeTransaction ?? context.translation.correctiveMaintenance).heading5(context), - 8.height, - 'CM Number: ${requestData!.requestNo}'.bodyText(context), - '${context.translation.assetNumber}: ${requestData?.assetNumber}'.bodyText(context), - '${context.translation.assetName}: ${requestData?.assetName?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context), - // '${context.translation.assetNumber}: ${request.assetNo}'.bodyText(context), - // '${context.translation.requestType}: ${requestData!.requestTypeName}'.bodyText(context), - + InfoHeaderWidget(requestData?.typeTransaction ?? context.translation.correctiveMaintenance), + InfoTextWidget(label: "CM Number", value: requestData!.requestNo), + InfoTextWidget(label: context.translation.assetNumber, value: requestData!.assetNumber), + InfoTextWidget(label: context.translation.assetName, value: requestData?.assetName?.cleanupWhitespace.capitalizeFirstOfEach, showArrow: requestData?.statusName == 'Canceled' ? false : true), if (requestData?.statusName == 'Canceled') ...[ - '${context.translation.rejectionReason}: ${requestData?.rejectReason}'.bodyText(context), + InfoTextWidget(label: context.translation.rejectionReason, value: requestData?.rejectReason, showArrow: true), ], - 8.height, - Row( - // mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - context.translation.viewDetails, - style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)), - ), - 4.width, - Icon( - Icons.arrow_forward, - color: AppColor.blueStatus(context), - size: 14, - ) - ], - ), ], ).toShadowContainer(context, withShadow: showShadow).onPress(() async { await Navigator.of(context).push(MaterialPageRoute(builder: (_) => CMDetailPage(requestId: requestData!.id!, moduleId: requestData!.transactionNo!))); @@ -91,6 +71,7 @@ class ServiceRequestItemView extends StatelessWidget { return Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, + spacing: 1, children: [ Row( crossAxisAlignment: CrossAxisAlignment.start, @@ -109,35 +90,14 @@ class ServiceRequestItemView extends StatelessWidget { backgroundColor: AppColor.getRequestStatusColorByName(context, requestDetails!.status), ), 1.width.expanded, - Text(requestDetails!.date!.toServiceRequestCardFormat, textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50)), - ], - ), - 8.height, - (requestDetails!.nameOfType ?? context.translation.correctiveMaintenance).heading5(context), - 8.height, - - // '${context.translation.requestType}: ${requestDetails!.requestType}'.bodyText(context), - 'CM Number: ${requestDetails!.requestNo}'.bodyText(context), - '${context.translation.assetNumber}: ${requestDetails!.assetNo}'.bodyText(context), - '${context.translation.serialNo}: ${requestDetails!.assetSN}'.bodyText(context), - '${context.translation.assetName}: ${requestDetails!.assetName?.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context), - 8.height, - Row( - // mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - context.translation.viewDetails, - style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)), - ), - 4.width, - Icon( - Icons.arrow_forward, - color: AppColor.blueStatus(context), - size: 14, - ) + InfoDateWidget(requestDetails!.date!), ], ), + InfoHeaderWidget(requestDetails?.nameOfType ?? context.translation.correctiveMaintenance), + InfoTextWidget(label: "CM Number", value: requestDetails!.requestNo), + InfoTextWidget(label: context.translation.assetNumber, value: requestDetails!.assetNo), + InfoTextWidget(label: context.translation.serialNo, value: requestDetails!.assetSN, showEmptyValue: true), + InfoTextWidget(label: context.translation.assetName, value: requestDetails!.assetName?.cleanupWhitespace.capitalizeFirstOfEach, showArrow: true), ], ).toShadowContainer(context, withShadow: showShadow).onPress(() { Navigator.of(context).push(MaterialPageRoute(builder: (_) => CMDetailPage(requestId: requestDetails!.id!, moduleId: requestDetails!.transactionType!))); diff --git a/lib/views/widgets/item_views/info_date_widget.dart b/lib/views/widgets/item_views/info_date_widget.dart new file mode 100644 index 00000000..764f289e --- /dev/null +++ b/lib/views/widgets/item_views/info_date_widget.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/extensions/string_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; + +class InfoDateWidget extends StatelessWidget { + final String date; + + InfoDateWidget(this.date, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) => Text(date.toServiceRequestCardFormat, textAlign: TextAlign.end, style: AppTextStyles.tinyFont2.copyWith(color: AppColor.text9Color(context))); +} diff --git a/lib/views/widgets/item_views/info_header_widget.dart b/lib/views/widgets/item_views/info_header_widget.dart new file mode 100644 index 00000000..72dfc7df --- /dev/null +++ b/lib/views/widgets/item_views/info_header_widget.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; + +class InfoHeaderWidget extends StatelessWidget { + final String label; + + InfoHeaderWidget(this.label, {Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) => Text(label, style: AppTextStyles.bodyText.copyWith(color: AppColor.textStyleColor(context))); +} diff --git a/lib/views/widgets/item_views/info_text_widget.dart b/lib/views/widgets/item_views/info_text_widget.dart new file mode 100644 index 00000000..846b1052 --- /dev/null +++ b/lib/views/widgets/item_views/info_text_widget.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.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'; + +class InfoTextWidget extends StatelessWidget { + String? value; + final String label; + final bool showEmptyValue; + final bool showArrow; + + InfoTextWidget({required this.label, this.value, this.showEmptyValue = false, this.showArrow = false, Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Widget text; + if (showEmptyValue) { + text = Text('$label: ${value ?? ""}', style: AppTextStyles.bodyText2.copyWith(color: AppColor.lightTextColor(context))); + } else if (value?.isNotEmpty ?? false) { + text = Text('$label: $value', style: AppTextStyles.bodyText2.copyWith(color: AppColor.lightTextColor(context))); + } else { + text = const SizedBox(); + } + if (showArrow) { + text = Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + text.expanded, + const SizedBox(width: 4), + "arrow_right".toSvgAsset(width: 17, color: AppColor.primary10), + ], + ); + } + return text; + } +} diff --git a/lib/views/widgets/requests/request_status.dart b/lib/views/widgets/requests/request_status.dart index ab7a40e5..01d70727 100644 --- a/lib/views/widgets/requests/request_status.dart +++ b/lib/views/widgets/requests/request_status.dart @@ -28,7 +28,7 @@ class StatusLabel extends StatelessWidget { if (label?.toLowerCase() == 'Waiting for quotation'.toLowerCase()) label = context.translation.waitingForQuotation; return Container( - padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 10), + padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), alignment: labelInCenter ? Alignment.center : null, decoration: ShapeDecoration( color: backgroundColor,