recurrent task api integrated

design_3.0_latest
WaseemAbbasi22 9 months ago
parent ed1337e16d
commit 99bcae1dc2

@ -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

@ -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<int> 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<RecurrentWo> 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<int> getCalendarRequests({required DateTime from, DateTime? to}) async {
if (isCalendarLoading == true) return -2;
isCalendarLoading = true;

@ -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 {

@ -532,5 +532,6 @@
"taskNo": "رقم المهمة",
"assignEngineer": "تعيين مهندس",
"scheduledDate": "التاريخ المجدول",
"complete": "اكتمل"
"complete": "اكتمل",
"recurrentWo": "أمر العمل المتكرر"
}

@ -536,5 +536,6 @@
"taskNo": "Task No",
"assignEngineer": "Assign Engineer",
"scheduledDate": "Scheduled Date",
"complete": "Complete"
"complete": "Complete",
"recurrentWo": "Recurrent WO"
}

@ -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<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
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>? planRecurrentMedicalTaskRooms;
List<Null>? 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<String, dynamic> 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 = <PlanRecurrentMedicalTaskRooms>[];
json['planRecurrentMedicalTaskRooms'].forEach((v) {
planRecurrentMedicalTaskRooms!
.add(PlanRecurrentMedicalTaskRooms.fromJson(v));
});
}
if (json['planRecurrentTaskTimers'] != null) {
//TODO match with exact data and replace...
// planRecurrentTaskTimers = <Null>[];
// json['planRecurrentTaskTimers'].forEach((v) {
// planRecurrentTaskTimers!.add(new Null.fromJson(v));
// });
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
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<String, dynamic> json) {
userId = json['userId'];
userName = json['userName'];
email = json['email'];
employeeId = json['employeeId'];
languageId = json['languageId'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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<String, dynamic> json) {
id = json['id'];
name = json['name'];
value = json['value'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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<String, dynamic> json) {
id = json['id'];
siteName = json['siteName'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['siteName'] = this.siteName;
return data;
}
}
class PlanRecurrentMedicalTaskRooms {
int? id;
Room? room;
List<PlanRecurrentMedicalTaskRoomTabs>? planRecurrentMedicalTaskRoomTabs;
PlanRecurrentMedicalTaskRooms(
{this.id, this.room, this.planRecurrentMedicalTaskRoomTabs});
PlanRecurrentMedicalTaskRooms.fromJson(Map<String, dynamic> json) {
id = json['id'];
room = json['room'] != null ? new Room.fromJson(json['room']) : null;
if (json['planRecurrentMedicalTaskRoomTabs'] != null) {
planRecurrentMedicalTaskRoomTabs = <PlanRecurrentMedicalTaskRoomTabs>[];
json['planRecurrentMedicalTaskRoomTabs'].forEach((v) {
planRecurrentMedicalTaskRoomTabs!
.add(new PlanRecurrentMedicalTaskRoomTabs.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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<String, dynamic> json) {
id = json['id'];
roomId = json['roomId'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['roomId'] = this.roomId;
return data;
}
}
class PlanRecurrentMedicalTaskRoomTabs {
int? id;
String? tabName;
int? tabMedicalRoomId;
List<PlanRecurrentMedicalTaskRoomTabAttributes>?
planRecurrentMedicalTaskRoomTabAttributes;
PlanRecurrentMedicalTaskRoomTabs(
{this.id,
this.tabName,
this.tabMedicalRoomId,
this.planRecurrentMedicalTaskRoomTabAttributes});
PlanRecurrentMedicalTaskRoomTabs.fromJson(Map<String, dynamic> json) {
id = json['id'];
tabName = json['tabName'];
tabMedicalRoomId = json['tabMedicalRoomId'];
if (json['planRecurrentMedicalTaskRoomTabAttributes'] != null) {
planRecurrentMedicalTaskRoomTabAttributes =
<PlanRecurrentMedicalTaskRoomTabAttributes>[];
json['planRecurrentMedicalTaskRoomTabAttributes'].forEach((v) {
planRecurrentMedicalTaskRoomTabAttributes!
.add(new PlanRecurrentMedicalTaskRoomTabAttributes.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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<String, dynamic> json) {
id = json['id'];
attribute = json['attribute'] != null
? new Attribute.fromJson(json['attribute'])
: null;
attributeValue = json['attributeValue'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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<String, dynamic> json) {
name = json['name'];
type = json['type'];
key = json['key'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['name'] = this.name;
data['type'] = this.type;
data['key'] = this.key;
return data;
}
}

@ -37,6 +37,7 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
context.translation.gasRefillRequest,
context.translation.deviceTransferRequest,
context.translation.preventiveMaintenance,
context.translation.recurrentWo,
];
_provider = Provider.of<AllRequestsProvider>(context, listen: false);
_provider!.reset();

@ -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<AllRequestsProvider>(context,listen:false).getRecurrentWoById(context, id: requestDetails!.id!);
Navigator.of(context).push(MaterialPageRoute(builder: (_) => RecurrentWorkOrderView( recurrentWo: recurrentWo)));
});
}
return SizedBox();
}
}

@ -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);

@ -109,9 +109,7 @@ class _PpmDetailsPageState extends State<PpmDetailsPage> {
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,

@ -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(),
],
);
}

@ -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<String, dynamic>? inspectionModel;
final PlanRecurrentMedicalTaskRoomTabs? inspectionModel;
RoomInspectionCard({super.key, required this.inspectionModel});
@ -19,25 +21,33 @@ class _RoomInspectionCardState extends State<RoomInspectionCard> {
@override
void initState() {
super.initState();
inspectionValues = widget.inspectionModel?['info']
?.map<bool>((inspectionType) => inspectionType['value'] as bool)
.toList() ??
[];
inspectionValues = widget.inspectionModel!.planRecurrentMedicalTaskRoomTabAttributes!
.map<bool>((inspectionType) => inspectionType.attributeValue != null)
.toList();
}
@override
Widget build(BuildContext context) {
return Column(
children: widget.inspectionModel?['info']
?.asMap()
.entries
.map<Widget>((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<Widget>((entry) => inspectionStatusRadioWidget(
index: entry.key,
label: entry.value.attribute!.name??'',
context: context,
))
.toList() ??
[],
)
],
).toShadowContainer(context).paddingOnly(top: 12);
}

@ -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<RoomTabsWidget> createState() => _RoomTabsWidgetState();
@ -34,9 +36,10 @@ class _RoomTabsWidgetState extends State<RoomTabsWidget> {
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<RoomTabsWidget> {
: ListView(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
children: DummyData.roomData[selectedIndex]['cards'].map<Widget>((card) {
children: widget.model!.planRecurrentMedicalTaskRooms![selectedIndex].planRecurrentMedicalTaskRoomTabs!.map<Widget>((card) {
return RoomInspectionCard(inspectionModel: card);
}).toList(),
),

@ -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<RecurrentWorkOrderView> {
Widget build(BuildContext context) {
userProvider ??= Provider.of<UserProvider>(context, listen: false);
ppmProvider ??= Provider.of<PpmProvider>(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<RoomTabs> getRoomTabs() {
List<RoomTabs> roomTabs = [];
for(int i =0;i<DummyData.roomData.length;i++){
for (int i = 0; i < DummyData.roomData.length; i++) {
roomTabs.add(RoomTabs(label: DummyData.roomData[i]['name'], tag: i));
}
return roomTabs;
return roomTabs;
}
}

Loading…
Cancel
Save