diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 137d2f3a..b1959cfc 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -80,6 +80,9 @@ class URLs { static get swipeUrl=> '$_baseUrl/Swipe/Swipe'; static get getSwipeLastTransactionUrl=> '$_baseUrl/Swipe/GetLastTransaction'; static get getSwipeTransactionHistoryUrl=> '$_baseUrl/Swipe/GetTransactions'; + static get getRecurrentPlanByIdUrl=> '$_baseUrl/PlanRecurrentTasks/GetPlanRecurrentTaskById'; + //Recurrent plan Api... + //service request..... static get getServiceRequests => "$_baseUrl/CallRequest/GetCallRequests"; // get diff --git a/lib/controllers/providers/api/all_requests_provider.dart b/lib/controllers/providers/api/all_requests_provider.dart index a4b82bd8..88cf8f95 100644 --- a/lib/controllers/providers/api/all_requests_provider.dart +++ b/lib/controllers/providers/api/all_requests_provider.dart @@ -4,8 +4,10 @@ import 'package:flutter/widgets.dart'; import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/extensions/context_extension.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/recurrent_wo.dart'; import '../../../models/search_all_requests_model.dart'; @@ -128,7 +130,7 @@ class AllRequestsProvider extends ChangeNotifier { } final type = typeTransaction == null ? search?.typeTransaction == null || (search?.typeTransaction?.isEmpty ?? false) - ? [1, 2, 3, 4] + ? [1, 2, 3, 4,5]//added 5 to get recurrent wo ... : search!.typeTransaction : [typeTransaction]; List status = (search?.statuses == null || (search?.statuses?.isEmpty ?? false)) ? (((search?.isArchived ?? false) ? [3] : [1, 2, 4])) : search!.statuses!; @@ -177,6 +179,23 @@ class AllRequestsProvider extends ChangeNotifier { } } + Future getRecurrentWoById(BuildContext context, {required int id}) async { + Response response; + try { + response = await ApiManager.instance.get(URLs.getRecurrentPlanByIdUrl + "?planRecurrentTaskId=$id"); + + } catch (error) { + throw (context.translation.failedToCompleteRequest); + } + if (response.statusCode >= 200 && response.statusCode < 300) { + RecurrentWo recurrentWo = RecurrentWo.fromJson(json.decode(response.body)); + return recurrentWo; + + } else { + throw (("${context.translation.failedToCompleteRequest} ${jsonDecode(response.body)["message"]}")); + } + } + Future getCalendarRequests({required DateTime from, DateTime? to}) async { if (isCalendarLoading == true) return -2; isCalendarLoading = true; diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 80a0f88d..6a024697 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -38,6 +38,15 @@ extension StringExtensions on String { return ""; } } + String get toMonthYearFormat { + try { + DateTime dateTime = DateTime.parse(this); + String formattedDate = DateFormat('MMMM d, y').format(dateTime); + return formattedDate; + } catch (e) { + return ""; + } + } String get toAssetDetailsFormat { try { diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index 51742453..a15a9b45 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -532,5 +532,6 @@ "taskNo": "رقم المهمة", "assignEngineer": "تعيين مهندس", "scheduledDate": "التاريخ المجدول", - "complete": "اكتمل" + "complete": "اكتمل", + "recurrentWo": "أمر العمل المتكرر" } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index fcee617c..7d5a1c18 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -536,5 +536,6 @@ "taskNo": "Task No", "assignEngineer": "Assign Engineer", "scheduledDate": "Scheduled Date", - "complete": "Complete" + "complete": "Complete", + "recurrentWo": "Recurrent WO" } \ No newline at end of file diff --git a/lib/models/ppm/recurrent_wo.dart b/lib/models/ppm/recurrent_wo.dart new file mode 100644 index 00000000..19d5d233 --- /dev/null +++ b/lib/models/ppm/recurrent_wo.dart @@ -0,0 +1,346 @@ +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/timer_model.dart'; + +class RecurrentWo { + RecurrentWoData? recurrentWoData; + String? message; + String? title; + String? innerMessage; + int? responseCode; + bool? isSuccess; + + RecurrentWo( + {this.recurrentWoData, + this.message, + this.title, + this.innerMessage, + this.responseCode, + this.isSuccess}); + + RecurrentWo.fromJson(Map json) { + recurrentWoData = json['data'] != null ? RecurrentWoData.fromJson(json['data']) : null; + message = json['message']; + title = json['title']; + innerMessage = json['innerMessage']; + responseCode = json['responseCode']; + isSuccess = json['isSuccess']; + } + + Map toJson() { + final Map data = {}; + if (recurrentWoData != null) { + data['data'] = recurrentWoData!.toJson(); + } + data['message'] = message; + data['title'] = title; + data['innerMessage'] = innerMessage; + data['responseCode'] = responseCode; + data['isSuccess'] = isSuccess; + return data; + } +} + +class RecurrentWoData { + int? id; + Engineer? engineer; + String? scheduleDate; + Status? status; + Site? site; + Lookup? building; + Lookup? floor; + Lookup? department; + Lookup? room; + List? planRecurrentMedicalTaskRooms; + List? planRecurrentTaskTimers; + TimerModel? recurrentWoTimerModel = TimerModel(); + + RecurrentWoData( + {this.id, + this.engineer, + this.scheduleDate, + this.status, + this.site, + this.building, + this.recurrentWoTimerModel, + this.floor, + this.department, + this.room, + this.planRecurrentMedicalTaskRooms, + this.planRecurrentTaskTimers}); + + RecurrentWoData.fromJson(Map json) { + id = json['id']; + engineer = json['engineer'] != null + ? new Engineer.fromJson(json['engineer']) + : null; + scheduleDate = json['scheduleDate']; + status = + json['status'] != null ? Status.fromJson(json['status']) : null; + site = json['site'] != null ? Site.fromJson(json['site']) : null; + building= json["building"] == null ? null : Lookup.fromJson(json["building"]); + floor= json["floor"] == null ? null : Lookup.fromJson(json["floor"]); + department= json["department"] == null ? null : Lookup.fromJson(json["department"]); + room= json["room"] == null ? null : Lookup.fromJson(json["room"]); + if (json['planRecurrentMedicalTaskRooms'] != null) { + planRecurrentMedicalTaskRooms = []; + json['planRecurrentMedicalTaskRooms'].forEach((v) { + planRecurrentMedicalTaskRooms! + .add(PlanRecurrentMedicalTaskRooms.fromJson(v)); + }); + } + if (json['planRecurrentTaskTimers'] != null) { + //TODO match with exact data and replace... + // planRecurrentTaskTimers = []; + // json['planRecurrentTaskTimers'].forEach((v) { + // planRecurrentTaskTimers!.add(new Null.fromJson(v)); + // }); + } + } + + Map toJson() { + final Map data = {}; + data['id'] = id; + if (engineer != null) { + data['engineer'] = engineer!.toJson(); + } + data['scheduleDate'] = scheduleDate; + if (status != null) { + data['status'] = status!.toJson(); + } + if (site != null) { + data['site'] = site!.toJson(); + } + + if (planRecurrentMedicalTaskRooms != null) { + data['planRecurrentMedicalTaskRooms'] = + planRecurrentMedicalTaskRooms!.map((v) => v.toJson()).toList(); + } + if (planRecurrentTaskTimers != null) { + //TODO match with exact data and replace... + // data['planRecurrentTaskTimers'] = + // this.planRecurrentTaskTimers!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Engineer { + String? userId; + String? userName; + String? email; + String? employeeId; + int? languageId; + + Engineer( + {this.userId, + this.userName, + this.email, + this.employeeId, + this.languageId}); + + Engineer.fromJson(Map json) { + userId = json['userId']; + userName = json['userName']; + email = json['email']; + employeeId = json['employeeId']; + languageId = json['languageId']; + } + + Map toJson() { + final Map data = new Map(); + data['userId'] = this.userId; + data['userName'] = this.userName; + data['email'] = this.email; + data['employeeId'] = this.employeeId; + data['languageId'] = this.languageId; + return data; + } +} + +class Status { + int? id; + String? name; + int? value; + + Status({this.id, this.name, this.value}); + + Status.fromJson(Map json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['value'] = this.value; + return data; + } +} + +class Site { + int? id; + String? siteName; + + Site({this.id, this.siteName}); + + Site.fromJson(Map json) { + id = json['id']; + siteName = json['siteName']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['siteName'] = this.siteName; + return data; + } +} + +class PlanRecurrentMedicalTaskRooms { + int? id; + Room? room; + List? planRecurrentMedicalTaskRoomTabs; + + PlanRecurrentMedicalTaskRooms( + {this.id, this.room, this.planRecurrentMedicalTaskRoomTabs}); + + PlanRecurrentMedicalTaskRooms.fromJson(Map json) { + id = json['id']; + room = json['room'] != null ? new Room.fromJson(json['room']) : null; + if (json['planRecurrentMedicalTaskRoomTabs'] != null) { + planRecurrentMedicalTaskRoomTabs = []; + json['planRecurrentMedicalTaskRoomTabs'].forEach((v) { + planRecurrentMedicalTaskRoomTabs! + .add(new PlanRecurrentMedicalTaskRoomTabs.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + if (this.room != null) { + data['room'] = this.room!.toJson(); + } + if (this.planRecurrentMedicalTaskRoomTabs != null) { + data['planRecurrentMedicalTaskRoomTabs'] = this + .planRecurrentMedicalTaskRoomTabs! + .map((v) => v.toJson()) + .toList(); + } + return data; + } +} + +class Room { + int? id; + String? roomId; + + Room({this.id, this.roomId}); + + Room.fromJson(Map json) { + id = json['id']; + roomId = json['roomId']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['roomId'] = this.roomId; + return data; + } +} + +class PlanRecurrentMedicalTaskRoomTabs { + int? id; + String? tabName; + int? tabMedicalRoomId; + List? + planRecurrentMedicalTaskRoomTabAttributes; + + PlanRecurrentMedicalTaskRoomTabs( + {this.id, + this.tabName, + this.tabMedicalRoomId, + this.planRecurrentMedicalTaskRoomTabAttributes}); + + PlanRecurrentMedicalTaskRoomTabs.fromJson(Map json) { + id = json['id']; + tabName = json['tabName']; + tabMedicalRoomId = json['tabMedicalRoomId']; + if (json['planRecurrentMedicalTaskRoomTabAttributes'] != null) { + planRecurrentMedicalTaskRoomTabAttributes = + []; + json['planRecurrentMedicalTaskRoomTabAttributes'].forEach((v) { + planRecurrentMedicalTaskRoomTabAttributes! + .add(new PlanRecurrentMedicalTaskRoomTabAttributes.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['tabName'] = this.tabName; + data['tabMedicalRoomId'] = this.tabMedicalRoomId; + if (this.planRecurrentMedicalTaskRoomTabAttributes != null) { + data['planRecurrentMedicalTaskRoomTabAttributes'] = this + .planRecurrentMedicalTaskRoomTabAttributes! + .map((v) => v.toJson()) + .toList(); + } + return data; + } +} + +class PlanRecurrentMedicalTaskRoomTabAttributes { + int? id; + Attribute? attribute; + Null? attributeValue; + + PlanRecurrentMedicalTaskRoomTabAttributes( + {this.id, this.attribute, this.attributeValue}); + + PlanRecurrentMedicalTaskRoomTabAttributes.fromJson( + Map json) { + id = json['id']; + attribute = json['attribute'] != null + ? new Attribute.fromJson(json['attribute']) + : null; + attributeValue = json['attributeValue']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + if (this.attribute != null) { + data['attribute'] = this.attribute!.toJson(); + } + data['attributeValue'] = this.attributeValue; + return data; + } +} + +class Attribute { + String? name; + String? type; + String? key; + + Attribute({this.name, this.type, this.key}); + + Attribute.fromJson(Map json) { + name = json['name']; + type = json['type']; + key = json['key']; + } + + Map toJson() { + final Map data = new Map(); + data['name'] = this.name; + data['type'] = this.type; + data['key'] = this.key; + return data; + } +} \ No newline at end of file diff --git a/lib/new_views/pages/land_page/my_request/my_requests_page.dart b/lib/new_views/pages/land_page/my_request/my_requests_page.dart index bc0b6863..0519bd03 100644 --- a/lib/new_views/pages/land_page/my_request/my_requests_page.dart +++ b/lib/new_views/pages/land_page/my_request/my_requests_page.dart @@ -37,6 +37,7 @@ class _MyRequestsPageState extends State { context.translation.gasRefillRequest, context.translation.deviceTransferRequest, context.translation.preventiveMaintenance, + context.translation.recurrentWo, ]; _provider = Provider.of(context, listen: false); _provider!.reset(); diff --git a/lib/new_views/pages/land_page/requests/recurrent_wo_item_view.dart b/lib/new_views/pages/land_page/requests/recurrent_wo_item_view.dart new file mode 100644 index 00000000..0f4abfdb --- /dev/null +++ b/lib/new_views/pages/land_page/requests/recurrent_wo_item_view.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/all_requests_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/models/all_requests_and_count_model.dart'; +import 'package:test_sa/models/ppm/recurrent_wo.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/recurrent_work_order_view.dart'; +import '../../../../views/widgets/requests/request_status.dart'; + +class RecurrentWoItemView extends StatelessWidget { + final RequestsDetails? requestDetails; + final bool showShadow; + + const RecurrentWoItemView({Key? key, this.requestDetails, this.showShadow = true}) : super(key: key); + + @override + Widget build(BuildContext context) { + if (requestDetails != null) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + StatusLabel( + label: requestDetails!.priority!, + textColor: AppColor.getRequestStatusTextColorByName(context, requestDetails!.priority!), + backgroundColor: AppColor.getRequestStatusColorByName(context, requestDetails!.priority!), + ), + 8.width, + StatusLabel( + label: requestDetails!.status!, + textColor: AppColor.getRequestStatusTextColorByName(context, requestDetails!.status!), + 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.ppmRequest).heading5(context), + 8.height, + '${context.translation.assetNumber}: ${requestDetails!.assetNo}'.bodyText(context), + '${context.translation.assetSN}: ${requestDetails!.assetSN}'.bodyText(context), + // '${context.translation.code}: ${request.code}'.bodyText(context), + '${context.translation.requestNo}: ${requestDetails!.requestNo}'.bodyText(context), + 16.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) + ], + ), + ], + ).toShadowContainer(context, withShadow: showShadow).onPress(() async { + print('data i got is ${requestDetails?.id}'); + + RecurrentWo recurrentWo = await Provider.of(context,listen:false).getRecurrentWoById(context, id: requestDetails!.id!); + Navigator.of(context).push(MaterialPageRoute(builder: (_) => RecurrentWorkOrderView( recurrentWo: recurrentWo))); + + }); + } + return SizedBox(); + } +} diff --git a/lib/new_views/pages/land_page/widgets/request_item_view_list.dart b/lib/new_views/pages/land_page/widgets/request_item_view_list.dart index 783671aa..0a06c6d6 100644 --- a/lib/new_views/pages/land_page/widgets/request_item_view_list.dart +++ b/lib/new_views/pages/land_page/widgets/request_item_view_list.dart @@ -7,6 +7,7 @@ import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/new_views/pages/land_page/requests/asset_item_view.dart'; import 'package:test_sa/new_views/pages/land_page/requests/gas_refill_item_view.dart'; import 'package:test_sa/new_views/pages/land_page/requests/ppm_item_view.dart'; +import 'package:test_sa/new_views/pages/land_page/requests/recurrent_wo_item_view.dart'; import 'package:test_sa/new_views/pages/land_page/requests/service_request_item_view.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; @@ -25,24 +26,43 @@ class RequestItemViewList extends StatelessWidget { shrinkWrap: true, itemBuilder: (cxt, index) { if (isLoading) return const SizedBox().toRequestShimmer(cxt, isLoading); - bool isServiceRequest = list[index].transactionType == 1; - bool isGasRefill = list[index].transactionType == 2; - bool isAssetTransfer = list[index].transactionType == 3; - bool isPPMs = list[index].transactionType == 4; + switch(list[index].transactionType){ + case 1: + return ServiceRequestItemView(requestDetails: list[index]); + case 2: + return GasRefillItemView(requestDetails: list[index]); + case 3: + return AssetItemView(requestDetails: list[index]); + case 4: + return PpmItemView(requestDetails: list[index]); + case 5: + return RecurrentWoItemView(requestDetails: list[index]); + default: + Container( + height: 100, + width: double.infinity, + color: Colors.grey, + ); - return isServiceRequest - ? ServiceRequestItemView(requestDetails: list[index]) - : isGasRefill - ? GasRefillItemView(requestDetails: list[index]) - : isPPMs - ? PpmItemView(requestDetails: list[index]) - : isAssetTransfer - ? AssetItemView(requestDetails: list[index]) - : Container( - height: 100, - width: double.infinity, - color: Colors.grey, - ); + } + // bool isServiceRequest = list[index].transactionType == 1; + // bool isGasRefill = list[index].transactionType == 2; + // bool isAssetTransfer = list[index].transactionType == 3; + // bool isPPMs = list[index].transactionType == 4; + // + // return isServiceRequest + // ? ServiceRequestItemView(requestDetails: list[index]) + // : isGasRefill + // ? GasRefillItemView(requestDetails: list[index]) + // : isPPMs + // ? PpmItemView(requestDetails: list[index]) + // : isAssetTransfer + // ? AssetItemView(requestDetails: list[index]) + // : Container( + // height: 100, + // width: double.infinity, + // color: Colors.grey, + // ); }, separatorBuilder: (cxt, index) => 8.height, itemCount: isLoading ? 6 : list.length); diff --git a/lib/views/pages/user/ppm/ppm_details_page.dart b/lib/views/pages/user/ppm/ppm_details_page.dart index 9496b7bc..4e9a8d6c 100644 --- a/lib/views/pages/user/ppm/ppm_details_page.dart +++ b/lib/views/pages/user/ppm/ppm_details_page.dart @@ -109,9 +109,7 @@ class _PpmDetailsPageState extends State { if (userProvider!.user!.type == UsersTypes.engineer && (ppm.visitStatusId != 270 && ppm.visitStatusId != 269)) 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: (_) => 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 a50c8b81..1257bf88 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 @@ -1,10 +1,12 @@ 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/string_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/ppm/recurrent_wo.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'; @@ -13,12 +15,13 @@ import 'package:test_sa/views/widgets/timer/app_timer.dart'; class AssetInfoWidget extends StatelessWidget { - final DummyModel? model; // Use `final` since it's a StatelessWidget + final RecurrentWoData? model; // Use `final` since it's a StatelessWidget AssetInfoWidget({super.key, required this.model}); @override Widget build(BuildContext context) { + double totalWorkingHours = 2.0; return Column( mainAxisSize: MainAxisSize.min, children: [ @@ -26,38 +29,38 @@ class AssetInfoWidget extends StatelessWidget { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - if (model?.request?.priority != null) + if (model?.status != null) StatusLabel( - label: model?.request?.priority, - textColor: AppColor.getRequestStatusTextColorByName(context,model?.request?.priority), - backgroundColor: AppColor.getRequestStatusColorByName(context,model?.request?.priority), + label: model?.status?.name, + textColor: AppColor.getRequestStatusTextColorByName(context,model?.status?.name), + backgroundColor: AppColor.getRequestStatusColorByName(context,model?.status?.name), ), 8.height, - - model!.ppm!.assetName!.bodyText(context).custom(color:AppColor.black10 ), +// TODO need to replace this with correct data... + model!.site!.siteName!.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), + '${context.translation.taskNo}: ${model!.site!.id!}'.bodyText2(context).custom(color: AppColor.neutral120), + '${context.translation.site}: ${model!.site!.siteName!}'.bodyText2(context).custom(color: AppColor.neutral120), + '${context.translation.assignEngineer}: ${model!.engineer!.userName ?? ""}'.bodyText2(context).custom(color: AppColor.neutral120), + '${context.translation.scheduledDate}: ${model!.scheduleDate!.toMonthYearFormat}'.bodyText2(context).custom(color: AppColor.neutral120), ], ).toShadowContainer(context), 12.height, - Column( + model!.planRecurrentMedicalTaskRooms!.isEmpty? Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - buildingInfoWidget(label: context.translation.department, value: model!.ppm!.departmentName!.cleanupWhitespace.capitalizeFirstOfEach,context: context), + buildingInfoWidget(label: context.translation.department, value: model!.department!.name!.cleanupWhitespace.capitalizeFirstOfEach,context: context), 8.height, - buildingInfoWidget(label: context.translation.floor, value: model!.ppm!.floorName!.cleanupWhitespace.capitalizeFirstOfEach,context: context), + buildingInfoWidget(label: context.translation.floor, value: model!.floor!.name!.cleanupWhitespace.capitalizeFirstOfEach,context: context), 8.height, - buildingInfoWidget(label: context.translation.room, value: model!.ppm!.roomName!.cleanupWhitespace.capitalizeFirstOfEach,context: context), + buildingInfoWidget(label: context.translation.room, value: model!.room!.name!.cleanupWhitespace.capitalizeFirstOfEach,context: context), 8.height, AppTimer( label: context.translation.timer, - timer: model!.timerModel, + timer: model!.recurrentWoTimerModel, width:double.infinity, - enabled: model!.timerModel?.endAt == null, + enabled: model!.recurrentWoTimerModel?.endAt == null, decoration: BoxDecoration( color: AppColor.neutral100, borderRadius: BorderRadius.circular(10), @@ -79,7 +82,7 @@ class AssetInfoWidget extends StatelessWidget { style: Theme.of(context).textTheme.bodySmall?.copyWith(color: context.isDark ? null : AppColor.neutral20, fontWeight: FontWeight.w500), ), Text( - " ${ServiceRequestUtils.formatTimerDuration(model!.totalWorkingHours.round())}", + " ${ServiceRequestUtils.formatTimerDuration(totalWorkingHours.round())}", style: Theme.of(context).textTheme.bodyMedium, ), ], @@ -87,7 +90,7 @@ class AssetInfoWidget extends StatelessWidget { 8.height, ], // ], - ).toShadowContainer(context,padding: 12), + ).toShadowContainer(context,padding: 12):const SizedBox(), ], ); } 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 index 855021d9..09334adb 100644 --- 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 @@ -1,11 +1,13 @@ import 'package:flutter/cupertino.dart'; import 'package:test_sa/dashboard_latest/dashboard_view.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/ppm/recurrent_wo.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; class RoomInspectionCard extends StatefulWidget { - final Map? inspectionModel; + final PlanRecurrentMedicalTaskRoomTabs? inspectionModel; RoomInspectionCard({super.key, required this.inspectionModel}); @@ -19,25 +21,33 @@ class _RoomInspectionCardState extends State { @override void initState() { super.initState(); - inspectionValues = widget.inspectionModel?['info'] - ?.map((inspectionType) => inspectionType['value'] as bool) - .toList() ?? - []; + inspectionValues = widget.inspectionModel!.planRecurrentMedicalTaskRoomTabAttributes! + .map((inspectionType) => inspectionType.attributeValue != null) + .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() ?? - [], + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + widget.inspectionModel!.tabName! + .bodyText(context) + .custom(color: AppColor.neutral50, fontWeight: FontWeight.w600), + 8.height, + Column( + children: widget.inspectionModel!.planRecurrentMedicalTaskRoomTabAttributes + ?.asMap() + .entries + .map((entry) => inspectionStatusRadioWidget( + index: entry.key, + label: entry.value.attribute!.name??'', + context: context, + )) + .toList() ?? + [], + ) + ], ).toShadowContainer(context).paddingOnly(top: 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 index b8cb080f..25eea61a 100644 --- 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 @@ -3,13 +3,15 @@ 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/ppm/recurrent_wo.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); + final RecurrentWoData? model; + const RoomTabsWidget({Key? key,required this.model}) : super(key: key); @override State createState() => _RoomTabsWidgetState(); @@ -34,9 +36,10 @@ class _RoomTabsWidgetState extends State { child: SingleChildScrollView( scrollDirection: Axis.horizontal, child: Row( - children: DummyData.roomData.asMap().entries.map((entry) { + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: widget.model!.planRecurrentMedicalTaskRooms!.asMap().entries.map((entry) { final int index = entry.key; - final String label = entry.value['name']; + final String label = entry.value.room!.roomId!; return GestureDetector( onTap: () { setState(() { @@ -78,7 +81,7 @@ class _RoomTabsWidgetState extends State { : ListView( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), - children: DummyData.roomData[selectedIndex]['cards'].map((card) { + children: widget.model!.planRecurrentMedicalTaskRooms![selectedIndex].planRecurrentMedicalTaskRoomTabs!.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 81266b08..5ae21521 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 @@ -5,10 +5,10 @@ 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/ppm/ppm.dart'; +import 'package:test_sa/models/ppm/recurrent_wo.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'; @@ -18,15 +18,13 @@ import 'package:test_sa/views/pages/user/ppm/ppm_work_order/recurrent_wo/compone 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 'components/room_inspection_card.dart'; import 'components/room_tabs_widget.dart'; class RecurrentWorkOrderView extends StatefulWidget { - static const String id = "/visit-details"; - final RequestsDetails request; + static const String id = "/recurrent_wo"; + final RecurrentWo recurrentWo; - const RecurrentWorkOrderView({Key? key, required this.request}) : super(key: key); + const RecurrentWorkOrderView({Key? key, required this.recurrentWo}) : super(key: key); @override _RecurrentWorkOrderViewState createState() { @@ -56,76 +54,63 @@ class _RecurrentWorkOrderViewState extends State { Widget build(BuildContext context) { userProvider ??= Provider.of(context, listen: false); ppmProvider ??= Provider.of(context, listen: false); - + print('data i got is ${widget.recurrentWo.recurrentWoData?.toJson()}'); RoomTabs.getRoomTabs(); return Scaffold( appBar: DefaultAppBar(title: context.translation.recurrentWo), //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; - DummyModel testModel = DummyModel(widget.request, ppm, timerModel, totalWorkingHours); - return SingleChildScrollView( + body: widget.recurrentWo.recurrentWoData != null + ? Stack( + children: [ + SingleChildScrollView( child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - AssetInfoWidget(model: testModel), + AssetInfoWidget(model: widget.recurrentWo.recurrentWoData), 16.height, - const RoomTabsWidget(), + widget.recurrentWo.recurrentWoData!.planRecurrentMedicalTaskRooms!.isNotEmpty + ? RoomTabsWidget( + model: widget.recurrentWo.recurrentWoData, + ) + : const SizedBox(), ], ).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, + ).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, + ], + ), + ), ], - ), - ), - ], - ), + ) + : NoDataFound(message: context.translation.noDataFound).center, ); - } } - - - - - - - class RoomTabs { String label; int tag; + RoomTabs({ required this.label, required this.tag, @@ -133,9 +118,9 @@ class RoomTabs { static List getRoomTabs() { List roomTabs = []; - for(int i =0;i