From ed1337e16db7d1578178b9e64ffc93f3c39fbb86 Mon Sep 17 00:00:00 2001 From: WaseemAbbasi22 Date: Thu, 30 Jan 2025 10:25:24 +0300 Subject: [PATCH] recurrent task ui complete --- lib/l10n/app_ar.arb | 3 +- lib/l10n/app_en.arb | 3 +- .../views/nurse/create_new_request_view.dart | 2 - .../pages/user/ppm/ppm_details_page.dart | 4 +- .../components/asset_info_widget.dart | 22 ++- .../recurrent_wo/components/dummy_data.dart | 184 ++++++++++++++++++ .../components/room_inspection_card.dart | 81 ++++++++ .../components/room_tabs_widget.dart | 88 +++++++++ .../recurrent_work_order_view.dart | 86 +++++--- 9 files changed, 436 insertions(+), 37 deletions(-) create mode 100644 lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/dummy_data.dart create mode 100644 lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/room_inspection_card.dart create mode 100644 lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/room_tabs_widget.dart diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 881d3054..51742453 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -531,5 +531,6 @@ "recurrentWo": "أمر العمل المتكرر", "taskNo": "رقم المهمة", "assignEngineer": "تعيين مهندس", - "scheduledDate": "التاريخ المجدول" + "scheduledDate": "التاريخ المجدول", + "complete": "اكتمل" } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 7d89a8ba..fcee617c 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -535,5 +535,6 @@ "recurrentWo": "Recurrent WO", "taskNo": "Task No", "assignEngineer": "Assign Engineer", - "scheduledDate": "Scheduled Date" + "scheduledDate": "Scheduled Date", + "complete": "Complete" } \ No newline at end of file diff --git a/lib/service_request_latest/views/nurse/create_new_request_view.dart b/lib/service_request_latest/views/nurse/create_new_request_view.dart index 58e06fe1..1015199d 100644 --- a/lib/service_request_latest/views/nurse/create_new_request_view.dart +++ b/lib/service_request_latest/views/nurse/create_new_request_view.dart @@ -329,8 +329,6 @@ class _CreateNewRequestState extends State with TickerProvider _serviceRequest.requestedThrough = Provider.of(context, listen: false).items.firstWhere((element) => element.value == 3, orElse: null); _serviceRequest.type = Provider.of(context, listen: false).items.firstWhere((element) => element.value == 1, orElse: null); - - print('comments value is ${_serviceRequest.callComments}'); if (_formKey.currentState!.validate() && await _serviceRequest.validateNewRequest(context)) { _formKey.currentState!.save(); diff --git a/lib/views/pages/user/ppm/ppm_details_page.dart b/lib/views/pages/user/ppm/ppm_details_page.dart index 9ac652d9..9496b7bc 100644 --- a/lib/views/pages/user/ppm/ppm_details_page.dart +++ b/lib/views/pages/user/ppm/ppm_details_page.dart @@ -110,8 +110,8 @@ class _PpmDetailsPageState extends State { AppFilledButton( onPressed: () async { //TODO remove after testing.. - // await Navigator.of(context).push(MaterialPageRoute(builder: (_) => RecurrentWorkOrderView( request: widget.request))); - await Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdatePpm(ppm: ppm, details: widget.request))); + await Navigator.of(context).push(MaterialPageRoute(builder: (_) => RecurrentWorkOrderView( request: widget.request))); + // await Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdatePpm(ppm: ppm, details: widget.request))); setState(() {}); }, label: context.translation.updateRequest, 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 index 4ab4aa28..a50c8b81 100644 --- 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 @@ -12,14 +12,18 @@ 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}); + + final DummyModel? model; // Use `final` since it's a StatelessWidget + + AssetInfoWidget({super.key, required this.model}); @override Widget build(BuildContext context) { return Column( + mainAxisSize: MainAxisSize.min, children: [ Column( + mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ if (model?.request?.priority != null) @@ -30,16 +34,17 @@ class AssetInfoWidget extends StatelessWidget { ), 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), + model!.ppm!.assetName!.bodyText(context).custom(color:AppColor.black10 ), + 2.height, + '${context.translation.taskNo}: ${model!.ppm!.assetName}'.bodyText2(context).custom(color: AppColor.neutral120), + '${context.translation.site}: ${model!.ppm!.siteName!.cleanupWhitespace.capitalizeFirstOfEach}'.bodyText2(context).custom(color: AppColor.neutral120), + '${context.translation.assignEngineer}: ${model!.ppm!.assignedEmployeeName ?? ""}'.bodyText2(context).custom(color: AppColor.neutral120), + '${context.translation.scheduledDate}: ${'July 7, 2024' ?? ""}'.bodyText2(context).custom(color: AppColor.neutral120), ], ).toShadowContainer(context), 12.height, Column( + mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ buildingInfoWidget(label: context.translation.department, value: model!.ppm!.departmentName!.cleanupWhitespace.capitalizeFirstOfEach,context: context), @@ -91,6 +96,7 @@ class AssetInfoWidget extends StatelessWidget { return Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, children: [ Text( label, diff --git a/lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/dummy_data.dart b/lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/dummy_data.dart new file mode 100644 index 00000000..51b3e6bb --- /dev/null +++ b/lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/dummy_data.dart @@ -0,0 +1,184 @@ +class DummyData { + static List> roomData = [ + { + "name": "Room 1", + "cards": [ + { + "title": "General Inspection", + "info": [ + { + "label": "Room Temperature (15-35 C)", + "value": true + }, + { + "label": "Room Humidity <35%", + "value": true + }, + { + "label": "Valve value", + "value": false + }, + { + "label": "Alarm Check", + "value": true + }, + { + "label": "Overall Result", + "value": true + } + ] + }, + { + "title": "Manifold", + "info": [ + { + "label": "Room Temperature (15-35 C)", + "value": true + }, + { + "label": "Room Humidity <35%", + "value": true + }, + { + "label": "Valve value", + "value": false + }, + { + "label": "Alarm Check", + "value": true + } + ] + } + ] + }, + { + "name": "Room 2", + "cards": [ + { + "title": "General Inspection", + "info": [ + { + "label": "Room Temperature (15-35 C)", + "value": true + }, + { + "label": "Room Humidity <35%", + "value": true + }, + { + "label": "Valve value", + "value": true + }, + { + "label": "Alarm Check", + "value": true + }, + { + "label": "Overall Result", + "value": true + } + ] + } + ] + }, + { + "name": "Room 3", + "cards": [ + { + "title": "General Inspection", + "info": [ + { + "label": "Room Temperature (15-35 C)", + "value": false + }, + { + "label": "Room Humidity <35%", + "value": false + }, + { + "label": "Valve value", + "value": true + }, + { + "label": "Alarm Check", + "value": true + }, + { + "label": "Overall Result", + "value": false + } + ] + } + ] + }, + { + "name": "Room 4", + "cards": [ + { + "title": "General Inspection", + "info": [ + { + "label": "Room Temperature (15-35 C)", + "value": false + }, + { + "label": "Room Humidity <35%", + "value": false + }, + { + "label": "Valve value", + "value": true + }, + { + "label": "Alarm Check", + "value": true + }, + { + "label": "Overall Result", + "value": false + } + ] + }, + { + "title": "General Inspection", + "info": [ + { + "label": "Room Temperature (15-35 C)", + "value": false + }, + { + "label": "Room Humidity <35%", + "value": false + }, + { + "label": "Valve value", + "value": true + }, + { + "label": "Alarm Check", + "value": true + }, + ] + }, + { + "title": "General Inspection", + "info": [ + { + "label": "Room Temperature (15-35 C)", + "value": false + }, + { + "label": "Room Humidity <35%", + "value": false + }, + { + "label": "Valve value", + "value": true + }, + ] + } + + ] + } + ]; +} diff --git a/lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/room_inspection_card.dart b/lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/room_inspection_card.dart new file mode 100644 index 00000000..855021d9 --- /dev/null +++ b/lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/room_inspection_card.dart @@ -0,0 +1,81 @@ +import 'package:flutter/cupertino.dart'; +import 'package:test_sa/dashboard_latest/dashboard_view.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 RoomInspectionCard extends StatefulWidget { + final Map? inspectionModel; + + RoomInspectionCard({super.key, required this.inspectionModel}); + + @override + State createState() => _RoomInspectionCardState(); +} + +class _RoomInspectionCardState extends State { + late List inspectionValues; // Add a list to store the state of switches + + @override + void initState() { + super.initState(); + inspectionValues = widget.inspectionModel?['info'] + ?.map((inspectionType) => inspectionType['value'] as bool) + .toList() ?? + []; + } + + @override + Widget build(BuildContext context) { + return Column( + children: widget.inspectionModel?['info'] + ?.asMap() + .entries + .map((entry) => inspectionStatusRadioWidget( + index: entry.key, + label: entry.value['label'], + context: context, + )) + .toList() ?? + [], + ).toShadowContainer(context).paddingOnly(top: 12); + } + + Widget inspectionStatusRadioWidget({ + required int index, + required String label, + required BuildContext context, + }) { + String status = inspectionValues[index] ? 'Pass' : 'Fail'; + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + label + .bodyText2(context) + .custom(color: AppColor.white936, fontWeight: FontWeight.w500), + status + .bodyText2(context) + .custom(color: AppColor.neutral120, fontWeight: FontWeight.w500), + ], + ), + CupertinoSwitch( + thumbColor: + inspectionValues[index] ? AppColor.green50 : AppColor.red30, + activeColor: inspectionValues[index] + ? AppColor.green50.withOpacity(0.25) + : AppColor.red30.withOpacity(0.25), + value: inspectionValues[index], + onChanged: (state) { + setState(() { + inspectionValues[index] = state; + }); + }, + ), + ], + ).paddingOnly(bottom: 12); + } +} + diff --git a/lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/room_tabs_widget.dart b/lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/room_tabs_widget.dart new file mode 100644 index 00000000..b8cb080f --- /dev/null +++ b/lib/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/room_tabs_widget.dart @@ -0,0 +1,88 @@ +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/new_views/app_style/app_color.dart'; +import 'package:test_sa/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/dummy_data.dart'; +import 'package:test_sa/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/room_inspection_card.dart'; +import 'package:test_sa/views/widgets/loaders/app_loading.dart'; + +class RoomTabsWidget extends StatefulWidget { + const RoomTabsWidget({Key? key}) : super(key: key); + + @override + State createState() => _RoomTabsWidgetState(); +} + +class _RoomTabsWidgetState extends State { + int selectedIndex = 0; + bool isLoading = false; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: EdgeInsets.all(12.toScreenHeight), + decoration: BoxDecoration( + color: context.isDark ? AppColor.neutral50 : AppColor.white10, + borderRadius: BorderRadius.circular(10), + ), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: DummyData.roomData.asMap().entries.map((entry) { + final int index = entry.key; + final String label = entry.value['name']; + return GestureDetector( + onTap: () { + setState(() { + isLoading = true; + selectedIndex = index; + //TODO replace with api response delay... + Future.delayed(const Duration(seconds: 1)).whenComplete(() { + setState(() { + isLoading = false; + }); + }); + }); + }, + child: Container( + margin: EdgeInsets.only(right: 8.toScreenWidth), + padding: EdgeInsets.symmetric( + vertical: 20.toScreenHeight, + horizontal: 30.toScreenWidth, + ), + alignment: Alignment.center, + decoration: BoxDecoration( + color: selectedIndex == index ? (context.isDark ? AppColor.neutral60 : AppColor.neutral110) : Colors.transparent, + borderRadius: BorderRadius.circular(7), + ), + child: label.bodyText(context).custom( + color: selectedIndex == index ? (context.isDark ? AppColor.white10 : AppColor.black20) : (context.isDark ? AppColor.neutral30 : AppColor.black20), + fontWeight: FontWeight.w600, + ), + ), + ); + }).toList(), + ), + ), + ), + 12.height, + // Display the Selected Tab Content + isLoading + ? SizedBox(height: 120.toScreenHeight, child: const ALoading().center) + : ListView( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + children: DummyData.roomData[selectedIndex]['cards'].map((card) { + return RoomInspectionCard(inspectionModel: card); + }).toList(), + ), + ], + ); + } +} 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 index ca2cfb05..81266b08 100644 --- 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 @@ -1,3 +1,4 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/ppm_provider.dart'; @@ -7,17 +8,19 @@ 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/app_filled_button.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/service_request_latest/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/asset_info_widget.dart'; +import 'package:test_sa/views/pages/user/ppm/ppm_work_order/recurrent_wo/components/dummy_data.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'; + +import 'components/room_inspection_card.dart'; +import 'components/room_tabs_widget.dart'; class RecurrentWorkOrderView extends StatefulWidget { static const String id = "/visit-details"; @@ -54,48 +57,85 @@ class _RecurrentWorkOrderViewState extends State { userProvider ??= Provider.of(context, listen: false); ppmProvider ??= Provider.of(context, listen: false); + RoomTabs.getRoomTabs(); return Scaffold( appBar: DefaultAppBar(title: context.translation.recurrentWo), - body: SafeArea( - child: FutureBuilder( + //TODO refactor this after getting api... + body: Stack( + children: [ + 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); + DummyModel testModel = DummyModel(widget.request, ppm, timerModel, totalWorkingHours); + return SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AssetInfoWidget(model: testModel), + 16.height, + const RoomTabsWidget(), + ], + ).paddingAll(12), + ); } return NoDataFound(message: context.translation.noDataFound); - }), + }, + ).paddingOnly(bottom: 85), + FooterActionButton.footerContainer( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + AppFilledButton( + label: context.translation.save, + buttonColor: AppColor.white60, + textColor: AppColor.black10, + onPressed: () async { + print('save clicked...'); + }, + ).expanded, + 12.width, + AppFilledButton( + label: context.translation.complete, + buttonColor: AppColor.primary10, + onPressed: () async { + print('complete clicked...'); + }, + ).expanded, + ], + ), + ), + ], ), ); + } +} + + + + + -} 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; + static List getRoomTabs() { + List roomTabs = []; + for(int i =0;i