dashboard & workorder details bug fixes.

design_3.0_latest
Sikander Saleem 1 year ago
parent b04cd1e042
commit 3484859028

@ -107,9 +107,7 @@ class DashBoardProvider extends ChangeNotifier {
notifyListeners();
Response response;
try {
response = await ApiManager.instance.get(
URLs.getWorkOrderByIdUrl + "?workOrderId=$id",
);
response = await ApiManager.instance.get(URLs.getWorkOrderByIdUrl + "?workOrderId=$id");
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
@ -178,19 +176,14 @@ class DashBoardProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) {
if (_requestDetailList == null) {
_requestDetailList = DD.DashboardDetail.fromJson(json.decode(response.body));
//notifyListeners();
} else {
_requestDetailList!.data!.addAll(DD.DashboardDetail.fromJson(json.decode(response.body)["data"][0]).data ?? []);
//notifyListeners();
_requestDetailList!.data!.addAll(DD.DashboardDetail.fromJson(json.decode(response.body)).data ?? []);
}
if (_requestDetailList!.data!.length >= pageItemNumber) {
nextPage = true;
} else {
nextPage = false;
}
//notifyListeners();
} else {
requestDetailList = null;
}

@ -5,7 +5,6 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/notification/firebase_notification_manger.dart';
import 'package:test_sa/controllers/notification/notification_manger.dart';
import 'package:test_sa/controllers/providers/api/all_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/notifications_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
@ -36,8 +35,8 @@ class _DashboardViewState extends State<DashboardView> {
late SettingProvider settingProvider;
late UserProvider userProvider;
late AllRequestsProvider allRequestsProvider;
late DashBoardProvider dashBoardProvider;
// late AllRequestsProvider allRequestsProvider;
late NotificationsProvider notificationsProvider;
late ScrollController _scrollController;
late DashBoardProvider _dashBoardProvider;
@ -51,6 +50,7 @@ class _DashboardViewState extends State<DashboardView> {
void getRequests() {
_dashBoardProvider.getDashBoardCount(usersType: userProvider.user!.type!);
_dashBoardProvider.resetRequestDataList();
_dashBoardProvider.getRequestDetail(usersType: userProvider.user!.type!, status: _dashBoardProvider.tabs[_dashBoardProvider.currentListIndex].tag);
}
@ -59,7 +59,7 @@ class _DashboardViewState extends State<DashboardView> {
userProvider = Provider.of<UserProvider>(context, listen: false);
settingProvider = Provider.of<SettingProvider>(context, listen: false);
RequestDetailProvider requestDetailProvider = Provider.of<RequestDetailProvider>(context, listen: false);
allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
//allRequestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
_dashBoardProvider = Provider.of<DashBoardProvider>(context, listen: false);
_dashBoardProvider.setTabs(userProvider.user!.type!, context);
notificationsProvider = Provider.of<NotificationsProvider>(context, listen: false);
@ -99,9 +99,9 @@ class _DashboardViewState extends State<DashboardView> {
void handleScroll() async {
_scrollController = ScrollController();
_scrollController.addListener(() async {
if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent && !allRequestsProvider.isFilterRequestLoading) {
allRequestsProvider.pageNum = allRequestsProvider.pageNum + 1;
await allRequestsProvider.getFilterRequests(showLoader: false, status: allRequestsProvider.status);
if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent && !_dashBoardProvider.isDetailLoading) {
_dashBoardProvider.pageNum = _dashBoardProvider.pageNum + 1;
_dashBoardProvider.getRequestDetail(usersType: user.type!, showLoader: false, status: _dashBoardProvider.currentListIndex);
}
});
}
@ -115,7 +115,7 @@ class _DashboardViewState extends State<DashboardView> {
@override
Widget build(BuildContext context) {
bool isNurse = (Provider.of<UserProvider>(context, listen: false).user!.type) == UsersTypes.normal_user;
print('user data is ${Provider.of<UserProvider>(context, listen: false).user?.toJson()}');
print('user data is ${Provider.of<UserProvider>(context, listen: false).user?.toJson()}');
return Scaffold(
// backgroundColor: AppColor.background(context),
appBar: PreferredSize(

@ -10,6 +10,7 @@ import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/new_views/common_widgets/tab_button.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
class RequestCategoryFragment extends StatelessWidget {
const RequestCategoryFragment({Key? key}) : super(key: key);
@ -33,7 +34,9 @@ class RequestCategoryFragment extends StatelessWidget {
child: const SizedBox().toRequestShimmer(context, dashboardProvider.isDetailLoading),
);
})).paddingOnly(start: 16, end: 16, top: 16)
: RequestCategoryList(dashboardProvider.requestDetailList?.data ?? <Data>[], dashboardProvider.isDetailLoading, dashboardProvider.requestDetailList?.totalRows ?? 0),
: (dashboardProvider.requestDetailList?.data?.isEmpty ?? true)
? const NoDataFound().paddingOnly(top: 50).center
: RequestCategoryList(dashboardProvider.requestDetailList?.data ?? <Data>[], dashboardProvider.isDetailLoading, dashboardProvider.requestDetailList?.totalRows ?? 0),
]);
});
}

@ -1,5 +1,7 @@
import 'package:flutter/material.dart';
import 'package:test_sa/dashboard_latest/widgets/app_bar_widget.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/pages/land_page/requests/asset_item_view.dart';
@ -23,14 +25,7 @@ class RequestCategoryList extends StatelessWidget {
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
if (index == list.length) {
return const ListTile(
title: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 1),
],
),
);
return const CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 1).center;
}
return Padding(padding: EdgeInsets.symmetric(vertical: 10.toScreenHeight), child: _buildRequestItem(list[index]));
},

@ -1,14 +1,15 @@
import 'package:test_sa/models/fault_description.dart';
import 'package:test_sa/models/lookup.dart';
import '../../new_models/work_order_detail_model.dart';
class FixRemotelyHelperModel {
int? workOrderId;
DateTime? startDate;
DateTime? endDate;
int? workingHour;
String? comment;
FixRemotelyHelperModel({this.workOrderId, this.startDate, this.endDate, this.workingHour, this.comment});
Map<String, dynamic> toJson() {
@ -25,17 +26,10 @@ class WorkOrderHelperModel {
String? voiceNote;
List<WorkOrderAttachments>? workOrderAttachments;
WorkOrderHelperModel(
{this.assetId,
this.equipmentStatusId,
this.priorityId,
this.problemDescriptionId,
this.comments,
this.voiceNote,
this.workOrderAttachments});
WorkOrderHelperModel({this.assetId, this.equipmentStatusId, this.priorityId, this.problemDescriptionId, this.comments, this.voiceNote, this.workOrderAttachments});
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
final Map<String, dynamic> data = <String, dynamic>{};
data['assetId'] = assetId;
data['equipmentStatusId'] = equipmentStatusId;
data['priorityId'] = priorityId;
@ -43,54 +37,58 @@ class WorkOrderHelperModel {
data['comments'] = comments;
data['voiceNote'] = voiceNote;
if (workOrderAttachments != null) {
data['workOrderAttachments'] =
workOrderAttachments!.map((v) => v.toJson()).toList();
data['workOrderAttachments'] = workOrderAttachments!.map((v) => v.toJson()).toList();
}
return data;
}
}
class WorkOrderAttachments {
WorkOrderAttachments({this.id, this.name});
int? id;
String? name;
WorkOrderAttachments({this.id, this.name});
WorkOrderAttachments.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
return data;
}
}
class EngineerUpdateWorkOrderHelperModel {
int? workOrderId;
Lookup?equipmentStatus;
Lookup? equipmentStatus;
String? returnToService;
Lookup? serviceType;
Lookup? loanAvailability;
num?loanAssetId;
num? loanAssetId;
WorkOrderAsset? loanAsset;
Lookup? failureReason;
FaultDescription? faultDescription;
String? solution;
EngineerUpdateWorkOrderHelperModel(
{this.workOrderId,
this.equipmentStatus,
this.failureReason,
this.faultDescription,
this.loanAvailability,
this.loanAssetId,
this.loanAsset,
this.serviceType,
this.solution,
this.returnToService,
});
EngineerUpdateWorkOrderHelperModel({
this.workOrderId,
this.equipmentStatus,
this.failureReason,
this.faultDescription,
this.loanAvailability,
this.loanAssetId,
this.loanAsset,
this.serviceType,
this.solution,
this.returnToService,
});
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
final Map<String, dynamic> data = <String, dynamic>{};
data['workOrderId'] = workOrderId;
data['equipmentStatusId'] = equipmentStatus?.id;
data['returnToService'] = returnToService;
@ -118,6 +116,7 @@ class NurseActionHelperModel {
return {'workOrderId': workOrderId, 'feedback': feedback, 'signatureNurse': signatureNurse};
}
}
class NeedVisitHelperModel {
int? workOrderId;
DateTime? visitDate;
@ -125,7 +124,6 @@ class NeedVisitHelperModel {
NeedVisitHelperModel({this.workOrderId, this.visitDate, this.comment});
Map<String, dynamic> toJson() {
return {'workOrderId': workOrderId, 'visitDate': visitDate?.toIso8601String(), 'comment': comment};
}
@ -136,9 +134,9 @@ class EngineerRejectHelperModel {
String? feedback;
Lookup? rejectionReason;
EngineerRejectHelperModel({this.workOrderId, this.feedback,this.rejectionReason});
EngineerRejectHelperModel({this.workOrderId, this.feedback, this.rejectionReason});
Map<String, dynamic> toJson() {
return {'workOrderId': workOrderId, 'feedback': feedback, 'rejectReasonId': rejectionReason?.id};
}
}
}

@ -117,7 +117,7 @@ class WorkOrderData {
Lookup? problemDescription;
String? comments;
String? voiceNote;
List<String> workOrderAttachments;
List<WorkOrderAttachments> workOrderAttachments;
String? returnToService;
Lookup? serviceType;
Lookup? failureReasone;
@ -164,7 +164,7 @@ class WorkOrderData {
problemDescription: json["problemDescription"] == null ? null : Lookup.fromJson(json["problemDescription"]),
comments: json["comments"],
voiceNote: json["voiceNote"],
workOrderAttachments: json["workOrderAttachments"] == null ? [] : List<String>.from(json["workOrderAttachments"]!.map((x) => x)),
workOrderAttachments: json["workOrderAttachments"] == null ? [] : List.from(json['workOrderAttachments']).map((e)=>WorkOrderAttachments.fromJson(e)).toList(),
returnToService: json["returnToService"],
serviceType: json["serviceType"] == null ? null : Lookup.fromJson(json["serviceType"]),
failureReasone: json["failureReasone"] == null ? null : Lookup.fromJson(json["failureReasone"]),
@ -212,7 +212,7 @@ class WorkOrderData {
"problemDescription": problemDescription?.toJson(),
"comments": comments,
"voiceNote": voiceNote,
"workOrderAttachments": workOrderAttachments.map((x) => x).toList(),
"workOrderAttachments": workOrderAttachments.map((e)=>e.toJson()).toList(),
"returnToService": returnToService,
"serviceType": serviceType?.toJson(),
"failureReasone": failureReasone?.toJson(),

@ -46,15 +46,15 @@ class AppBottomNavigationBar extends StatelessWidget {
return BottomNavigationBarItem(
icon: iconName
.toSvgAsset(
width: showLabel ? 28 : 38,
height: showLabel ? 26 : 37,
width: showLabel ? 26 : 38,
height: showLabel ? 26 : 38,
color: showLabel || (showLabel && selectedIndex != 2)
? selectedIndex == index
? Theme.of(context).bottomNavigationBarTheme.selectedItemColor
: Theme.of(context).bottomNavigationBarTheme.unselectedItemColor
: null,
)
.paddingOnly(top: 21, bottom: showLabel ? 4 : 0),
.paddingOnly(top: showLabel ? 0 : 12, bottom: showLabel ? 6 : 0),
label: showLabel ? label : '',
);
}

@ -9,40 +9,52 @@ import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart
class CreateRequestTypeBottomSheet extends StatelessWidget {
const CreateRequestTypeBottomSheet({super.key});
@override
Widget build(BuildContext context) {
//TODO replace all the icons with new icons...
return Container(
padding: const EdgeInsets.all(16.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
listCard(
context: context,
icon: 'add_icon',
label: '${context.translation.create}\n${context.translation.serviceRequest}',
onTap: () {
Navigator.pushReplacementNamed(context, CreateNewRequest.id);
},
),
listCard(
context: context,
icon: 'add_icon',
label: '${context.translation.create}\n${context.translation.gasRefill}',
onTap: () {
//NewGasRefillRequestPage.routeName)
Navigator.pushReplacementNamed(context, NewGasRefillRequestPage.routeName);
},
),
listCard(
context: context,
icon: 'add_icon',
label: '${context.translation.create}\n${context.translation.deviceTransfer}',
onTap: () async {
Navigator.pushReplacementNamed(context, RequestDeviceTransfer.id);
},
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
"Select Request".heading4(context),
16.height,
GridView(
padding: EdgeInsets.all(0),
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 1, crossAxisSpacing: 16, mainAxisSpacing: 16),
children: <Widget>[
listCard(
context: context,
icon: 'add_icon',
label: '${context.translation.create}\n${context.translation.serviceRequest}',
onTap: () {
Navigator.pushReplacementNamed(context, CreateNewRequest.id);
},
),
listCard(
context: context,
icon: 'add_icon',
label: '${context.translation.create}\n${context.translation.gasRefill}',
onTap: () {
//NewGasRefillRequestPage.routeName)
Navigator.pushReplacementNamed(context, NewGasRefillRequestPage.routeName);
},
),
listCard(
context: context,
icon: 'add_icon',
label: '${context.translation.create}\n${context.translation.deviceTransfer}',
onTap: () async {
Navigator.pushReplacementNamed(context, RequestDeviceTransfer.id);
},
),
],
),
16.height,
],
),
);
@ -59,9 +71,14 @@ class CreateRequestTypeBottomSheet extends StatelessWidget {
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
icon.toSvgAsset(),
24.height,
const Icon(
Icons.add_circle,
color: AppColor.neutral120,
size: 32,
),
//24.height,
label.bodyText2(context).custom(color: AppColor.black20),
],
),

@ -9,6 +9,7 @@ import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/new_views/pages/land_page/requests/request_paginated_listview.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
class RequestsListPage extends StatefulWidget {
static const String routeName = "/requests-list-page";
@ -67,6 +68,8 @@ class _RequestsListPageState extends State<RequestsListPage> {
);
},
);
} else if (snapshot.requestDetailList?.data?.isEmpty ?? true) {
return const NoDataFound().center;
} else {
return RequestPaginatedListview(snapshot.requestDetailList?.data ?? <Data>[], snapshot.isDetailLoading, snapshot.requestDetailList?.totalRows ?? 0, _scrollController);
}

@ -1,8 +1,6 @@
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/controllers/providers/api/comments_provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/api_routes/urls.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';
@ -11,24 +9,15 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/enums/work_order_next_step.dart';
import 'package:test_sa/models/helper_data_models/asset_retired/asset_retired_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart';
import 'package:test_sa/models/new_models/work_order_detail_model.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/user.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/request_detail_provider.dart';
import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/service_request_latest/views/components/initial_visit_card.dart';
import 'package:test_sa/service_request_latest/views/components/timer_widget.dart';
import 'package:test_sa/service_request_latest/views/forms/asset_retired/asset_retired.dart';
import 'package:test_sa/service_request_latest/views/nurse/create_new_request_view.dart';
import 'package:test_sa/views/pages/user/requests/comments_bottom_sheet.dart';
import 'package:test_sa/views/pages/user/requests/update_service_request_page.dart';
import 'package:test_sa/views/widgets/images/files_list.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/sound/sound_player.dart';
@ -210,12 +199,12 @@ class WorkOrderDetailView extends StatelessWidget {
if (workOrder.workOrderAttachments.isNotEmpty ?? false) ...[
8.height,
const Divider().defaultStyle(context),
FilesList(images: workOrder.workOrderAttachments),
FilesList(images: workOrder.workOrderAttachments.map((toElement) => URLs.getFileUrl(toElement.name!)!).toList()),
],
if (workOrder.voiceNote?.isNotEmpty ?? false) ...[
const Divider().defaultStyle(context),
16.height,
ASoundPlayer(audio: workOrder.voiceNote!),
ASoundPlayer(audio: URLs.getFileUrl(workOrder.voiceNote!)!),
8.height,
],
],

Loading…
Cancel
Save