From 8a5478f37f07745e07138000b0607787040904af Mon Sep 17 00:00:00 2001 From: WaseemAbbasi22 Date: Thu, 23 Jan 2025 11:06:23 +0300 Subject: [PATCH] initial commit --- lib/extensions/widget_extensions.dart | 4 +- lib/l10n/app_ar.arb | 7 +- lib/l10n/app_en.arb | 7 +- .../common_widgets/app_text_form_field.dart | 2 +- .../maintenance_request_main.dart | 2 - .../pages/user/ppm/ppm_details_page.dart | 6 +- .../components/asset_info_widget.dart | 116 ++++++++++++++++++ .../recurrent_work_order_view.dart | 101 +++++++++++++++ lib/views/widgets/timer/app_timer.dart | 4 +- 9 files changed, 239 insertions(+), 10 deletions(-) create mode 100644 lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/asset_info_widget.dart create mode 100644 lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/recurrent_work_order_view.dart diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index 1c9b9160..0586f01a 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -81,13 +81,13 @@ extension WidgetExtensions on Widget { ).toShadowContainer(context) : this; - Widget toShadowContainer(BuildContext context, {bool showShadow = true, bool withShadow = true, Color? backgroundColor, double padding = 16, EdgeInsets? paddingObject}) => withShadow + Widget toShadowContainer(BuildContext context, {bool showShadow = true,double borderRadius = 14, bool withShadow = true, Color? backgroundColor, double padding = 16, EdgeInsets? paddingObject}) => withShadow ? Container( padding: paddingObject ?? EdgeInsets.all(padding), width: double.infinity, decoration: ShapeDecoration( color: backgroundColor ?? AppColor.background(context), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(borderRadius)), shadows: showShadow ? [boxShadowR14] : null, ), child: this, diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 8ce8856c..881d3054 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -526,5 +526,10 @@ "userName": "اسم المستخدم", "siteName": "اسم الموقع", "pointName": "اسم النقطة", - "checkIn": "تسجيل الدخول" + "checkIn": "تسجيل الدخول", + "pmWo": "أمر العمل الوقائي", + "recurrentWo": "أمر العمل المتكرر", + "taskNo": "رقم المهمة", + "assignEngineer": "تعيين مهندس", + "scheduledDate": "التاريخ المجدول" } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 74f488b9..7d89a8ba 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -530,5 +530,10 @@ "userName": "User Name", "siteName": "Site Name", "pointName": "Point Name", - "checkIn": "Check in" + "checkIn": "Check in", + "pmWo": "PM WO", + "recurrentWo": "Recurrent WO", + "taskNo": "Task No", + "assignEngineer": "Assign Engineer", + "scheduledDate": "Scheduled Date" } \ No newline at end of file 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 dd8bc5f7..9f11bf6d 100644 --- a/lib/new_views/common_widgets/app_text_form_field.dart +++ b/lib/new_views/common_widgets/app_text_form_field.dart @@ -183,7 +183,7 @@ class _AppTextFormFieldState extends State { controller: widget.controller, textInputAction: widget.textInputType == TextInputType.multiline ? null : widget.textInputAction ?? TextInputAction.next, onEditingComplete: widget.onAction ?? () => FocusScope.of(context).nextFocus(), - style: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500), + style:widget.style?? AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500), onTap: widget.onTap, decoration: InputDecoration( alignLabelWithHint: widget.alignLabelWithHint, diff --git a/lib/service_request_latest/views/forms/maintenance_request/maintenance_request_main.dart b/lib/service_request_latest/views/forms/maintenance_request/maintenance_request_main.dart index 2f03666a..3cc8a907 100644 --- a/lib/service_request_latest/views/forms/maintenance_request/maintenance_request_main.dart +++ b/lib/service_request_latest/views/forms/maintenance_request/maintenance_request_main.dart @@ -101,14 +101,12 @@ class _MaintenanceRequestFormState extends State with Si if (validate(model: requestDetailProvider.activityMaintenanceHelperModel!)) { - print('value of timer is ${requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimerModel.toString()}'); ActivityMaintenanceTimers model = ActivityMaintenanceTimers( id: 0, startTime: requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimerModel?.startAt!.toIso8601String(), // Handle potential null endTime: requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimerModel?.endAt?.toIso8601String(), // Handle potential null workingHours: ((requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimerModel?.durationInSecond ?? 0) / 60 / 60), ); - print('model i got is ${model.toJson()}'); requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimers =requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimers??[]; requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimers?.add( ActivityMaintenanceTimers( diff --git a/lib/views/pages/user/ppm/ppm_details_page.dart b/lib/views/pages/user/ppm/ppm_details_page.dart index ed12998b..e537ab92 100644 --- a/lib/views/pages/user/ppm/ppm_details_page.dart +++ b/lib/views/pages/user/ppm/ppm_details_page.dart @@ -8,6 +8,7 @@ import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; +import 'package:test_sa/views/pages/user/ppm/ppm_work_order/recurrent_wo/recurrent_work_order_view.dart'; import 'package:test_sa/views/pages/user/ppm/update_ppm/edit_ppm.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; @@ -108,8 +109,9 @@ class _PpmDetailsPageState extends State { if (userProvider!.user!.type == UsersTypes.engineer && (ppm.visitStatusId != 270 && ppm.visitStatusId != 269)) AppFilledButton( onPressed: () async { - await Navigator.of(context).push(MaterialPageRoute(builder: (_) => EditPpm(ppm: ppm, details: widget.request))); - setState(() {}); + //TODO remove after testing.. + await Navigator.of(context).push(MaterialPageRoute(builder: (_) => RecurrentWorkOrderView( request: widget.request))); + // setState(() {}); }, label: context.translation.updateRequest, ).paddingAll(16) diff --git a/lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/asset_info_widget.dart b/lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/asset_info_widget.dart new file mode 100644 index 00000000..4ab4aa28 --- /dev/null +++ b/lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/asset_info_widget.dart @@ -0,0 +1,116 @@ +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/extensions/widget_extensions.dart'; +import 'package:test_sa/models/all_requests_and_count_model.dart'; +import 'package:test_sa/models/ppm/ppm.dart'; +import 'package:test_sa/models/timer_model.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/service_request_latest/utilities/service_request_utils.dart'; +import 'package:test_sa/views/widgets/requests/request_status.dart'; +import 'package:test_sa/views/widgets/timer/app_timer.dart'; + +class AssetInfoWidget extends StatelessWidget { + DummyModel ?model; + AssetInfoWidget({super.key,DummyModel ?model}); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (model?.request?.priority != null) + StatusLabel( + label: model?.request?.priority, + textColor: AppColor.getRequestStatusTextColorByName(context,model?.request?.priority), + backgroundColor: AppColor.getRequestStatusColorByName(context,model?.request?.priority), + ), + 8.height, + + model!.ppm!.assetName!.heading5(context), + 8.height, + '${context.translation.taskNo}: ${model!.ppm!.assetName}'.bodyText(context), + '${context.translation.site}: ${model!.ppm!.siteName!.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText(context), + '${context.translation.assignEngineer}: ${model!.ppm!.assignedEmployeeName ?? ""}'.bodyText(context), + '${context.translation.scheduledDate}: ${'July 7, 2024' ?? ""}'.bodyText(context), + ], + ).toShadowContainer(context), + 12.height, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildingInfoWidget(label: context.translation.department, value: model!.ppm!.departmentName!.cleanupWhitespace.capitalizeFirstOfEach,context: context), + 8.height, + buildingInfoWidget(label: context.translation.floor, value: model!.ppm!.floorName!.cleanupWhitespace.capitalizeFirstOfEach,context: context), + 8.height, + buildingInfoWidget(label: context.translation.room, value: model!.ppm!.roomName!.cleanupWhitespace.capitalizeFirstOfEach,context: context), + 8.height, + AppTimer( + label: context.translation.timer, + timer: model!.timerModel, + width:double.infinity, + enabled: model!.timerModel?.endAt == null, + decoration: BoxDecoration( + color: AppColor.neutral100, + borderRadius: BorderRadius.circular(10), + ), + timerProgress: (isRunning) {}, + onChange: (timer) async { + timer = timer; + return true; + }, + ), + // if (totalWorkingHours > 0.0) ...[ + 11.height, + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + "Total Working Time: ", + style: Theme.of(context).textTheme.bodySmall?.copyWith(color: context.isDark ? null : AppColor.neutral20, fontWeight: FontWeight.w500), + ), + Text( + " ${ServiceRequestUtils.formatTimerDuration(model!.totalWorkingHours.round())}", + style: Theme.of(context).textTheme.bodyMedium, + ), + ], + ), + 8.height, + ], + // ], + ).toShadowContainer(context,padding: 12), + ], + ); + } + + Widget buildingInfoWidget({required String label, required String value, required BuildContext context}) { + return Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label, + style: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.neutral120), + ), + 3.height, + Text( + value, + style: AppTextStyles.bodyText2.copyWith(color: AppColor.black10), + ) + ], + ).toShadowContainer(context, backgroundColor: AppColor.neutral100, borderRadius: 10, paddingObject: EdgeInsets.all(12.toScreenHeight), showShadow: false); + } +} + +class DummyModel{ + RequestsDetails? request; + Ppm? ppm; + TimerModel? timerModel = TimerModel(); + double totalWorkingHours = 2; + + DummyModel(this.request,this.ppm,this.timerModel,this.totalWorkingHours); +} diff --git a/lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/recurrent_work_order_view.dart b/lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/recurrent_work_order_view.dart new file mode 100644 index 00000000..59ac680f --- /dev/null +++ b/lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/recurrent_work_order_view.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/ppm_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.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/extensions/widget_extensions.dart'; +import 'package:test_sa/models/all_requests_and_count_model.dart'; +import 'package:test_sa/models/enums/user_types.dart'; +import 'package:test_sa/models/ppm/ppm.dart'; +import 'package:test_sa/models/timer_model.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; +import 'package:test_sa/service_request_latest/utilities/service_request_utils.dart'; +import 'package:test_sa/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/asset_info_widget.dart'; +import 'package:test_sa/views/widgets/loaders/app_loading.dart'; +import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; +import 'package:test_sa/views/widgets/requests/request_status.dart'; +import 'package:test_sa/views/widgets/timer/app_timer.dart'; + +class RecurrentWorkOrderView extends StatefulWidget { + static const String id = "/visit-details"; + final RequestsDetails request; + + const RecurrentWorkOrderView({Key? key, required this.request}) : super(key: key); + + @override + _RecurrentWorkOrderViewState createState() { + return _RecurrentWorkOrderViewState(); + } +} + +class _RecurrentWorkOrderViewState extends State { + UserProvider? userProvider; + TimerModel? timerModel = TimerModel(); + PpmProvider? ppmProvider; + + // double totalWorkingHours = _requestDetailProvider?.activityMaintenanceHelperModel?.activityMaintenanceTimers?.fold(0.0, (sum, item) => (sum ?? 0) + DateTime.parse(item.endTime!).difference(DateTime.parse(item.startTime!)).inSeconds) ?? 0; + double totalWorkingHours = 2.0; + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + userProvider ??= Provider.of(context, listen: false); + ppmProvider ??= Provider.of(context, listen: false); + + return Scaffold( + appBar: DefaultAppBar(title: context.translation.recurrentWo), + body: SafeArea( + child: FutureBuilder( + future: ppmProvider!.getPpmById(widget.request.id!), + builder: (context, snap) { + if (snap.connectionState == ConnectionState.waiting) { + return const ALoading(); + } else if (snap.hasData) { + Ppm ppm = snap.data as Ppm; + return Column(children: [ + AssetInfoWidget(model: DummyModel(widget.request, ppm, timerModel, totalWorkingHours)), + ]).paddingAll(12); + } + return NoDataFound(message: context.translation.noDataFound); + }), + ), + ); + } + + +} + +class RoomTabs { + String label; + int tag; + int id; + + RoomTabs({ + required this.label, + required this.tag, + required this.id, + }); + + static List getTabs({required UsersTypes userType, required BuildContext context}) { + List tabs = []; + + tabs.add(RoomTabs(label: 'Upcoming', tag: 0, id: 0)); + tabs.add(RoomTabs(label: 'UnAssigned Open', tag: 1, id: 1)); + tabs.add(RoomTabs(label: 'Assigned Open', tag: 1, id: 2)); + tabs.add(RoomTabs(label: 'In Progress', tag: 2, id: 3)); + tabs.add(RoomTabs(label: 'Completed', tag: 3, id: 4)); + return tabs; + } +} diff --git a/lib/views/widgets/timer/app_timer.dart b/lib/views/widgets/timer/app_timer.dart index 06c627b2..85cf14d3 100644 --- a/lib/views/widgets/timer/app_timer.dart +++ b/lib/views/widgets/timer/app_timer.dart @@ -17,6 +17,7 @@ class AppTimer extends StatefulWidget { final BoxDecoration? decoration; final bool enabled; final String? label; + final double ?width; final Function(bool)? timerProgress; @@ -27,6 +28,7 @@ class AppTimer extends StatefulWidget { this.onChange, this.style, this.decoration, + this.width, this.timerProgress, this.enabled = true, }) : super(key: key); @@ -113,7 +115,7 @@ class _AppTimerState extends State { @override Widget build(BuildContext context) { return Container( - width: 100 * AppStyle.getScaleFactor(context), + width: widget.width??100 * AppStyle.getScaleFactor(context), height: 56.toScreenHeight, padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth), decoration: widget.decoration ??